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

jltursan
Mensajes: 2940
Registrado: 20 Sep 2011 13:59
Agradecido : 240 veces
Agradecimiento recibido: 708 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 01 Jun 2020 19:35

Último mensaje de la página anterior:

En el engine MSX las equivalencias a los puertos del PSG son:

MSX_PSGLW equ $A0 ; latch address for PSG
MSX_PSGDW equ $A1 ; write data to PSG

...pero supongo que a estas alturas ya tienes controlado el tema.

Así que un tema menos, ya solamente me falta algún banco de sonidos (probado) y alguna indicación de como 'interconectar'
el módulo de sonidos al motor AGD . Aparentemente se le llama desde los ficheros de scripts con el comando SOUND n
Pero en alguna parte habrá que indicarle al motor la ubicación (inicio) del banco de efectos ...

Los bancos de sonido que empleo son compatibles con los generados por la utilidad ayFXedit. En mi Github puedes encontrar aquí el banco de SFX que cargo por defecto con una serie de sonidos muy "apañaos".
Cuando se detecta la necesidad de generar SFX, siempre cargo un banco por defecto que el compilador asume que está en el directorio "resources". Si se quiere emplear otro conjunto de efectos, basta con sustituir este archivo por otro con los sonidos que se quiera.

¿Puede estar emitiendo sonidos por el altavoz (BEEP command) y al mismo tiempo por el chip de sonido (SOUND /MUSIC)?

Se puede, los BEEP se generan en el "mainloop" y todo el PSG se genera mediante interrupciones.
De hecho en el Foggy solapo los sonidillos "bleep-bloop" que tenía el juego con la banda sonora PSG que le añadí :-)

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 11:54

jltursan escribió:En el engine MSX las equivalencias a los puertos del PSG son:
MSX_PSGLW equ $A0 ; latch address for PSG
MSX_PSGDW equ $A1 ; write data to PSG
...pero supongo que a estas alturas ya tienes controlado el tema.
Usando el CoCo-PSG de Ed Snider las direcciones son $ff5e para enviar el número de registro y $ff5f para enviar datos
Los bancos de sonido que empleo son compatibles con los generados por la utilidad ayFXedit. En mi Github puedes encontrar aquí el banco de SFX que cargo por defecto con una serie de sonidos muy "apañaos".
Cuando se detecta la necesidad de generar SFX, siempre cargo un banco por defecto que el compilador asume que está en el directorio "resources". Si se quiere emplear otro conjunto de efectos, basta con sustituir este archivo por otro con los sonidos que se quiera.
Ya echaré una ojeada a la 'carga' del fichero .afb en el compilador, lo que veo es que el banco "sfx.afb" solamente contiene siete efectos ...

Respecto al tema de BEEP / SOUND, en la versión de CoCo-Dragón tanto para el MC6847 como ahora con el V9958, el BEEP se controla en VSync pero esto implica que también depende de las interrupciones, la diferencia que veo en un MSX es que mientras que VSync forma parte de bucle principal ya que es llamado un par de veces, por lo menos, las llamadas al generador de efectos/música se realizan dentro de la rutina de interrupciones (ISR). Ya haré pruebas, en mi rutina de interrupción solamente se incrementa el timer y el VSync lo usa para generar el sonido, como en el Spectrum.
muchas gracias
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 17:02

Hola,
revisando otra vez mas el código convertido con el original MSX, he observado que hay dos líneas consecutivas
que asignan un valor al registro A. ¿Es esto correcto o es un simple olvido al corregir un error previo?
.CHECK_PRI:	; --- Check if the new priority is lower than the current one ---
; --- Remember: 0 = highest priority, 15 = lowest priority ---
ld a,b ; a:=b (new ayFX stream index)
ld a,[ayFX_PRIORITY] ; a:=Current ayFX stream priority
cp c ; If new ayFX stream priority is lower than current one.
ld a,1 ; a:=1 (error 1: A sample with higher priority is being played)
jr c,.INIT_END ; ...we don't start the new ayFX stream
; --- Set new priority ---

saludos
pere

EDIT: De momento tengo comentado el primer ld a,b

jltursan
Mensajes: 2940
Registrado: 20 Sep 2011 13:59
Agradecido : 240 veces
Agradecimiento recibido: 708 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 02 Jun 2020 18:50

Supongo que por ser inocuo ha pasado tanto tiempo desapercibido. El código original es este: ayFX Replayer

Por lo que veo, sobra el "ld a,b". Eso que ganamos en tamaño y velocidad :-)

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 18:56

Una vez añadidas las definiciones de algunas variables dentro de la estructura de datos para el chip de sonido,
he podido compilar sin problemas.
Actualmente, los requisitos de memoria son los siguientes (para efectos, no música)
Programa - $7000 hasta $7163 -> 356 bytes
VTable - $7164 hasta $7343 -> 480 bytes (tabla para volumen relativo)
Datos - $7344 hasta $735E -> 27 bytes
==========
863 bytes
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 19:15

jltursan escribió:Cuando se detecta la necesidad de generar SFX, siempre cargo un banco por defecto que el compilador asume que está en el directorio "resources". Si se quiere emplear otro conjunto de efectos, basta con sustituir este archivo por otro con los sonidos que se quiera

Veamos, solamente he encontrado referencia al directorio 'resources' en dos sitios en el compilador: Define_Music y Create_Songs siendo este
último el que tiene un 'includebin' para añadir el fichero en la salida en ensamblador, pero hace referencia a musica ...
¿Qué hay que hacer si solamente quieres añadir efectos?
Y en el paso siguiente en que se deseen utilizar efectos y música, ¿Hay que concatenar los ficheros de efectos y música en uno solo?
muchas gracias de antemano
saludos
pere

jltursan
Mensajes: 2940
Registrado: 20 Sep 2011 13:59
Agradecido : 240 veces
Agradecimiento recibido: 708 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 02 Jun 2020 20:36

Perdón, no me expresé correctamente, no quería decir compilador, sino ensamblador. El código en cuestión es este, muy simple:

Código: Seleccionar todo

if XFLAG
   
  sfxbank:   incbin "..\resources\sfx.afb"
   
endif

Los efectos van en forma de banco, los grabas con el ayFXedit (sin incluir nombres en los efectos y así ganar algo de RAM). Los temas de música acaban siendo ensamblados con una secuencia de código generada, esta vez sí, por el compilador:

Código: Seleccionar todo

songaddr0:   incbin "..\resources\ZF-6M_25.pt3"
songaddr1:   incbin "..\resources\Flexo105.pt3"
songtab:     dw songaddr0-100,songaddr1-100

Cada comando DEFINEMUSIC "blahblah.pt3" que encuentra en el código AGD, es transformado en cada una de las líneas que ves arriba, así hasta 10 posibles temas y al final, genera la lista con los punteros a cada tema, que es lo que el engine acaba usando cuando se invoca un MUSIC

Así pues, los efectos y las músicas van por separado y sus tratamientos no tienen nada que ver...excepto que ambos se reproducen desde la ISR. La ISR que tengo no es mucho más complicada que la que dices que tienes tú, además del contador de frames, sólo invoco a las rutinas de música:

Código: Seleccionar todo

if YFLAG or XFLAG
      call psgrout
   if YFLAG
      call music_play
   endif
   if XFLAG
      call sfx_play
   endif
endif

EDITO: Curioso, en la primera línea del bloque de código anterior, he tenido que suprimir los paréntesis rodeando "YFLAG or XFLAG" ya que sino, el foro fallaba a la hora de publicar el mensaje -no

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 21:49

jltursan escribió:Perdón, no me expresé correctamente, no quería decir compilador, sino ensamblador. El código en cuestión es este, muy simple:

Código: Seleccionar todo

if XFLAG
 sfxbank:   incbin "..\resources\sfx.afb"
endif

Los efectos van en forma de banco, los grabas con el ayFXedit (sin incluir nombres en los efectos y así ganar algo de RAM).
O sea que esta línea hay que añadirla manualmente en el fichero ensamblador de salida del compilador o la añadiste al mismo motor. Supongo que podríamos hacerlo en el mismo compilador utilizando el flag 'nSfx' para que el mismo compilador lo añadiera al final del programa ...
Los temas de música acaban siendo ensamblados con una secuencia de código generada, esta vez sí, por el compilador:

Código: Seleccionar todo

songaddr0:   incbin "..\resources\ZF-6M_25.pt3"
songaddr1:   incbin "..\resources\Flexo105.pt3"
songtab:     dw songaddr0-100,songaddr1-100

Cada comando DEFINEMUSIC "blahblah.pt3" que encuentra en el código AGD, es transformado en cada una de las líneas que ves arriba, así hasta 10 posibles temas y al final, genera la lista con los punteros a cada tema, que es lo que el engine acaba usando cuando se invoca un MUSIC
Efectivamente, esta parte la encontré en el compilador, está bastante claro
Así pues, los efectos y las músicas van por separado y sus tratamientos no tienen nada que ver...excepto que ambos se reproducen desde la ISR. La ISR que tengo no es mucho más complicada que la que dices que tienes tú, además del contador de frames, sólo invoco a las rutinas de música:

Código: Seleccionar todo

if YFLAG or XFLAG
      call psgrout
   if YFLAG
      call music_play
   endif
   if XFLAG
      call sfx_play
   endif
endif

EDITO: Curioso, en la primera línea del bloque de código anterior, he tenido que suprimir los paréntesis rodeando "YFLAG or XFLAG" ya que sino, el foro fallaba a la hora de publicar el mensaje -no

Ya tengo estas rutinas en mi ISR también. Puede que la combinación de paréntesis de apertura seguido de Y no le guste -507
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 21:58

lo pongo en mensaje aparte para evitar alargar demasiado el anterior ...
El fichero .afb contiene en el primer byte el número de efectos, y va seguido de la cantidad de punteros necesarios para
acceder a cada sonido. Me he dado cuenta de que vienen en orden Z80 o sea bigendian, primero el byte bajo y luego el alto
Justo al revés de como los lee el 6809 así que voy a tener que modificar levemente la 'lectura' de dicho puntero, no lo ví antes -banghead
Espero que no suceda en mas sitios. Una vez se guardan en variables o estructuras lo hago siempre como lowendian.
Así que ya debo tener info suficiente como para avanzar la versión del motor 6309-V9958 y probar con tu fichero de sonidos
y, posiblemente, utilice el Diamond Geezer como juego de pruebas ...
muchas gracias -drinks -thumbup
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 02 Jun 2020 22:24

mas cosas ...
He cambiado el flag de Sonidos/efectos a EFLAG puesto que ya tengo XFLAG utilizado para METABLOCKS (16x16)
Veré como puedo hacer que el compilador lo ponga a uno cuando nSfx = 1
Por cierto, parece que en el compilador se define AYFXRELATIVE=0 y luego no se cambia en ninguna parte.
¿Hay algún criterio que se pueda aplicar para pasarlo a 1 cuando sea necesario?
muchas gracias
pere

jltursan
Mensajes: 2940
Registrado: 20 Sep 2011 13:59
Agradecido : 240 veces
Agradecimiento recibido: 708 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 02 Jun 2020 23:19

La verdad es que no he llegado a emplear el volumen relativo de los SFX así que lo tengo siempre desactivado, reproduciendo los SFX a máximo volumen siempre. Habría que cambiar el compilador para que interprete el SOUND con un parámetro extra y no tengo claro lo que se ganaría. Imagino cual es su función; pero no me resulta demasiado atractiva. como curiosidad más que nada.

¿Metablocks?, ¿suponen muchos cambios?. Lo digo porque tengo ya los "crumbling blocks" añadido al motor MSX y podría aprovechar para meter esto. O eso o los "conveyor"; pero no se si lo tienes implementado para poder informarme. Creo recordar que había unos pocos juegos que los empleaban para su mapeado, ¿uno de ellos era "Robot: The impossible Mission"?

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 03 Jun 2020 00:09

jltursan escribió:La verdad es que no he llegado a emplear el volumen relativo de los SFX así que lo tengo siempre desactivado, reproduciendo los SFX a máximo volumen siempre. Habría que cambiar el compilador para que interprete el SOUND con un parámetro extra y no tengo claro lo que se ganaría. Imagino cual es su función; pero no me resulta demasiado atractiva. como curiosidad más que nada.
De acuerdo ... de momento he podido modificar el compilador, el motor V9958 y el Diamond Geezer que usa dos efectos (SOUND 0 y 1) y ha compilado correctamente. Mañana haré el montaje con los módulos V9958 y el PSG para escuchar que pasa ...
¿Metablocks?, ¿suponen muchos cambios?. Lo digo porque tengo ya los "crumbling blocks" añadido al motor MSX y podría aprovechar para meter esto. O eso o los "conveyor"; pero no se si lo tienes implementado para poder informarme. Creo recordar que había unos pocos juegos que los empleaban para su mapeado, ¿uno de ellos era "Robot: The impossible Mission"?
Los cambios son mínimos, dos lineas sueltas que se condicionan a este flag y luego la rutina "DrwMeta" que es bastante pequeña, la verdad es que no recuerdo si la empleamos, pero seguramente si, porqué en caso contrario no la habríamos implementado ...
Por cierto, los "conveyor", ¿Son otro tipo de bloque? No tengo constancia de ellos ni de un programa que los utilice ... ¿Conoces tu alguno?
Igual es una variante del tipo CUSTOM ... ya me dirás
saludos
pere

jltursan
Mensajes: 2940
Registrado: 20 Sep 2011 13:59
Agradecido : 240 veces
Agradecimiento recibido: 708 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor jltursan » 03 Jun 2020 10:10

Los cambios son mínimos, dos lineas sueltas que se condicionan a este flag y luego la rutina "DrwMeta" que es bastante pequeña, la verdad es que no recuerdo si la empleamos, pero seguramente si, porqué en caso contrario no la habríamos implementado ...

Genial pues, me miro el engine del Dragon en busca de los condicionales XFLAG y de la rutina que mencionas, ¡gracias! -thumbup

Por cierto, los "conveyor", ¿Son otro tipo de bloque? No tengo constancia de ellos ni de un programa que los utilice ... ¿Conoces tu alguno?

El "Bean Brothers" precisamente, los "conveyor" son las "cintas mecánicas" que te transportan en una dirección. Me gustaría ver como lo han implementado porque por lo que veo, los cambios sobre AGDX son bastante "piratillas", es decir, no veo que se definan auténticos tipos de bloque nuevos (al menos los "crumbling" no lo hacen y estaría requetebien que lo fuesen oficialmente).

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 03 Jun 2020 10:45

jltursan escribió:
Los cambios son mínimos, dos lineas sueltas que se condicionan a este flag y luego la rutina "DrwMeta" que es bastante pequeña, la verdad es que no recuerdo si la empleamos, pero seguramente si, porqué en caso contrario no la habríamos implementado ...

Genial pues, me miro el engine del Dragon en busca de los condicionales XFLAG y de la rutina que mencionas, ¡gracias! -thumbup
Por si acaso te adjunto fuente del motor AGD de Dragón antes de empezar con el V9958 y en su versión mas reciente ya con él
El "Bean Brothers" precisamente, los "conveyor" son las "cintas mecánicas" que te transportan en una dirección. Me gustaría ver como lo han implementado porque por lo que veo, los cambios sobre AGDX son bastante "piratillas", es decir, no veo que se definan auténticos tipos de bloque nuevos (al menos los "crumbling" no lo hacen y estaría requetebien que lo fuesen oficialmente).

Pues el Bean Brothers lo convertimos para MC6847 así que algo hicimos aunque no le llamásemos 'conveyor' ...
He probado a quitar el CoCo-SDC y poner en su lugar el CoCo-PSG y el motor de AGD se 'cuelga'!!
Voy a tener que investigar que hago que necesite la presencia de mi DosPlus5.0Extended -banghead
saludos
pere
VDPE59C.ZIP
(132.95 KiB) Descargado 1 vez

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 03 Jun 2020 10:54

curioso!
cargando mi DP50Extended via Drivewire, ya puedo cargar y ejecutar programas.
Tengo dos programas de demo que envian escalas musicales o una canción (Hey Jude, para variar) y funcionan perfectamente
aunque creo recordar que en estos programas hay algo que selecciona internamente el slot del multipack para el sonido.
Al cargar el DiamondGeezer con beeps cambiados por SOUNDs, no se oye nada de nada -banghead
A saber si será culpa de la selección del slot o de errores en el motor de efectos ... a debugar de nuevo -507
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 03 Jun 2020 12:10

He añadido la declaración de los slots del MPI en el motorV9958 y he añadido cuatro lineas de código para configurar el PSG como hago
en los programas que lo utilizan y además he hecho el cambio de slot al del PSG (no obligatorio, pero ...)
Los demás programas funcionan, como he dicho antes, cargando previamente mi DP5.0E o sea que algo no le gusta al motor
si se arranca sin ningún DOS -banghead
Pero éste es un mal menor ya que puedo usar drivewire pasa superar este problema, lo malo es que al arrancar DiamondGeezer
puedo jugar pero sin sonido alguno y debugar ésto va ser durillo ... -banghead
saludos
pere

Avatar de Usuario
pser1
Mensajes: 2990
Registrado: 08 Dic 2012 18:34
Agradecido : 696 veces
Agradecimiento recibido: 771 veces

Re: Aprendiendo a manejar el chip de video V9958

Mensajepor pser1 » 03 Jun 2020 13:17

He empezado a seguir 'manualmente' el código que configura y pone en marcha el YM-2149 y he tropezado con este código en
la rutina "sfx_mute" que yo esperaba que pusiera a cero los valores de Volumen de los canales, pero al hacer las operaciones
a 'mano', me sale que apunta a otros sitios ... ¿Qué es lo que hago mal?
sfx_mute:
ld a,255 ; Lowest ayFX priority
ld [ayFX_PRIORITY],a ; Priority saved (not playing ayFX stream)
ld hl,AYREGS ; regHL= $1CBE (asumo que regH=$1C y que regL = $BE)
ld a,(ayFX_CHANNEL) ; A = $01 (valor puesto en inicialización)
inc a ; A = $02
and 3 ; A = $02
add a,8 ; A = $0A
add a,l ; A = $C8
ld l,a ; regL = $C8 por tanto regHL = $1CC8
adc a,h ; A = $E4
sub l ; A = $1C
ld h,a ; regH = $1C ; ¿Qué pinta este comentario? ; y * 32 + x
ld (hl),0 ; ($1CC8)=0
ret

ayRegs rzb 14 ; structure data to be sent to the YM-2149
AR_TonA equ 00 ; $1CBE - offset for R0 - channel A frequency fine tone byte (8 bits)
ayReg01 equ 01 ; $1CBF - offset for R1 - channel A frequency rough tone byte (4 lower bits)
AR_TonB equ 02 ; $1CC0 - offset for R2 - channel B frequency fine tone byte (8 bits)
ayReg03 equ 03 ; $1CC1 - offset for R3 - channel B frequency rough tone byte (4 lower bits)
AR_TonC equ 04 ; $1CC2 - offset for R4 - channel C frequency fine tone byte (8 bits)
ayReg05 equ 05 ; $1CC3 - offset for R5 - channel C frequency rough tone byte (4 lower bits)
AR_Noise equ 06 ; $1CC4 - offset for R6 - frequency of noise (5 lower bits)
AR_Mixer equ 07 ; $1CC5 - offset for R7 - I/O port and mixer settings (6 lower bits)
AR_AmplA equ 08 ; $1CC6 - offset for R8 - channel A level (5 lower bits)
AR_AmplB equ 09 ; $1CC7 - offset for R9 - channel B level (5 lower bits)
AR_AmplC equ 10 ; $1CC8 - offset for RA - channel C level (5 lower bits)
AR_Env equ 11 ; $1CC9 - offset for RB - envelope frequency (fine adjustement) (8 bits)
ayReg12 equ 12 ; $1CCA - offset for RC - envelope frequency (rough adjustement) (8 bits)
AR_EnvTp equ 13 ; $1CCB - offset for RD - shape of en

saludos
pere


Volver a “Software MSX”

¿Quién está conectado?

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