2008-09-21 38 views
17

Es el fin de semana, así que me relajo de pasar toda la programación de la semana escribiendo un proyecto de hobby.Emulación de CPU 6502

Escribí el marco de un emulador de CPU MOS 6502 ayer, los registros, la pila, la memoria y todos los códigos de operación se implementan. (Enlace a la fuente a continuación)

Puedo ejecutar manualmente una serie de operaciones en el depurador que escribí, pero me gustaría cargar una rom NES y simplemente apuntar el contador del programa a sus instrucciones, pensé que esto sería la forma más rápida de encontrar códigos de operación defectuosos.

Escribí un rápido cargador de rom NES y cargué los bancos de ROM en la memoria de la CPU.

El problema es que no sé cómo están codificados los códigos de operación. Sé que los propios códigos de operación siguen un patrón de un byte por código de operación que identifica el código de operación,

0 - BRK 
1 - ORA (D,X) 
2 - COP b 

etc

Sin embargo no estoy seguro de donde se supone que debo encontrar el argumento de código de operación. ¿Es el byte que sigue directamente? En memoria absoluta, supongo que podría no ser un byte, sino un corto.

¿Alguien está familiarizado con el modelo de memoria de esta CPU?

EDIT: me doy cuenta de que esto probablemente se disparó en la oscuridad, pero esperaba que hubiera algunos hackers Apple y Commodore de la vieja escuela al acecho aquí.

EDIT: Gracias por su ayuda a todos. Después de implementar los cambios adecuados para alinear cada operación, la CPU puede cargar y ejecutar Mario Brothers. No sirve de nada, pero bucle de espera para el inicio, pero es una buena señal :)

he subido la fuente:

http://www.codeplex.com/Cpu6502/SourceControl/DirectoryView.aspx?SourcePath=&changeSetId=1810

Si alguien alguna vez se ha preguntado cómo funciona un emulador, es bastante fácil seguir. No optimizado en lo más mínimo, pero de nuevo, estoy emulando una CPU que funciona a 2 MHz en una máquina de 2,4 GHz :)

+0

Hey, yo soy más o menos en su misma situación (en el momento de la publicación) Me gustaría para verificar su código, pero el enlace parece estar roto. ¿Aun lo tienes? – Petruza

Respuesta

12

El código de operación toma un byte, y los operandos están en los siguientes bytes. Consulte la columna de tamaño de bytes here, por ejemplo.

+0

Entonces, ¿tendré que modificar cada código de operación para que sepa qué tan lejos mirar hacia adelante desde la PC para obtener sus argumentos? – FlySwat

+0

Tendrás que mantener una mesa en alguna parte, sí. Aunque nunca será más de tres bytes. O simplemente conecte el código en el código que hace el trabajo de cada instrucción. – moonshadow

+1

De hecho tengo ese libro. –

1

Este libro puede ayudar a: http://www.atariarchives.org/mlb/

Además, trate de instruir cualquier otra aseembler 6502/simulador/depurador para ver cómo se codifica Assembly como Machine Language.

3

Si nos fijamos en referencias como http://www.atarimax.com/jindroush.atari.org/aopc.html, verá que cada código de operación tiene una codificación especificada como:

HEX LEN TIM 

el hexágono es su código de operación de 1 byte. Inmediatamente después son bytes LEN de su argumento. Consulte la referencia para ver cuáles son esos argumentos. Los datos TIM son importantes para los emuladores: es la cantidad de ciclos de reloj que esta instrucción tarda en ejecutarse. Necesitarás esto para corregir tu tiempo.

Estos valores (LEN, TIM) no están codificados en el código de operación en sí. Necesita almacenar esta información en su cargador/ejecutable de programa. Es solo una gran tabla de búsqueda.O puede definir un mini-lenguaje para codificar los datos y el lector.

+0

No creo que LEN ni TIM estén codificados, creo que debes proporcionar eso. Ya lo hice con el tiempo, cada código de operación es consciente de cuántos ciclos se supone que debe tomar. – FlySwat

+1

En realidad son en muchos casos. Para todos los códigos de operación con un argumento, los bits [4: 2] del código de operación definen una codificación de 3 bits del modo de direccionamiento. He encontrado que es consistente: 0 = INDIRECTO X, 1 = PAGINA CERO, 2 = INMEDIATO (a veces ACUMULADOR), 3 = ABSOLUTO, 4 = INDIRECTO Y, 5 = PAGINA CERO X, 6 = ABSOLUTO Y, 7 = ABSOLUTO X –

1

Los manuales 6502 se encuentran en la Web, en varios sitios históricos. El KIM-1 enviado con ellos. Tal vez más en ellos de lo que necesitas saber.

0

La roms II de Apple incluía un ensamblador, creo que así se llamaba, y le mostraría en un buen formato los códigos de operación hexadecimales y el código de operación de 3 caracteres y los operandos.

Así que, dada la poca memoria disponible, lograron meter en el recuento de bytes de operandos (siempre 0, 1 o 2) el código de operación de 3 caracteres para todo el conjunto de instrucciones 6502 en un espacio realmente pequeño, porque realmente no hay mucho de eso.

Si se puede sacar una ROM de Apple II, sólo puede cortar y pegar desde allí ...

Cuestiones relacionadas