domingo, 30 de mayo de 2010

Sincronizando!

Un punto importante un cualquier programa donde se reproduzca música, es que esta se escuche siguiendo sus tiempos, si no el resultado podría ser algo desagradable... :P

Para conseguir esto, necesitamos sincronizar la ejecución de nuestro programa y en MSX se utilizan las interrupciones del Z80.

He investigado un poco el tema, y he encontrado unas funciones en la web de Avelino (interrupt.s), pensadas para cuando se trabaja en MSX-DOS. Estas se puede adaptar para el caso de trabajar en formato ROM, con la solución dada por SapphiRe (FD9APATCH.ASM), en los foros de desarrollo de Karoshi. Todavía no lo he probado, ya que he dado con una solución más propicia para la forma en la que esta programado el PSGed.

Al principio utilicé una función de Andrear llamada wait_retrace:
   di
$3:
   in a,(0x99)
   and #0x80
   cp #0x00
   jr z, $3
   ei
Esta espera a que finalice el redibujado de la pantalla, para dejar continuar el flujo de ejecución. Haciendo pruebas, vi que en los emuladores y en el onechip, funcionaba perfectamente, pero al probarlo en un MSX real, al reproducir una secuencia, no se escuchaba correctamente.

Estudiando el articulo de SapphiRe, descubrí una instrucción del z80 (no se mucho de assembler), que podía servirme en sustitución de la función wait_retrace, me refiero a la instrucción "halt". Esta pone en espera la ejecución hasta que se dispara una interrupción. Así que me puse manos a la obra. Primero definí una función en assembler con esta instrucción:
#define HALT __asm halt __endasm
y luego lo coloqué en el inicio del bucle que controla el play y la interfaz gráfica de la pantalla principal.
while(1)
{
   HALT;

   //resto del codigo
}
Lo he probado en un MSX y ha funcionado perfectamente! :)

No hay comentarios:

Publicar un comentario