Programación #6: Juego en ROM para Spectrum 16K usando z88dk+splib2

Pues sí, me ha picado el gusanillo con el concurso que anuncia Radastan para el año que viene. Se trata de hacer un juego que funcione como cartucho ROM del IF2 para Spectrum y que funcione en cualquier Spectrum de 16K. Eso significa que debe ser un juego que ocupe 16K (de $0000 a $3FFF, reemplazando a la ROM), y que tenemos aproximadamente unos 9K de RAM extra para hacer que se mueva (si le quitamos a los 16K del Spectrum 16K los 7K que ocupa la pantalla (VRAM) nos quedamos con 9K).

Esto implica importantes limitaciones (¡por si no tuviéramos ya bastantes!):

  • No podemos usar ninguna rutina de la ROM. Como el juego lo voy a hacer en C usando splib2 para todo, esto no es un problema.
  • Toda la RAM que tenemos está en la zona de la memoria en contienda (la ULA y la CPU se pelean por esta memoria y gana la ULA siempre), por lo que responderá más lentamente.
  • ¡Sólo! tenemos 9K de RAM para jugar, y aquí tendré que meter los aproximadamente 5K que ocupan las estructuras de la splib2, lo que nos deja con 4K para la pila y lo que pueda caber.

La idea es la siguiente: Colocar las estructuras de la splib2 y todas las variables en los 9K de RAM, configurar la splib2 para que ocupe lo justo en la pantalla (de las 24 lineas de carácteres) para que se tarde menos en actualizar el display, usar Orfeus para una musiquilla del menú (si cabe), tener el mapa comprimido en ROM y descomprimirlo en la RAM que quede libre para tener más sitio para código y gráficos y poco más.

En el momento de estar escribiendo estas lineas aún no tengo la seguridad de que lo que quiero hacer sea factible, así que tómate estos artículos más como un “cuaderno de bitácora” que como un “tutorial“, ya que los tutoriales se hacen, por lo general, cuando uno sabe cómo resolver los temas de los que trata, y este no es el caso. Veamos…

A priori, tengo que resolver varias cuestiones:

  • Lograr que splib2 cree sus estructuras a partir de $7000 en lugar de $F000, ya que esto debe funcionar en un Spectrum 16K (que sólo tiene memoria hasta $7FFF en lugar de hasta $FFFF).
  • Aprender a definir en C variables en RAM que se usen desde el código en ROM. Esto sólo habría que hacerlo con las globales, pues las locales se crean en pila y yo la pila la puedo colocar donde yo quiera (en RAM, por supuesto).
  • Ver si el driver de inicialización de z88dk para Spectrum (el crt0) funciona desde ROM. Si no, tendré que sustituirlo por la solución que me explicó Albrecht para dejar sólo el código mínimo.

Lo suyo sería ir resolviendo estos “problemas” cada uno en su capítulo propio. Con suerte, será posible crear juegos que funcionen desde ROMs con z88dk+splib2, y esta colección de artículos tendrán su valor y no serán meras elucubraciones y paranoias.

Por lo pronto tenemos que tener en cuenta que sólo dispondremos de la memoria que va desde $4000 hasta $7EFF, y que ahí está también nuestra memoria VRAM. Sería cuestión ver cómo voy de memoria, pero no me parece nada descabellado dejar el juego ocupando dos tercios de la pantalla y usar el restante para meter código o datos. Son 2Kb que me gano, así, a lo tonto, con lo que tendría un total de 6Kb para meter mis cosas, 5Kb para la splib2 y 5Kb para la pantalla.

El tipo de juego que haré será, por supuesto, de plataformas. Usaré la versión más sencilla del motor de plataformas, que no será más que una especie de “movimiento Phantomasa 1 pero pixel a pixel“. Básicamente, trasladar el algoritmo que os he ido enseñando de BASIC a C y adaptarlo para que se mueva pixel a pixel (no es gran cosa, ya veréis).

Primer paso: splib2 para Spectrum 16K

Lo primero que tenemos que conseguir es que la llamada a sp_Init () cree las estructuras necesarias para el funcionamiento de splib2 en una zona de memoria compatible con el Spectrum 16K. Sin tocar, sp_Init () las crea a partir de $F000 hasta el final de la memoria, $FFFF. El objetivo es conseguir que se creen desde $7000 hasta $7FFF.

Por suerte, Alvin Albrecht hizo las cosas bien e incluyó un archivo de configuración. En teoría, sólo tendremos que alterar los valores de este archivo de configuración y recompilar splib2. Os recomiendo que primero hagáis una copia de splib2.lib y que una vez compilado todo renombréis la nueva splib2.lib a splib16.lib por ejemplo y restauréis la copia original.

Otra cosa que haremos en el archivo de configuración será limitar las lineas de pantalla que gestionará splib2 (si al final decidimos limitar la acción a dos tercios de la misma), pero esto será cuando hayamos diseñado el juego. Además, también nos cargaremos la tabla de interrupciones ya que no las vamos a usar para nada (¡yuju, 257 bytes más :D!). Pero por ahora solo estamos probando.

Consultando el manual de splib2 nos enteramos de que el archivo que tenemos que tocar es SPconfig.def. Si lo examinamos, encontramos justo lo que necesitamos: hay dos directivas especiales para colocar la tabla de interrupciones y los buffers de splib2. Cambiando su valor por defecto ($F000) por el que queremos nosotros ($7000) y recompilando la biblioteca lo tenemos listo:

    DEFC SProtatetbl = $7000
;     the base address of the horizontal rotate table must be a
;     multiple of $1000; actual memory occupied is SProtatetbl+$200
;     to SProtatetbl+$fff
;
;
; * IM2 INTERRUPT VECTOR TABLE
;
    DEFC IM2TABLE    = $7000 ; LSB = $00
;     the base address of the im 2 interrupt vector table;
;     occupies 257 bytes if EVENVECTORS is false, 256 otherwise

Por ahora poco más. En el próximo artículo intentaremos generar una ROM, intentaremos ver cómo colocar las variables en RAM, y veremos si es realmente factible hacer lo que queremos hacer. Hasta entonces… ¡sed buenos!

2 Responses to Programación #6: Juego en ROM para Spectrum 16K usando z88dk+splib2

  1. Radastan dice:

    Je,je,je… evidentemente es más sencillo usar el lenguaje ensamblador, pero en C también es posible hacer cosas con estas limitaciones. Estoy preparando un pequeño tutorial de elaboración de cartuchos IF2 en ensamblador, coincidiendo con la presentación oficial del concurso después de Navidad.

    Me alegro que os animéis, veo muy interesante y práctico empezar a realizar juegos en cartucho. Es muy sencillo hacerse un Interface 2 casero, o pillarse uno original/compatible. Y lo mejor de todo es que este sistema es de carga instantánea y fiable al 100%.

  2. na_th_an dice:

    Sí, la verdad😀 me parece una idea genial. Lo de querer hacerlo en C obedece a una doble finalidad: por un lado, porque es muy cómodo hacer juegos en C, y, por otro lado, porque creo que soy el primer jipi que se pone a esto, y mola el desafío🙂

    Por cierto, ya soy capaz de generar ROMs que funcionan😀 Lo próximo será ver si es posible usar splib2. Crucemos los dedos🙂

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: