sábado, 24 de diciembre de 2011

Una de las cosas más complicadas a la hora de programar para MSX es juguetear con los slots. Que si estás en un slot ampliado y tienes que tocar el registro de subslots, que si no hace falta, que si necesitas cambiar la página cero y no tienes la BIOS...

A partir de ahora asumamos que hablamos de una ROM que tiene definida la cabecera en la página 1 (en $4000). Cuando la BIOS del MSX detecta un cartucho ROM de este tipo, antes de saltar a la dirección de inicio, garantiza que la página 0 tendrá visible la BIOS, la página 1 el cartucho y la página 3 la RAM. El contenido de la página 2 queda indefinido y si lo necesitamos es nuestra labor el situarlo ahí.

Si este paso no se hace correctamente, cuando intentemos acceder a la parte del contenido de la ROM que no está en la página 1, vamos a encontrarnos con un bonito cuelgue, ya que vete a saber qué verá el Z80 en esa zona.

¿Cómo se hace esto? Pues de manera genérica lo que hay que hacer es averiguar qué slot (y subslot) está asignado a la página 1 y asignar el mismo slot (y subslot) en las páginas que necesitemos. Comencemos por lo fácil...

ROMS de 32K y megaroms

Desde este punto de vista los cartuchos de 32K y los megaroms se comportan igual: la ROM se sitúa en las páginas 1 y 2 (de $4000 a $BFFF). Así pues, en ambos casos tendremos que situar el slot donde está la ROM en la página 2 del Z80 (de $8000 a $BFFF).

En una ROM que no requiera mapper, lo primero que habría que hacer es comprobar si se ha cargado en RAM o no, porque si estamos cargando el juego en RAM (por ejemplo con ODO), el cargador ya se ha debido ocupar de situar correctamente la memoria. Podríamos pensar que no importa, que si situamos el slot correspondiente en la página 2 nos quedaremos como estábamos. ¡Pues no!

Algunos modelos de MSX tienen la RAM partida, es decir: los 32K superiores y los 32K inferiores no están en el mismo slot, sin ir más lejos el Toshiba HX-20. Por ese motivo, si situamos en la página 2 el mismo slot que está en la página 1 lo estaremos haciendo mal. Por lo tanto, si la ROM se ejecuta desde RAM, no habría que hacer nada en absoluto.

Los megaroms necesitan de un mapper para ser cargados en RAM y lo bueno de los mappers es que garantizan que toda la RAM está en el mismo slot. Así que si estamos desarrollando un megarom, no habría inconveniente en prescindir de la comprobación de si se está ejecutando desde RAM o ROM.

ROMS de 48K lineales

Las ROMS de 48K lineales presentan una dificultad añadida: la BIOS. Estas ROMS se mapean desde $0000 a $BFFF, por lo que hay que tocar las páginas 0 y 2. La página 2 no nos va a dar problemas para situarla, pero la página 0 sí, ya que no podemos utilizar la BIOS para situar dicha página, porque la BIOS está en esa página.

Por este motivo tendremos que realizar una rutina similar a la que se encuentra en la BIOS para poder ejecutarla desde, por ejemplo, la página 1 y así poder cambiar el contenido de la página 0 sin problemas. Además, si queremos poder activar y desactivar la BIOS, necesitaremos almacenar dos variables en RAM: la configuración de slots que apunta a la BIOS y la configuración de slots que apunta a nuestra ROM.

Y ahora... ¡os toca programar!

Bueno... no. ¿Para qué reinventar la rueda si otros ya lo hicieron antes? Es decir, esta es una de las cosas más complicadas de programar el MSX y una de las más ingratas, ya que... ¡no hace nada visible! Pero aún así sigue siendo fundamental.

Por eso, os dejo en la página de descargas de código fuente las rutinas que utilizo en mis programas para situar las páginas de las ROMS. Están basadas en unas rutinas que hizo Ramones en su día, así que tampoco yo he inventado la rueda, sólo he añadido algunas cosillas (como el tema de si se ejecuta en RAM o en ROM).

La primera rutina se llama SETPAGES32K y bastará con hacer un call a la misma para que ella solita nos sitúe nuestra ROM en la página 2. Está en el archivo SETPAGES32K.ASM y no requiere de ninguna variable en RAM.

La segunda rutina se llama SETPAGES48K y el funcionamiento es similar. Está en el archivo SETPAGES48K.ASM y necesita cargar el archivo que contiene la otra rutina, así que si cambiáis el path, tendréis que modificar la línea donde se encuentra el INCLUDE correspondiente.

Además, en este archivo tendremos dos rutinas que también pueden resultar interesantes: RESTOREBIOS que nos devolverá la BIOS a su lugar y SETGAMEPAGE0, que nos volverá a situar la ROM en la página 0. Para ello es necesario reservar dos bytes en RAM donde almacenaremos la configuración de slots de la BIOS (SLOTBIOS) y de la ROM (SLOTGAME), algo que es necesario para que estas dos rutinas puedan cumplir con su cometido.

Espero que con estas ruedas no tengáis problemas a la hora de construir nuevos coches ;)