WYZ replayer ROM dudas

By nataliapc

Resident (55)

nataliapc's picture

25-02-2017, 20:03

Jeeeeeelou evribody Wink

Después de varios días sin conseguir resultados me he decidido a postear en el foro por si alguien pudiera darme una ayudita con varias dudas sobre el replayer de WYZ.

Estoy usando este que entiendo que es la versión para ROMs (estoy montando una ROM 32kb) y que este replayer no se automodifica y por tanto NO debo copiarlo en RAM:
https://github.com/AugustoRuiz/WYZTracker/blob/master/AsmPlayer/WYZPROPLAY47cMSX.ASM

He estado buscando info sobre como usarlo pero no he tenido demasiada suerte, así que voy a poner la forma en que lo estoy haciendo y ya me decís si estoy equivocada en algo:

  • Primero de todo inicializo el replayer llamando a PLAYER_OFF
  • Luego me engancho al ISR desde donde llamo a INICIO en cada interrupción.
  • Ya más adelante inicio una cancion llamando a CARGA_CANCION (cargando en A el número de canción $0)
  • Para parar la canción debería de llamar a PLAYER_OFF de nuevo.

Pues el caso es que no consigo que suene nada... es correcta la forma en que estoy usando el replayer?
Cualquier ayuda será bienvenida :)

Pongo aquí abajo también las tablas generadas de exportar el MUS por si sirven de orientación:

; Tabla de canciones
TABLA_SONG:
	.DW _mus_ping, _mus_ping2	;punteros a las canciones

; Tabla de instrumentos
TABLA_PAUTAS:
	.DW PAUTA_0

; Tabla de efectos
TABLA_SONIDOS:
	.DW 0

;Pautas (instrumentos)
PAUTA_0:
	.DB	43,0,10,0,9,0,8,0,7,0,6,0,5,0,4,0,3,0,2,0,1,0,0,0,129

;Frecuencias para las notas
DATOS_NOTAS:
	.DW 0,0
	.DW 1711,1614,1524,1438,1358,1281,1210,1142,1078,1017
	.DW 960,906,855,807,762,719,679,64.... (etc etc)
Login or register to post comments

By AxelStone

Prophet (2674)

AxelStone's picture

25-02-2017, 20:45

Bienvenida a la realidad Natalia, es curioso que digas eso porque ese camino también lo recorrimos en su momento, a eso me refiero con "dificultades para usar drivers" en tu otro hilo. Nosotros por el ejemplo el de MoonBlaster se nos colgaba y el de ayFX no sonaba nada, como te pasa a tí.

Un driver debe ser caja negra, de usar sin complicaciones, algo así como los drivers que se hacen para BASIC que con un simple BLOAD se aloja en memoria y a usarse. De ahí que estemos intentando hacer los drivers desde 0 en MSX-C, para evitar estos problemas.

Por lo poco que puedo ayudarte al respecto, ¿no sería mejor probar primero el de RAM? Cuando le tengas cogido el punto intenta usar el de ROM para tu juego.

Suerte, ya nos cuentas.

By DarkSchneider

Paladin (861)

DarkSchneider's picture

26-02-2017, 11:10

Empieza siempre por lo sencillo, olvida el ISR en las 1as fases. Crea un bucle infinito (detectando pulsación de tecla para salir por ejemplo) y dentro pones el INICIO y luego esperas por el JIFFY. Algo tipo:

BOOL run = TRUE;
unsigned int jiffy;
while(run) {
jiffy = JIFFY;
// si tecla run = FALSE;
INICIO();
while(jiffy == JIFFY) ;
}

Una vez consigas que te suene, ya se pondrá en el ISR.

Por otra parte, como cargas la canción en A usando C? En C el problema es que no sabes siel código quese genera al compilar va a modificar según que registros, por eso hay que hacerlo todo con símbolos y parámetros.
Si usas llamadas a funciones para pasarlo como parámetro, pues el SDCC creo recordar que los pasa todos en la pila, nousa los registros. Se necesitarían unas funciones wrapper hechas en ASM que serían las que se llamarían desde C, que extrajeran los parámetros de la pila y los pusiera en los registros tal y como lo esperan las funciones del driver.

By nataliapc

Resident (55)

nataliapc's picture

26-02-2017, 11:56

Hola @DarkSchneider, así es... para las pruebas estoy montándolo fuera del ISR para reducir todo lo que pueda interaccionar negativamente con la reproducción.

Para lo de cargar en C el registro A, tengo exactamente lo que dices: unas funciones que funcionan en plan wrapper para las rutinas del WYZplayer y en ellas, en ASM (__asm), rescato los parámetros usando IX, lo cargo en A y llamo a CARGA_CANCION (que lo he puesto como .globl):

void play_music(unsigned char songNumr) __naked {
	songNum;
	__asm
		push ix
		ld ix,#0
		add ix,sp
		PUSH_ALL		;macro que guarda todos los registros
		ld a, 4(ix)		;cargamos en A el parametro de C
		di
		call CARGA_CANCION		;definido en WYZplayer
		ei
		POP_ALL		;macro que restaura todos los registros
		pop ix
		ret
	__endasm;
}

que luego se traduciría al compilar en:

_play_music_start::
_play_music:
;libs/wyzplay.c:61: __endasm;
        push ix 
        ld ix,#0 
        add ix,sp
        push af 
        push bc 
        push de 
        push hl 
        push iy
        ld a, 4(ix)
        di
        call CARGA_CANCION	
        ei
        pop iy 
        pop hl 
        pop de 
        pop bc 
        pop af
        pop ix 
        ret
_play_music_end::

By DarkSchneider

Paladin (861)

DarkSchneider's picture

26-02-2017, 13:43

Entiendo que ese 4(ix) equivale a (ix+4) en el inline asm de SDCC.

Para reducir mas la fuente de fallos, carga los datos de test manualmente, un simple ld a, 0 si es 0 lo que se pretende que tenga. Con esto de la posición de pila y el tipo de Endian de la CPU (Z80 es Little creo) a veces salen fallos tontos del tipo que no se lee lo que se quiere. Supuestamente en SP+2 estaría PC y en SP+4 el dato, pero por reducir que no sea.

By nataliapc

Resident (55)

nataliapc's picture

26-02-2017, 22:19

Pues nada... solucionado... Cool
Pongo la solución por si a alguien más le ocurre alguna vez.

Era cuestión de inicializar los buffers de los canales tal como pone aquí:
https://sites.google.com/site/wyzplayer/downloads/Prueba_MSX.asm?attredirects=0&d=1

Hay que añadir lo siguiente al inicializar el replayer:

                ; CODIGO SDCC/SDASZ80

                LD      HL,#0xDE00
                LD      (CANAL_A),HL
                				
                LD      HL,#0xDE20        	
                LD      (CANAL_B),HL       	
            
                LD      HL,#0xDE40       	
                LD      (CANAL_C),HL 

                LD      HL,#0xDE60       	
                LD      (CANAL_P),HL 

Gracias a todos!! :D