martes, 9 de agosto de 2011

Sobre detección de FM en los MSX

¡No paramos durante las vacaciones!

Llevo unos días dándole caña a un replayer de música FM para el KNT y ya está listo y sonando a la perfección. Se trata del Protracker, creado en 1991 por Tyfoon-Software y que ha sido usado en producciones anteriores como Eggbert.

Este replayer permite la reproducción de música en FM tanto a través del FM-Pac como a través del Music Module (aunque no al mismo tiempo). Ahora, tras toquetearlo levemente, permite también reproducir la música a través de la MoonSound, con lo que podremos elegir con qué tarjeta reproducir la música.

¿Por qué es esto posible?

El caso es que como el FM no está incluído en todos los MSX, lo primero que hay que hacer es buscarlo. Por lo tanto hoy veremos cómo detectar las tres tarjetas mencionadas, así como las similitudes entre la parte FM del Music-Module y la MoonSound. En un próximo post pondré a vuestra disposición el replayer y las instrucciones para su manejo.

Detectando el FM-Pac

Comencemos por el FM-Pac. Esta expansión, también conocida como MSX-Music, consiste en un chip Yamaha YM2413 u OPLL. Apareció en 1987 como una extensión propietaria de Panasonic, no en vano los Turbo-R y la mayoría de los MSX2+ cuentan con dicha extensión.

Posiblemente muchos hayáis experimentado problemas a la hora de escuchar músicas FM con FM-Pac externo, mientras que con uno interno todo va de perlas. ¿Por qué? Esto es debido a que el FM-Pac externo necesita ser inicializado, mientras que el interno ya lo está desde el principio.

Por ello es necesario realizar una correcta búsqueda del OPLL y si es externo proceder a su inicialización. Veamos cómo encontrarlo gracias al contenido de la memoria de su propio firmware.

En el FM-Pac interno se puede encontrar la cadena "APRLOPLL" en la dirección $4018. ¿Por qué "APRL"? Pues es un misterio, pero el caso es que es así. Lo primero que deberemos hacer es buscar por todos los slots y subslots dicha cadena en esa dirección. Si la encontramos sabremos con seguridad que hay un OPLL interno que no necesita ser inicializado, con lo que nuestro trabajo habrá concluído.

El FM-Pac externo puede tener diferentes cadenas de identificación, pero lo que es seguro es que aparecerá "OPLL" en la dirección $401C. Así pues lo mismo que antes: buscamos "OPLL" en esa dirección por todos los slots y subslots disponibles. Cuando lo hayamos encontrado tendremos que inicializar el FM. Esto es muy sencillo, ya que basta con poner a 1 el bit de menor peso de la dirección $7FF6 del slot donde hayamos encontrado el FM externo.

Bien, ya sabemos como encontrar el FM-Pac, sabemos si es interno o externo y en este caso lo hemos inicializado. Ya podemos utilizarlo a través de los puertos $7C y $7D.

Detectando el Music-Module

El MSX-Audio es un estándar basado en el Yamaha 8950 también conocido como OPL1, pues la parte de FM es compatible con el YM3526. Es una extensión anterior al FM-Pac, aunque más versátil que ésta. Hay varios cartuchos que cumplen este estándar, aunque el más conocido en Europa es el Music-Module de Philips.

La detección del Music-Module (y de cualquier cartucho del estándar MSX-Audio) es muchísimo más sencilla, ya que basta con leer el contenido del puerto $C0 y comprobar si es 6. En tal caso estaremos ante un Music-Module. Si tiene cualquier otro valor, entonces no es un Music-Module, pero... ¿puede ser otra cosa? Sí.

Resulta que las MoonSound a partir de la v2 cuentan con un jumper (el JP1 para más señas) que permite añadir el rango de puertos $C0-$C3 (aquellos que utiliza el Music-Module) para aparentar ser un Music-Module. En tal caso, si tenemos una MoonSound con el JP1 activado para añadir ese rango de puertos, en $C0 leeremos un 0 en lugar de un 6.

Así pues si lo que queremos es detectar un Music-Module para FM, deberemos leer el contenido del puerto $C0 y:
  • si es 6 tenemos un Music-Module real

  • si es 0 tenemos una MoonSound con el rango de puertos $C0-$C3 activado

En cualquiera de los dos casos, podremos utilizar el chip de sonido de igual manera como si de un Music-Module se tratase, pero sólo la parte de FM, ya que la MoonSound no permitiría el uso del ADPCM que trae el Music-Module... pero aquí estamos hablando sólo de FM.

Detectando la MoonSound

La MoonSound es una tarjeta de sonido creada por Sunrise en 1995 y basada en el OPL4 de Yamaha. Este chip es 100% compatible con los OPL1, OPL2 y OPL3, lo cual permite que cualquier software que utilice la parte FM del OPL1 (es decir, que use la parte FM del Music-Module) podrá ser utilizado directamente (o casi) con esta tarjeta.

Pasemos a detectarla. Seguro que tras leer el anterior apartado, a muchos se les ha ocurrido cómo realizar la detección de una MoonSound. Bastaría con leer el contenido del primer puerto de entrada salida normal de la MoonSound y comprobar que es un 0. ¡Exacto!

La MoonSound se sitúa en los puertos $C4-$C7, así que basta con leer el contenido de $C4 y si es 0 estamos ante una MoonSound, con independencia de si tenemos el JP1 activado (o de si tenemos una MoonSound v1 que carece de esa posibilidad).

Un replayer... tres chips

El replayer del Protracker está preparado para trabajar con FM-Pac y Music-Module ya de serie. Basta con cambiar el valor de una de sus variables para que la salida la realice por uno u otro chip, aunque no es posible cambiarlo al vuelo, ya que todo se configura para el chip deseado.

¿Cómo añadir el soporte para la MoonSound? Pues dado que la parte FM de la MoonSound es directamente compatible con la parte FM del Music-Module, basta con detectar la presencia de la MoonSound y retocar ligeramente la rutina que se encarga de escribir en el Music-Module. Dicha rutina realiza escrituras en los puertos $C0 y $C1, que en el caso de la MoonSound deberán ir a los puertos $C4 y $C5 respectivamente.

Con esta sencilla operación el Protracker es ahora capaz de reproducir sonido en la MoonSound. Algo para lo que no estaba pensado pues se programó con anterioridad a la existencia de la MoonSound.

Y con esto terminamos por ahora. Los más impacientes ya tienen tarea por delante: intentar detectar cada una de las tarjetas por su propia cuenta, la más complicada es el FM-Pac porque las otras dos son muy sencillitas.

Los más comodones deberán esperar a un próximo post donde pondré a vuestra disposición el código del replayer convertido a sintáxis del asMSX, incluyendo todo el tema de la detección y uso de los chips y que puede, además, ser utilizado desde ROM y no sólo desde RAM como el original. Algo que espero os sea útil si queréis incluirlo en algún juego.

Quiero agradecer tanto a BiFiMSX como a GuyveR800 su ayuda sobre el tema de la detección de las diferentes tarjetas de sonido, así como sus consejos para adaptar el replayer del Protracker.

2 comentarios:

aorante dijo...

Muy bueno el artículo! :D
Una pregunta: Si leemos el puerto C0 y no tenemos music module o moonsound, ¿que respuesta obtendriamos?

Z80ST-Software dijo...

Si no hay nada en un puerto, lo normal es obtener $FF, pero eso puede variar entre ordenadores.

Por ejemplo, el HX-10 leía algo diferente de $FF en el puerto donde se sitúa la Franky... ¡sin la Franky!