Esa es la parte más jodida del VDP, a ver si consigo explicarme...
El VDP tiene 2 puertos de acceso, el puerto de datos ($98) y el puerto de direcciones ($99). Normalmente todas las operaciones con el puerto de datos van precedidas de una inicialización previa mediante el puerto de direcciones, en la que se le indica a partir de que dirección de la VRAM se va a escribir o leer (vease SETWRT o SETRD). Pues bien, si examinamos cualquiera de estas dos rutinas, por ejemplo SETWRT, encontramos lo siguiente :
ld a,l
di
out ($99),a
ld a,h
and $3F
or $40
out ($99),a
ei
ret
Vemos que se han desactivado las interrupciones durante los dos accesos a dicho puerto. Esto es necesario hacerlo ya que cuando se le inicializa el puntero de escritura o lectura, se hace mediante dos accesos, primero se le pasa el LSB y luego el MSB (con determinados flags añadidos para indicar lectura o escritura).
El VDP al recibir el LSB, sabe que es la primera mitad de una dirección; así que pone un flag interno a 1 para indicar que está esperando la otra mitad y que el siguiente byte que le llegue va a ser su media naranja. Cuando el MSB llega, se construye la dirección completa y se pone ese flag interno a 0, la operación ha finalizado. El problema es que cualquier otra lectura del puerto de direcciones ($99) o cualquier acceso sobre el puerto de datos ($98) también ponen ese flag a 0, por lo que si entre el LSB y el MSB dejamos que se nos cuele cualquiera de estas dos operaciones, se fastidiará el "SETWRT" o el "SETRD", no se habrá construido correctamente el puntero a la VRAM y lo que conseguiremos es basura en pantalla.
Así pues,
entre dos accesos al puerto de direcciones no se puede hacer ninguna otra operación con el VDP. Claro, diremos; ¿pero para que he de desactivar las interrupciones?; pues para nada, no hace falta, basta con asegurarse que
entre los accesos a $99 no se hace otra cosa con el VDP y que
en tu interrupción al VDP ni olerlo.
En la BIOS es necesario ya que en cada interrupción se lee el registro de estado del VDP, lo que jodería inmediatamente cualquier operación con el VDP.
Vamos, que lo normal es que una rutina de reproducción de audio no toque para nada el VDP, por lo que es totalmente compatible con las rutinas de acceso rápidas al VDP. Y si por alguna desgraciada razón te ves obligado a desactivarlas; pues no pasa nada; pero procura hacerlo el menor tiempo posible. El reproductor seguirá sonando igual ya que sólo hay que proteger los accesos a $99, no a $98 (también hay problemas con los accesos rápidos a $98; pero esa es otra historia)
Esto me sugiere una pregunta, ¿de igual manera que el EI se puede atrasar una instrucción, se podría adelantar el DI?, quedando algo así :
ld a,l
out ($99),a
di
ld a,h
and $3F
or $40
ei
out ($99),a
ret
¿Habría tiempo entre el OUT y el DI a que se colara alguna interrupción?
Ala, otro tocho infumable más para la colección