HispaMSX

Re:[hispamsx] VDP

2001-08-14 09:07:43
 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. 



<Anterior en la conversación] Conversación actual [Siguiente en la conversación>