Eduardo Robsy writes:
Hola,
Estoy programando cosillas en ensamblador para MSX-1, y para temporizar las
cosas con más o menos precisión, recurro a esperar un número de veces al
retrazado vertical, esto es, cuando se acaba de redibujar cada pantalla (50
Hz en un sistema europeo).
Lo que pasa es que no sé muy bien en qué me falla el proceso. Tal y como lo
he hecho funciona perfectamente en un MSX de primera generación, pero se
queda en plan bucle infinito en MSX-2 y superiores.
Os paso a continuación el trozo de código en cuestión, a ver si alguien
puede orientarme para ver cómo puedo hacerlo y que se compatible con
cualquier modelo de MSX.
LD B,NUM ; Supongamos que NUM es el número de retrazados de espera
BUCLE: IN A,(&H99) ; Lee el registro de estado del VDP
AND A,&H80 ; Comprueba el bit de retrazado
JR NZ,BUCLE ; Si no está encendido, sigue esperando
DEC B ; Si hay retrazado, decrementa el contador
JR NZ,BUCLE ; Si no terminó el contador, continúa
Ya os digo: en MSX de primera generación va perfecto y temporiza de un modo
muy exacto. Pero no conozco casi nada sobre el hardware del MSX2: por favor,
Ojo! Lo primero que tienes que tener en cuenta es si las interrupciones
están activadas, ya que si no no funcionará (supongo que ya lo sabes), y
que si la BIOS lee el flag de "retrace", éste se vuelve a cero y, entonces
tu no lo podrás leer en tu bucle. Yo creo que lo más facil, es parchear el
gancho del las interrupciones (creo que era FD9A o algo así) y poner el
contador ahí. Así la BIOS siempre atrapa las interrupciones y pasa el
control a tu programa, sin perder ninguna.
Otra manera sería habilitar la RAM en la zona 0000-3FFF, y colocar el
programa de manejo de interupciones a partir de la direccion 38h.
Espero que valga de algo
Saludos
Ivan