Hola!
Sobre lo del VDP:
* El Technical Handbook recomienda deshabilitar las interrupciones
antes de leer un registro de estado, pero no dice nada sobre las
interrupciones al escribir en un registro de control. ¿Es necesario
deshabilitarlas? He hecho algunas pruebas sin deshabilitarlas (al
escribir en registros de control) y funciona correctamente, pero igual
es la suerte del principiante.
En efecto, es suerte del principiante.
No es que haya que deshabilitar las INTs, es que hay que ASEGURARSE de que
entre los 2 OUTs que haces para escribir en un reg. del VDP, no se produzca una
INT, porque en la INT, se suele acceder al VDP también, y podría pillarte en
medio de los 2 OUT.
Así pues:
(..)
LD A,(DATO)
DI
OUT (&H99),A
LD A,128+REGISTRO
OUT (&H99),A
EI
(...)
*Si vas a hacer varios OUT consecutivos, obviamente te bastara con un DI al
principio, y un EI al final.
* Cuando se ejecutan los comandos del VDP, ¿los registros de
parámetros se modifican?
Desgraciadamente SI. Decrementa los contadores de longitud, e incrementa las
coordenadas. Así que en cada comando del VDP, habrás de volver a cargar todos
los registros implicados en el comando del VDP.
Lo digo porque, por ejemplo, si se quiere dibujar un
mapa de tiles en todos los "copy" el NX y el NY serán identicos.
Ya, pero no. Mala suerte. Has de volver a indicar el NX,NY otra vez. A lo sumo
podrás suponer que la parte alta no ha variado, pero tardas menos en mandar
todo el 'churro' con un OTIR, que no ir cargando selectivamente cada registro.
* Cuando se invoca un comando del VDP deben deshabilitarse las
interrupciones ¿no?
No. Basta con que respetes la norma de desactivar las INTs entre cada 2 OUTs de
acceso a los registros.
Mientras un comando se está ejecutando, las interrupciones no le afectan.
Incluso, puedes acceder a la VRAM, sin afectar al funcionamiento del comando
del VDP.
¿Es necesario deshabilitarlas cuando se escriben
los parametros en los registros?
Solo entre cada 2 OUTs, y cuando hagas un posible OTIR.
* Para saber si ha terminado la ejecución de un comando del VDP hay
que consultar el bit CE de S#2. Así lo hice, pero el ordenador se
quedaba colgado. Luego vi que en el ejemplo del Technical Handbook,
después de consultar S#2 y esperar el fin de la ejecución del comando
consulta S#0. Haciendo esto no se cuelga. ¿Por qué ocurre esto?
Esto es muy importante. Las INTs del sistema consultan el VDP para saber la
causa de dicha INT, que puede ser:
-INT principal del VDP (50 / 60 Hz)
-INT de línea
-Otras INTs del VDP
-INTs que no son del VDP (p.e. MIDI, etc)
Pero, para compatibilizar con MSX1, el ordenador SUPONE que el registro de
estado seleccionado con el R#15 del VDP es el CERO !!
Por lo cual, si tu lo has modificado antes, y no lo has vuelto a poner a cero,
entonces, la rutina de tratamiento de interrupción de la Bios lee otro registro
de estado, en lugar del cero, y no detecta la INT del VDP como tal, así que se
queda colgado (como si se hubiesen desactivado las INTs)
Así que tienes 2 soluciones:
-Desactivar las INTs, trabajar con la rutina que lee registros de estado, y al
acabar, volver a seleccionar el registro 0 y activar las INTs
-En cada punto donde tengas que leer un registro de estado: Desactivas Ints,
seleccionas tu registro, lo lees, anotas el resultado, seleccionas el registro
0, activas las Ints, y lees el resultado anotado.
* ¿Es necesario hacer un bucle de espera hasta que finalice el comando
del VDP o se puede saber el número de ciclos que va a tardar e ir
haciendo cosas mientras tanto?
No. No hay que esperar a que un comando del VDP termine. Lo que hay que hacer
es, ANTES de ejecutar un nuevo comando del VDP, ver si el anterior ha acabado.
Así, después de lanzar un nuevo comando del VDP, puedes hacer algunos cálculos,
y no tener que esperar tanto.
Gracias!
Pa eso está la lista ésta ...
Daniel Zorita.
_____________________________________________________________________
¿Qué harías si dispusieras del doble de tiempo? Contesta en
http://www.wanadoo.es/animacion/promoverano/
y gana una cadena de música.