Esto está inspirado en el desafío Intel 8086 que también está aquí, pero pensé que un desafío 6502 también sería interesante.
El reto
Pensé que sería divertido ver los resultados. Este es obviamente hacia el lado más avanzado del espectro. El desafío es escribir su propio emulador de CPU 6502. Esto implica, por supuesto, comprender su conjunto de instrucciones y su formato de codificación. Los recursos están vinculados al final de esto. El 6502 es uno de los procesadores del mundo real más fáciles de emular. Para los propósitos de este desafío, no tendrá que preocuparse por la sincronización del ciclo si no lo desea, ¡pero eso siempre es una ventaja para incluir!
¡NO COPIE EL CÓDIGO DE NADIE MÁS! Por supuesto, puedes echar un vistazo a otros emuladores para que te ayuden a entender, ¡pero no copiar y pegar! :)
Una vez que su código funciona, siempre puede hacer un esfuerzo adicional si lo desea y convertirlo en un emulador de Apple II, o NES, C64, VIC-20 o cualquiera de los otros miles de millones de sistemas antiguos basados en 6502 de la época.
Probar tu emulador
He compilado una suite de prueba 6502 donde encontré el código fuente aquí: http://code.google.com/p/hmc-6502/source/browse/trunk/emu/testvectors/AllSuiteA.asm
Mi versión compilada se puede descargar aquí: http://rubbermallet.org/AllSuiteA.zip
Cargue el binario de 48 KB en el espacio de memoria de su emulador a $ 4000, lo que deja 16 KB de RAM de lectura y escritura debajo. Cuando la prueba haya terminado de ejecutarse, el valor en la dirección $ 0210 debería ser $ FF, si su CPU pasó. Sabrá que la prueba finaliza cuando el contador del programa (PC) haya alcanzado la dirección $ 45C0.
También hay otras pruebas disponibles aquí: http://visual6502.org/wiki/index.php?title=6502TestPrograms
Haciendo algo más interactivo con él
Una vez que su CPU funciona, ¡probablemente querrá hacer algo más divertido que mirar la salida de prueba! Compilé una imagen ROM de Enhanced BASIC para el 6502. Tiene 16 KB, por lo que debe cargarlo en $ C000 de su espacio de memoria emulado, restablecer su 6502 virtual y comenzar la ejecución.
Descargue este ZIP, que contiene ehbasic.bin: http://rubbermallet.org/ehbasic.zip
La forma en que EhBASIC maneja la entrada / salida es muy simple. Cuando quiere escribir un personaje en la consola, escribe el byte en la ubicación de memoria $ F001. Entonces, cuando su emulador vea el 6502 intente escribir en esa ubicación, simplemente imprima el valor de ese carácter en la consola con un printf ("% c", valor); o como más te guste. (Este desafío no se limita a C, por supuesto)
Cuando sondea el ingreso de un personaje desde la consola, es bastante similar. Sigue leyendo desde la ubicación de memoria $ F004, donde debe tener el siguiente valor de caracteres ASCII del teclado esperando a ser leído. Si no hay más entradas para leer, debería devolver un valor de cero.
EhBASIC sondea el valor en esa ubicación hasta que no sea cero, lo que le permite saber que el byte es una entrada de teclado válida. Es por eso que si no hay más entradas para leer, el emulador debería devolver cero allí. EhBASIC girará en él hasta la siguiente clave válida cuando esté buscando entrada.
Si no borra ese valor a cero después de leer el último valor clave, hará que se repita como si estuviera presionando la tecla, ¡así que tenga cuidado de hacerlo correctamente!
Si su emulador funciona correctamente, esto es lo que verá impreso en su consola cuando ejecute la imagen ROM:
6502 EhBASIC [C]old/[W]arm ?
Presione C, luego presione enter y debería ver:
Memory size ?
31999 Bytes free
Enhanced BASIC 2.22
Ready
Los bytes libres pueden ser diferentes para usted, pero en mi emulador limité el área de memoria de escritura a un límite de 32 KB. Realmente podría llegar hasta donde comienza la ROM, que es la marca de 48 KB.
6502 enlaces de recursos de CPU
Aquí hay algunos recursos que deberían brindarle suficiente información para trabajar:
http://www.obelisk.demon.co.uk/6502/instructions.html
http://www.e-tradition.net/bytes/6502/6502_instruction_set.html
http://www.llx.com/~nparker/a2/opcodes.html <- este tiene información muy interesante
http://en.wikipedia.org/wiki/MOS_Technology_6502
Si tiene preguntas o necesita más información técnica, no dude en preguntarme. También hay una enorme riqueza de otra información 6502 en la web. ¡Google es tu amigo!
fuente
Respuestas:
Pensé en seguir adelante y publicar mi propia implementación. Está COMPLETAMENTE sin golf, pero es una implementación completa.
fuente
Un emulador MOS 6502 en Haskell. Las características incluyen:
Esta es una versión algo desarrollada de una implementación completa (con más características) que hice para este desafío que publicaré más adelante. A pesar del golf, el código sigue siendo sencillo. La única característica que falta es el modo BCD (próximamente ...)
Ejecuta el código ehBASIC:
Y el código, con menos de 300 líneas en total:
fuente
Para cualquier persona interesada, pensé en compartir mi implementación del 6502 en C #. Al igual que con otras publicaciones aquí, no tiene nada de golf, pero es una implementación completa de la característica.
Comencé este proyecto creando una hoja de cálculo de instrucciones cuando estaba aprendiendo acerca de la CPU. Me di cuenta de que podía usar esta hoja de cálculo para ahorrarme algo de escritura. Convertí esto en una tabla de archivos de texto que el emulador carga para ayudar a contar los ciclos y para una salida de desmontaje fácil.
Todo el proyecto está disponible en Github https://github.com/amensch/e6502
fuente