miércoles, 24 de agosto de 2011

Demo del protracker

En el anterior post hablábamos sobre detectar la presencia de diferentes tarjetas de sonido FM en los MSX y ya va siendo hora de enseñar como funciona ese replayer. Dicen que una imagen vale más que mil palabras, y que un vídeo vale más que mil imágenes. Pues yo digo que una demo vale incluso más, así que he preparado una rom con el replayer y un módulo de xenon, quien amablemente lo ha ofrecido para la demo.

La ROM funciona perfectamente en los emuladores y en los MSX reales, en los que recomiendo cargarla con ODO. Lo primero es indicar que la demo va a mostrarnos un escueto mensaje por pantalla indicándonos si no hubiera FM. En caso de que haya FM veremos el título de la canción "ANALOGY2". No es interactiva, por lo que será necesario apagar la máquina para salir de ella.

En segundo lugar hay que saber que la demo buscará el FM-PAC, la MoonSound y el Music Module, para seleccionar la tarjeta más adecuada precisamente en ese orden. Es decir, si queremos escuchar el sonido en la MoonSound, no deberá haber un FM-PAC conectado. Y si queremos escucharla en un Music Module, ni FM-PAC ni MoonSound.

Llegados a este punto, quizá alguno se sorprenda de que la ROM tenga un tamaño de 48Kb, cuando podría caber perfectamente en unos 8K. ¡Es cierto!

He querido aprovechar la ocasión para ir un paso más allá y presentar una rom un tanto especial. Se trata de una rom híbrida MSX/Sega Master System. Si renombráis el archivo de .ROM a .SMS y lo cargáis en vuestro emulador de Master System favorito, seguirá funcionando. Por eso la ROM es de 48K, ya que es la única medida de ROM que coincide en ambos sistemas de forma sencilla.

En futuros posts iré explicando cómo crear estas roms híbridas y un poco del funcionamiento de la Master System. Aparte, incluiré también el código del replayer (con detección de OPLL incluso en la Master System).

Es un primer paso hacia el desarrollo de juegos para la tarjeta Franky que, como no cuesta mucho, también los haré compatibles con Master System :D



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.