emulation - Emulación de CPU 6502
machine-language (5)
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 aquí , por ejemplo.
Es el fin de semana, así que me relajo de pasar toda la programación de la semana escribiendo un proyecto de pasatiempo.
Ayer escribí el marco de un emulador de CPU MOS 6502, se implementaron los registros, la pila, la memoria y todos los códigos de operación. (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 de NES y simplemente apuntar el contador del programa a sus instrucciones. Supuse que esta sería la forma más rápida de encontrar códigos de operación defectuosos.
Escribí un rápido cargador de rom de 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 códigos de operación siguen un patrón de un byte por código de operación que identifica de manera única el código de operación,
0 - BRK
1 - ORA (D,X)
2 - COP b
etc
Sin embargo, no estoy seguro de dónde se supone que debo encontrar el argumento del 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?
EDITAR: Me doy cuenta de que esto probablemente se filmó en la oscuridad, pero esperaba que hubiera algunos hackers de Apple y Commodore de la vieja escuela acechando aquí.
EDITAR: Gracias por ayudar a todos. Después de implementar los cambios adecuados para alinear cada operación, la CPU puede cargar y ejecutar Mario Brothers. No hace nada más que esperar en bucle Start, pero es una buena señal :)
Subí 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 de 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 :)
Este libro podría ayudar: http://www.atariarchives.org/mlb/
Además, intente examinar cualquier otro 6502 aseembler / simulator / debugger para ver cómo Assembly se codifica como Machine Language.
Los manuales 6502 están 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.
Si observa 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 es tu opcode 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.
Las ROMs de Apple II incluían un ensamblador desmontable, 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 el conjunto de instrucciones 6502 en un espacio realmente pequeño, porque realmente no hay mucho de eso.
Si puedes desenterrar una manzana II rom, puedes cortar y pegar desde allí ...