4 de octubre de 2012

Aprendiendo a programar un Emulador (DCPU-16) -2

Bueno, como se puede ver en la captura, ya tengo montado una CPU en su estado más básico.

El mainloop funciona correctamente, aunque para DEBUGGEAR bien controlo el bucle con una pausa en espera de tecla... así voy viendo COMO está leyendo la RAM y si los registros y tal se actualizan como corresponden...

He implementado los registros, y tengo también una rutina que muestra el estado de RAM y VIDEO-RAM.

He introducido también en la RAM el código de un "Hello World", para ir comprobando que interpreto bien las instrucciones (esto ya lo tengo)... y hacer los cálculos/operaciones/lo que sea de dichas instrucciones (en lo que estoy).

Para el tema de sincronizar el vídeo me quiero basar en la info que se muestra aquí. (Es más/menos lo que comentaba @jepalza en un post) ;)

Pego el texto que me interesa del link aqui:

Con el fin de emular estas tareas deberás ejecutarlas tras el número apropiado de ciclos de CPU. Por ejemplo, si la CPU se supone que corre a 2.5Mhz y el display usa una frecuencia de refresco de 50Hz (estándar para el vídeo PAL), entonces la interrupción VBlank ocurrirá cada:

2500000/50 = 50000 ciclos de CPU

Si asumimos que la pantalla entera (incluyendo VBlank) es de 256 scanlines de alto y 212 de ellas son mostradas en el display (las otras 44 caen en el VBlank), entonces obtenemos que nuestra emulación debe refrescar un scanline cada:

50000/256 ~= 195 ciclos de CPU

Tras eso, debemos generar una interrupción VBlank y no hacer nada hasta que se haya acabado con el VBlank, es decir, durante:

(256-212)*50000/256 = 44*50000/256 ~= 8594 ciclos de CPU

Calcula cuidadosamente el número de ciclos de reloj necesarios para cada tarea, y entonces utiliza el divisor común mayor para InterruptPeriod, ajustando todas las otras tareas a él (no tienen porqué ejecutarse en cada expiración del contador Counter).

Las especificaciones de DCPU-16 difieren de las que se muestran en este ejemplo, así me tocará adaptarlas. ;)

OPS! Acabo de descubrir un pedazo de bug.... estoy cruzando el byte alto / byte bajo cuando leyo una posicion de RAM. Vaya cag*da!!! :P

*Solucionado!!! :D

No hay comentarios: