LCNES

Learning C/C++ with the NES

8/03/09 Hoy he implementado un montón de instrucciones. Están casi todas las instrucciones de carga, guardado, registro a registro, etc… He simplificado un montón de ellas para que tomen argumentos, aunque aún me queda mucho por hacer. Quería hacer constar una serie de posibles problemas:

- Los offset con/sin signo debo contemplarlos, ya que puede haber un offset a posiciones anteriores de memoria. No siempre tienen por qué ser positivos.
- Debo investigar las instrucciones que ponen "WORD" porque no sé qué significan ni qué se supone que deben hacer.

Como deberes vuelvo a tener lo ya dicho el día anterior, que repito y añado alguna cosa más:

- Terminar de limpiar código de instrucciones, añadir todas las que faltan como primera prioridad.
- Como prioridad a largo plazo, desarrollar el "Virtual Grid" otra vez.
- Ajustar y poner en orden la "Instrucción Actual" y la "Siguiente Instrucción" porque parece que no queda claro.
- "Traducir" las instrucciones desde hexadecimal a cosas que se entiendan, ya que necesito poder leer rápidamente lo que pone en cada posición de memoria. Cuando haya terminado con las instrucciones, debería ser capaz de hacer esto rápidamente.

7/03/09 Después de mucho tiempo sin actualizar el Wiki, voy a subir una nueva versión de este emulador de pruebas que estoy haciendo. He aprendido mucho en este tiempo, y también he avanzado bastante. Me he dado cuenta de la importancia que tiene subir las cosas porque he estado a punto de perderlo todo en un ejercicio de movimiento de datos. Agradezco a Jaime el que haya podido recuperar el código fuente, todo excepto la "Virtual Grid" que ya tenía a medio hacer. Por suerte, lo gordo se salvó. Aquí pongo una foto nueva de cómo está ahora mismo el emulador. Cosas nuevas a tener en cuenta desde la versión anterior:

- Muchas más instrucciones añadidas.
- Instrucciones simplificadas y unificadas. En lugar de ser instrucciones múltiples toman argumentos para funciones parecidas.
- Instrucción inicial de carga de ROM mejorada, ahora el emulador "sabe" dónde empezar a emular para algunas ROMs. Sin embargo, esto no funciona con todas. Además, hay muchas instrucciones no implementadas que no me permiten hacer un seguimiento exhaustivo de su funcionamiento. Debo trabajar más en ellas. Ahora todas empiezan a parecerse. Son Zero Page, accesos a memoria, etc… y me permite reutilizar el código que ya he escrito para otras funciones. Pronto tendré esa parte de la CPU del emulador lista.
- Cambios en la interfaz gráfica, desde mejoras en la disposición de las memorias hasta registros y una caja de "avisos" o informativos.

Por hacer:

- Terminar de limpiar código de instrucciones, añadir todas las que faltan como primera prioridad.
- Como prioridad a largo plazo, desarrollar el "Virtual Grid" otra vez.
- Ajustar y poner en orden la "Instrucción Actual" y la "Siguiente Instrucción" porque parece que no queda claro.

En la foto aparecen muchas cosas. Su explicación queda relegada a otras actualizaciones.

LCNES%20v0.006.png

4/12/08 Por fin, una pequeña actualización, después de 2 semanas de poco quehacer (en cuanto al emulador, claro está). He conseguido "conectar" la interfaz gráfica con la parte emulada de la CPU 6502, aunque la unión es un tanto chapucera. Ya iremos puliendo esto. Además, al marcar Load ROM, carga el ROM en memoria y lo muestra por la pantalla, en sus correspondientes cajas (más o menos). El resto de la funcionalidad a este respecto casi se añade sola, pero aún tengo mucho trabajo por hacer. Un par de fotillos más para la colección.

wxGUI05.png
wxGUI04.png

16/11/08 La interfaz sigue mejorando. Como es de suponer, todavía no está "conectada" al emulador, porque estoy puliendo algunos problemillas si importancia. Además, tengo que conectar los botones de los flags de estado y el registro de estado. También tengo que "conectar" las posiciones de memoria con los valores que muestra la tabla. Esto me llevará algún tiempo de aprender, pero después de eso lo demás irá más rodado, porque me será más sencillo llevar el control de lo que hago. Abajo hay una última foto de los avances. Lo del tamaño de los wxGrid no está solucionado, porque uno normal me sirve para varias cosas de tamaño pequeño, como por ejemplo el control de registros. La clave para tablas grandes parece estar en la función SetTable(), que no funciona "a lo bruto", sino con un puntero wxGridTableBase. Tengo que ver cómo funciona esto, pero no corre especial prisa, por ahora.

wxGUI03.png

15/11/08 He mejorado la interfaz del emulador, con una especie de tablas Excel donde se pueden ver las posiciones de memoria y lo que contienen. Faltan los registros y algunas cosas más, pero me voy familiarizando con las librerías. Tengo que ver cómo arreglar lo de los wxGrid, que se bloquean si hago un grid demasiado grande. La cosa ha quedado así:

wxGUI02.png

8/11/08: He estado trabajando en una interfaz wxWidgets para el emulador. Empieza a ser muy difícil llevar el control de los registros sin algo más visual. Me descargué el pack para Windows y con algo de Dios y algo de ayuda conseguí finalmente compilar la fuente y ponerme a trabajar con ello. Sus buenas horas me ha costado. Está escrito totalmente en C++, así que habrá que desempolvar los conceptos de OOP para llegar a buen puerto.

Por cierto, que hacer una interfaz con esto está chupado, si lo comparamos con trabajar con Win32 y el resto de la parafernalia de la API de Windows. Con cuatro clases y dos comandos simples, he llegado a lo siguiente:

wxGUI01.png

Está absolutamente incompleto, pero hay que tener en cuenta que es el resultado de 30 minutos de aprendizaje y experimentación mirando la documentación. Pensar que construirla originalmente lleva sus buenas horas… En fin, todo va por buen camino. Debo seguir adelante con la GUI, y cuando la tenga bien conectada con el núcleo del programa, continuaré con la 6502 propiamente dicha.

6/11/08: He intentado meter instrucciones de PUSH/PULL en la pila, pero no entiendo bien qué posiciones de memoria debe guardar. He hecho pinitos con wxWidgets, sin éxito. El compilador de la escuela no parece estar contento con las librerías. Por cierto, que Code:Blocks con el compilador GCC me genera archivos de ~400KB, mientras que el entorno Visual C++ con el compilador de Windows los hace de 8KB, para un programa de solamente 150 líneas. No se entiende muy bien.

He implementado además las instrucciones setZeroFlag y setSignFlag para modificar el Registo de Estado en las instrucciones que lo necesiten. Ahora mismo uso IFs, pero hay un par de maneras más de hacerlo sin ellos. Cuando profundice un poco más lo cambiaré. Por ahora lo dejo estar.

"Homework":
* Hacer una GUI con wxWidgets para poder ver los registros de estado. Se hace difícil llevar el control con la consola.
* Modificar instrucciones de Zero y Signo para que sean más óptimas. No corre prisa.
* Implementación del Header de la ROM, que especifica nº de tablas de PRGROM y otras cosas.

  • Seguir añadiendo instrucciones hasta desfallecer.

4/11/08: Implementa algunas instrucciones más, concretamente las de control de CPU, como son las clear y set de algunos bits del registro de estado.

CPU Control

18 CLC Clear carry flag C=0
58 CLI Clear interrupt disable bit I=0
D8 CLD Clear decimal mode D=0
B8 CLV Clear overflow flag V=0
38 SEC Set carry flag C=1
78 SEI Set interrupt disable bit I=1
F8 SED Set decimal mode D=1

La instrucción 0x20 en teoría funciona, porque salta bien a donde tiene que saltar y guarda el PC. Las instrucciones de carga que modifican el flag carry y/o el flag de cero no tienen esta funcionalidad todavía. Deben comprobarlo y hacer el set en consecuencia. Estos condicionales if pueden ralentizar el programa porque se hacen muchas veces.

"Homework":
* Hacer una GUI con wxWidgets para poder ver los registros de estado. Se hace difícil llevar el control con la consola.
* Implementación del Header de la ROM, que especifica nº de tablas de PRGROM y otras cosas.

  • Seguir añadiendo instrucciones hasta desfallecer.

3/11/08: Avanzo un poco en el emulador. Implementa 3 instrucciones, pero cuesta entender qué está haciendo realmente la CPU con el ROM. Carga cosas en Acumulador, las pasa a memoria, y luego hace un salto a la dirección 76 y no sé qué hace. Tal vez estando más depejado lo entienda.

Mejoras Inmediatas:

* Comentarios de Registros/Posiciones de Memoria - Aclaran lo que está pasando DESECHADA
* Implementación de la Instrucción 0x20 - Salto con guardado de estado en la pila.

  • Implementación del Header de la ROM, que especifica nº de tablas de PRGROM y otras cosas.

2/11/08: Web experimental. Quiero saber si puedo programar un emulador para la NES, y aprender C en el proceso.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License