Pregunta

Es fin de semana, así que me relajo de pasar toda la semana programando escribiendo un proyecto de hobby.

Ayer escribí el marco de un emulador de CPU MOS 6502, los registros, la pila, la memoria y todos los códigos de operación están implementados.(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. Pensé que esta sería la forma más rápida de encontrar códigos de operación defectuosos.

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

El problema es que no sé cómo se codifican 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 de forma ú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 le sigue directamente?En memoria absoluta, supongo que puede que no sea un byte sino 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 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 hace nada más que esperar el inicio, pero es una buena señal :)

Subí la fuente:

https://archive.codeplex.com/?p=cpu6502

Si alguien alguna vez se ha preguntado cómo funciona un emulador, es bastante fácil de seguir.No está 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 :)

¿Fue útil?

Solución

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

Otros consejos

Si buscas 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 su código de operación de 1 byte.Inmediatamente después están LEN bytes de su argumento.Consulte la referencia para ver cuáles son esos argumentos.Los datos TIM son importantes para los emuladores: es el número de ciclos de reloj que tarda esta instrucción en ejecutarse.Necesitará esto para corregir el tiempo.

Estos valores (LEN, TIM) no están codificados en el propio código de operación.Necesita almacenar estos datos en el cargador/ejecutor de su programa.Es solo una gran tabla de búsqueda.O puede definir un minilenguaje para codificar los datos y el lector.

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

Además, intente examinar cualquier otro ensamblador/simulador/depurador 6502 que exista para ver cómo se codifica el ensamblador como lenguaje de máquina.

Los manuales del 6502 están en la Web, en varios sitios de historia.El KIM-1 se envió con ellos.Quizás en ellos haya más de lo que necesitas saber.

Las roms de Apple II incluían un desensamblador, creo que así se llamaba, y te mostraba en un buen formato los códigos de operación hexadecimales y el código de operación de 3 caracteres y los operandos.

Entonces, dada la poca memoria disponible, lograron colocar en el recuento de bytes del operando (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 en realidad no hay mucho.

Si puedes desenterrar una rom de Apple II, puedes simplemente cortar y pegar desde allí...

El 6502 tiene diferentes modos de direccionamiento, la misma instrucción tiene varios códigos de operación diferentes dependiendo de su modo de direccionamiento.Eche un vistazo a los siguientes enlaces que describen las diferentes formas en que un 6502 puede recuperar datos de la memoria o directamente de la ROM.

http://obelisco.me.uk/6502/addressing.html#IMM

Esto es mejor: matriz del conjunto de instrucciones 6502:

https://www.masswerk.at/6502/6502_instruction_set.html

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top