Aprendiendo a manejar los chips de video V9958 y sonido YM-2149/YM2413

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 17:54

Último mensaje de la página anterior:

A pesar de copiar 'literalmente' en el motor de música la partes 'nuevas' que me funcionan individualmente, se niega a hacer nada -banghead
El siguiente paso que he hecho ha sido mantener el programa que lee la serie de frames ya decodificados anteriormente y sustituir la
parte de lectura de datos de dicha tabla por una llamada a Music_Play del motor MSX incluyendo en el fichero todo el motor de música
y curiosamente me ha dado problemas hasta que he visto que en el programa no había el equivalente del MUSICA 1,0 que aparece en el
fichero AGD. He 'emulado' esta llamada y ahora está funcionando -thumbup
Como resumen:
- el programa utiliza las interrupciones del V9958 (retrazo vertical PAL a 50Hz)
- contiene *todo* el motor de música AGD
- Al arrancar, el programa llama a Music_Init que a su vez *emite* el MUSIC 1,0 llamando a Music_LoopOff y Music_Set
- La rutina de interrupción solamente incrementa el contador/timer
- Las llamadas a PsgrOut y a Music_Play las hago desde la rutina VSync. Esto difiere del método usado en el motor.
Veré si poco a poco puedo conseguir que este programa aplique el mismo procedimiento que el motor AGD
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 18:04

update 1
Creía que sería mas complicado, pero ya se llama a las rutinas en el mismo punto que en el motor AGD, o sea que ya falta menos -thumbup
saludos

jltursan
Mensajes: 3034
Registrado: 20 Sep 2011 13:59
Agradecido : 255 veces
Agradecimiento recibido: 754 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor jltursan » 30 Jun 2020 19:07

Al final me he perdido un poco....¿has conseguido que el reproductor PT3 decodifique y reproduzca en el PSG correctamente la música?

Volviendo a lo que preguntabas, el MSX no realiza ninguna "inicialización" sobre el PSG, el chip no la necesita. Otra cosa es el music_init que lo único que hace es activar el mute y volcar 0 en todos los registros; bueno, no en todos, al menos en los 14 que se utilizan.

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 19:20

jltursan escribió:Al final me he perdido un poco....¿has conseguido que el reproductor PT3 decodifique y reproduzca en el PSG correctamente la música?
Efectivamente, con el motor sin juego alguno, simplemente reproduciendo el .pt3 ha acabado por funcionar correctamente.
Al principio leía la secuencia de frames (14 bytes) grabados tanto con Z-80 como con D64, pero al final he conseguido que decodifique y reproduzca la canción.
Volviendo a lo que preguntabas, el MSX no realiza ninguna "inicialización" sobre el PSG, el chip no la necesita. Otra cosa es el music_init que lo único que hace es activar el mute y volcar 0 en todos los registros; bueno, no en todos, al menos en los 14 que se utilizan.
Si, esto ya no me preocupa ahora.
El problema que he encontrado es que con el VSync dedicándose a posibles BEEPs, y las dos partes: música mas efectos, se me
descuajeringa todo -banghead
Por esto siempre me sonaba mal la música. He creado una copia del Diamond Geezer para que solamente use la música y además le he
metido el poke de doble velocidad a la rutina Music_Play y ahora por lo menos funciona correctamente la música, algo es algo
Habrá que ver como se puede mejorar la velocidad de algunas rutinas muy grandes que afectan al 'tiempo' entre interrupciones y supongo
que antes se 'saltaba' alguna por lo que la canción sonaba fatal.
Sigo peleándome con ésto ...
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 19:23

por cierto, he probado a cambiar los SOUND por BEEPs y cuando el personaje llega a un diamante, el juego se para totalmente, hasta que
acaba el beep, aunque la música prosigue correctamente.
Tendré que mirar si la pantalla sigue 'correcta' configurando el V9958 para trabajar en PAL, ganaría un 20% de tiempo a costa
de menos velocidad de juego, ya iré viendo ...
saludos
pere

jltursan
Mensajes: 3034
Registrado: 20 Sep 2011 13:59
Agradecido : 255 veces
Agradecimiento recibido: 754 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor jltursan » 30 Jun 2020 19:43

La música es imprescindible que vaya ligada a una interrupción externa y totalmente independiente del "vsync". Si el tiempo de ejecución de esa rutina supera el asignado a un frame se produce el overrun del mismo y ya no se consigue reproducir la música a la velocidad correcta, sonando mal.
Los BEEP funcionan (al menos en el Spectrum y en el MSX) alternando un bit un número de veces y a una velocidad concreta por lo que resultan una carga importante para el frame.
En mi caso por ejemplo era palmario el efecto que se producía al principio de los principios cuando tenía la rutina en el vsync y cambiaba de pantalla. Como el proceso era lento, la música dejaba de oirse un tiempo noticiable. Si la engancha a una IRQ, dejarás de tener el problema.
Ahora, tampoco es que se "descuajaringue" todo, se trata de que cambia la velocidad de reproducción o aparecen parones. Me mosquea eso que dices...

En lo que respecta a rutinas "grandes" y el tiempo entre fotogramas, desde que implementé el mecanismo de sincronización dinámico la cosa mejoró mucho.

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 19:55

Creo que el motor MSX que he estado convirtiendo, la música y los efectos se llaman desde la rutina de interrupción.
Lo que sucede es que el bucle principal MLoop del motor AGD llama a VSync dos veces, de forma que los sprites y el jugador se mueven
a 25-30 fps según sea la salida PAL ó NTSC ...
Veo que en VSync habilito interrupciones del V9958 al inicio y las deshabilito al final, lo que puede hacer que se pierda alguna
interrupción. Miraré si puedo cambiar de sitio estas dos operaciones, no recuerdo porqué las deshabilito al finalizar VSync ...
Tanto la música como los efectos están gestionados por la interrupción NMI del V9958 (/FS)
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 20:37

Ahora mismo tengo tres versiones del juego DiamondGeezer, todas compiladas con la misma versión del motor AGD.
- la versión 6 solamente utiliza Efectos (comandos Sound), funciona perfectamente
- la versión 8 solamente utiliza Música (fichero FlipFlap.pt3) también funciona perfectamente
- la versión 7 que utiliza utiliza ambos, música y efectos, va de pena :-(
Esta última versión presenta el menú de opciones de control y arranca la canción 1. Todavía no hay posibilidad
de emitir ningún efecto, pero el sonido suena muy entrecortado, lo cual indica que los efectos están 'malgastando'
ciclos innecesariamente. Habrá que ver cual es el motivo de esta pérdida de tiempo, a menos que al no haber efecto
alguno, cada vez se dedique a cerrar el volumen del mezclador ... elucubrando
Ya me lo miraré mas tarde
saludos
pere

Pd es patético comprobar que desde el primer momento la parte de música ha estado funcionando bien, pero al probar
con la versión 7 que permite efectos/música he estado oyendo mal la música por lo dicho anteriormente -banghead

jltursan
Mensajes: 3034
Registrado: 20 Sep 2011 13:59
Agradecido : 255 veces
Agradecimiento recibido: 754 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor jltursan » 30 Jun 2020 21:21

Es posible que sea el como se secuencian las llamadas a todas estas rutinas. La secuencia (toda ella en la IRQ) siempre debe de ser:

1) PSGROUT
2) MUSIC_PLAY
3) SFX_PLAY

Obviamente ni MUSIC_PLAY, ni SFX_PLAY ejecutan ningún volcado sobre el PSG, simplemente dejan cargado el buffer AYREGS, listo para ser volcado por PSGROUT en el siguiente frame.

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 21:33

jltursan escribió:Es posible que sea el como se secuencian las llamadas a todas estas rutinas. La secuencia (toda ella en la IRQ) siempre debe de ser:
1) PSGROUT
2) MUSIC_PLAY
3) SFX_PLAY
Obviamente ni MUSIC_PLAY, ni SFX_PLAY ejecutan ningún volcado sobre el PSG, simplemente dejan cargado el buffer AYREGS, listo para ser volcado por PSGROUT en el siguiente frame.
Así es como lo tenía, he probado a invertir las dos últimas y el resultado ha sido el mismo.
Me da la impresión de que la parte de efectos NO controla el hecho de no tener ningún efecto en curso y en cambio si borra el buffer ayRegs
con lo cual 'corta' la música durante un Vsync.
Voy a mirarme el código pacientemente. Lo lógico sería tener, ya de entrada, un check al puntero que se usa para leer datos del efecto.
Si este puntero no se reinicia a un valor que se considera que NO apunta a ningún sonido, entonces problemas habemos.
Seguimos en contacto
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 22:36

viendo el código, no parece que los efectos sean culpables ...
Al principio de AyFX_Play se lee ayFX_Priority que debería ser 255 cuando no hay efecto seleccionado y, en este caso,
se sale inmediatamente de la rutina.

De hecho escuchando atentamente la música en la versión 8 de pruebas, no se oye tan claramente como cuando escucho
el programa de pruebas que he estado utilizando, que solamente contenía el motor de música.
Hay que tener en cuenta que al funcionar Dragón a 0,89MHz o a 1,78MHz a doble velocidad, dista mucho de la velocidad de los MSX2+
que se intenta emular, así que a lo *peor* si que afecta el tener rutinas 'convertidas' en lugar de optimizadas -banghead
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 30 Jun 2020 23:50

He podido trazar un rato la versión 7 que usa efectos y música y he encontrado un gazapo.
Por despiste moví las variables que se usan para efectos al final del motor junto con las de la música con tan mala fortuna
que las intercalé. Debido a ésto, la variable ayFX_Priority a pesar de recibir el valor 255 (no efectos), se borra a ceros
cuando se inician las variables para música -banghead
He movido las variables FX fuera del grupo de Música y ahora las versión 7 de pruebas permite escuchar bien los efectos mientras
que la música suena entrecortada, es reconocible, pero no está bien. Ya veremos como, pero hay que agilizar cantidad la montaña de
subrutinas que se usan para la música. Lo cierto es que en la pantalla inicial cuando todavía no hay efecto seleccionado, la música ya
suena bastante mal, aunque luego no empeora cuando se recogen diamantes.
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 01 Jul 2020 00:14

@jltursan
en este momento estoy viendo otro posible punto de conflicto ...
Dentro de la rutina VSync que se llama unas cuantas veces, justo al entrar se habilitan las interrupciones del V9958
y justo antes de salir, las deshabilita, no sé si esto puede perjudicar el rendimiento y hacer que se pierda algun /FS
¿En que parte del motor habilitas el nuevo IRQ? y ¿En que parte lo deshabilitas, si es que lo haces?
No recuerdo que problemas me daba cuando habilitaba /FS al iniciar y ya no se deshabilitaban hasta la salida del pgm
Probaré mañana de preparar una versión del motor que mantenga las interrupciones en marcha mas rato ...
saludos
pere

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 01 Jul 2020 12:02

Buenos dias,
tras comprobar que la parte de música del motor AGD convertido para 6309 funciona perfectamente, puedo decir que será muy simple
crear un disquet grande con el motor, un montón de ficheros .pt3 y un programa Basic que permita seleccionar el fichero a escuchar
De hecho haré dos versiones. Una que utilice las interrupciones internas de Dragón (/FS) via IRQ para quienes tengan el módulo
CoCo-PSG o parecido y otra que se base en las interrupciones NMI del V9958 para quienes usen el combo Wordpak2+ con CoCo-PSG
o bien los que dispongan de la placa de John Whitworth que contiene ambos chips

La versión actual del motor AGD convertido, la he utilizado para compilar tres versiones del DiamondGeezer
- Solamente con Efectos, sigue funcionando correctamente como antes de añadir la música
- Solamente con Música, suena algo entrecortada, a pesar de haber puesto doble velocidad de CPU en Music_Play
- Con Efectos y Música, ahora los efectos se oyen correctamente (antes ni se oían), pero la música suena exageradamente
entrecortada, por esto os decía yo que sonaba fatal :-(
Ha estado funcionando correctamente la parte de música desde hace la tira de versiones ....

Está claro que la suma de tiempos dedicados a Efectos/Música/Sprites/Lógica del juego excede el tiempo entre dos interrupciones
consecutivas. He cambiado a salida PAL para darle un 20% mas de tiempo pero es insuficiente.
Sigue siendo sorprendente que la versión con efectos y música suene tan mal en la primera pantalla donde solo debería sonar la
música, a pesar de haber corregido un error de posición de datos y haber puesto doble velocidad en AYFX_Play

No me queda mas remedio que estudiar muy a fondo las rutina de música, Music_Play y las que son llamadas por ésta.
Al hacer la conversión 'literal' pierdo muchos ciclos cuando se usan BC y DE ya que al no estar seguro de cuando se volverán a usar
me paso el tiempo leyendo dos bytes, invirtiéndolos y guardándolos en memoria (pseudo-registros) y lo mismo en sentido inverso
cuando los necesito ...
saludos
pere

jltursan
Mensajes: 3034
Registrado: 20 Sep 2011 13:59
Agradecido : 255 veces
Agradecimiento recibido: 754 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor jltursan » 01 Jul 2020 17:37

pser1 escribió:@jltursan
en este momento estoy viendo otro posible punto de conflicto ...
Dentro de la rutina VSync que se llama unas cuantas veces, justo al entrar se habilitan las interrupciones del V9958
y justo antes de salir, las deshabilita, no sé si esto puede perjudicar el rendimiento y hacer que se pierda algun /FS
¿En que parte del motor habilitas el nuevo IRQ? y ¿En que parte lo deshabilitas, si es que lo haces?
No recuerdo que problemas me daba cuando habilitaba /FS al iniciar y ya no se deshabilitaban hasta la salida del pgm
Probaré mañana de preparar una versión del motor que mantenga las interrupciones en marcha mas rato ...
saludos
pere


Jeje, menudo follón. Yo no desactivo para nada las interrupciones del VDP, de hecho no recuerdo si el TMS me permite esa posibilidad. Esas interrupciones son el único medio que dispongo en el MSX para poder sincronizar la ejecución con el barrido de pantalla, algo extremadamente vital.

Lo que si que hago es habilitar/deshabilitar las interrupciones del Z80, normalmente cuando no me queda más remedio, es decir:

- Cuando estoy enmedio de los accesos al latch del VDP (aunque creo que tampoco sería grave dado que en mi ISR, no hago absolutamente nada con el VDP excepto cuando activo el modo DEBUG, que cambio el borde)
- En la rutina shrapnel de las partículas dado que empleo "stack blasting" para acelerar en lo posible esa rutina y no quiero que me trasteen la pila.

Permanecen deshabilitadas lo mínimo posible dado que lo que si que pretendo es que la interrupción salte al menos 1 vez por frame, garantizando así la "suavidad" en la reproducción del audio.

Avatar de Usuario
pser1
Mensajes: 3035
Registrado: 08 Dic 2012 18:34
Agradecido : 717 veces
Agradecimiento recibido: 784 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor pser1 » 01 Jul 2020 20:15

jltursan escribió:Jeje, menudo follón. Yo no desactivo para nada las interrupciones del VDP, de hecho no recuerdo si el TMS me permite esa posibilidad. Esas interrupciones son el único medio que dispongo en el MSX para poder sincronizar la ejecución con el barrido de pantalla, algo extremadamente vital.
Lo que si que hago es habilitar/deshabilitar las interrupciones del Z80, normalmente cuando no me queda más remedio, es decir:
- Cuando estoy enmedio de los accesos al latch del VDP (aunque creo que tampoco sería grave dado que en mi ISR, no hago absolutamente nada con el VDP excepto cuando activo el modo DEBUG, que cambio el borde)
- En la rutina shrapnel de las partículas dado que empleo "stack blasting" para acelerar en lo posible esa rutina y no quiero que me trasteen la pila.
Permanecen deshabilitadas lo mínimo posible dado que lo que si que pretendo es que la interrupción salte al menos 1 vez por frame, garantizando así la "suavidad" en la reproducción del audio.
Muchas gracias. Probé así tal como estaban y además hice una prueba habilitando las interrupciones al principio del programa dejándolas todo el rato, sin diferencia de comportamiento.
Me temo que la única solución es optimizar tiempo de ejecución en general en todas las rutinas que se ejecutan entre interrupciones ...
Y me refiero a todas, tanto las de música y efectos como las anteriores ...
saludos
pere

jltursan
Mensajes: 3034
Registrado: 20 Sep 2011 13:59
Agradecido : 255 veces
Agradecimiento recibido: 754 veces

Re: Aprendiendo a manejar los chips de video V9958 y sonido YM-2149

Mensajepor jltursan » 01 Jul 2020 21:18

Dado que ahora estás trabajando con un V9958 puedes hacer lo mismo que yo y controlar tiempos de ejecución a la vieja escuela, cambiando el color del borde.

En mi código tengo la siguiente macro que podrías adaptar sin esfuerzo:

Código: Seleccionar todo

   macro BORDER clr ; 0-15
        push af
        ld a,clr             ;Get data to set
        di
        out (MSX_VDPCW),a
        ld a,$87             ;Get register #
        out (MSX_VDPCW ),a
        pop af
        ei
   endmacro

Si lo hago al comienzo y al final de las rutinas, tengo bandas de color que me indican como se reparte el tiempo a lo largo del frame. Cuando te acostumbras a interpretarlo, es muy visual :-)

DEBUG_AGD.jpg
DEBUG_AGD.jpg (24.43 KiB) Visto 453 veces

Si a eso le sumas un flag DEBUG, activándolo o desactivandolo se invocan todos los BORDER o no.

Por cierto, en la macro puedes ver el uso estandar que te comentaba a la hora de deshabilitar las interrupciones, el mínimo tiempo posible entre los accesos al latch.


Volver a “Software MSX”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado