Y ahora una explicación sobre lo que he hecho para montarlo. Se parece bastante a lo que pone en whatsnew.txt.
BinariosMuevo los archivos comprimidos con las pantallas fijas a /bin. En esta carpeta es donde se preparan los binarios que luego se ponen en las páginas de RAM extra de los modelos de 128K. Los juegos de 128K usan un sistema que hemos llamado el "bibliotecario", que se encarga de colocar todos tus binarios en ram extra y asignarles un numerico. Luego, usando ese numerico, los puedes descomprimir donde tú quieras. El primer paso es coger todos los binarios y ponerlos en /bin.
Es necesario que, aunque no lo usemos, haya un marco.bin, así que lo creo en /bin como un archivo vacío. Esto es para que los tres primeros "recursos" del bibliotecario siempre sean las tres pantallas y tengan siempre los números 0, 1 y 2. Esto es una exigencia de la churrera. El tema está preparado para que podamos meter más cosas, pero las tres primeras cosas de la RAM extra siempre deben ser las tres pantallas comprimidas.
Por ejemplo, en Windows, botón derecho->nuevo archivo de texto, y luego le ponemos de nombre marco.bin. Así creamos un marco.bin vacío (de 0 bytes, vaya) en /bin.
Ahora edito /bin/list.txt y compruebo que aparecen, en este orden, los tres archivos binarios de nuestro almacén de cosas:
$this->bbcode_second_pass_code('', 'title.bin
marco.bin
ending.bin')
El archivo list.txt es donde el bibliotecario mira qué binarios tiene que empaquetar y catalogar. En nuestro juego sólo tenemos ahí las tres pantallas comprimidas. En Goku Mal, por ejemplo, ahí iban los cinco niveles y todas las pantallas fijas de las intros.
Cargador BASIC y make.batNuestro juego ahora tendrá dos bloques más de datos: uno que irá en RAM1 y que tendrá el player y la música, y otro que irá en RAM3 con los archivos comprimidos. Además, habrá que incluir en el cargador el código que carga los nuevos bloques y los mueve a sus ubicaciones definitivas en la RAM extendida. Por tanto, tengo que modificar loader.bas y make.bat. En la carpeta /spare de la Churrera 3.99.3 están los que usé en Goku Mal, y me he basado en ellos. Lo primero que hace loader.bas después de cargar la pantalla es cargar un bloque "reubica" que es el que moverá los datos extra a la RAM extra y que habrá que generar a partir de reubica.asm en nuestro make.bat
loader.bas$this->bbcode_second_pass_code('', '10 BORDER NOT PI:PAPER NOT PI:INK NOT PI:CLEAR VAL"24199":LET a=VAL"25000":LET b=a+VAL"2":LOAD""SCREEN$:POKE VAL"23739",CODE"o":LOAD""CODE:LOAD""CODE:POKE a,VAL"1":RANDOMIZE USR b:LOAD""CODE:POKE a,VAL"3":RANDOMIZE USR b:LOAD""CODE:RANDOMIZE USR VAL"24200"')
make.bat$this->bbcode_second_pass_code('', '@echo off
echo ### COMPILANDO SCRIPT ###
cd ..\script
msc dogmole.spt msc.h 24
copy *.h ..\dev
cd ..\dev
echo -------------------------------------------------------------------------------
echo ### GENERANDO BINARIOS ###
echo * Building reubica
..\utils\pasmo reubica.asm reubica.bin
echo * Building RAM3 AND RAM4 AND RAM6
cd ..\bin
librarian.exe
copy RAM3.bin ..\dev\ram3.bin
copy librarian.h ..\dev
echo -------------------------------------------------------------------------------
echo ### COMPILANDO WYZ PLAYER ###
cd ..\mus
..\utils\pasmo WYZproPlay47aZX.ASM ram1.bin
copy ram1.bin ..\dev
cd ..\dev
echo -------------------------------------------------------------------------------
echo ### COMPILANDO GUEGO ###
zcc +zx -vn dogmole.c -o dogmole.bin -lsplib2 -zorg=24200
echo -------------------------------------------------------------------------------
echo ### CONSTRUYENDO CINTA ###
..\utils\bas2tap -a10 -sLOADER loader.bas loader.tap
..\utils\bin2tap -o reubica.tap -a 25000 reubica.bin
..\utils\bin2tap -o ram1.tap -a 32768 ram1.bin
..\utils\bin2tap -o ram3.tap -a 32768 ram3.bin
..\utils\bin2tap -o screen.tap -a 16384 loading.bin
..\utils\bin2tap -o main.tap -a 24200 dogmole.bin
copy /b loader.tap + screen.tap + reubica.tap + ram1.tap + ram3.tap + main.tap dogmole.tap
echo -------------------------------------------------------------------------------
echo ### LIMPIANDO ###
del loader.tap
del screen.tap
del main.tap
del reubica.tap
del ram1.bin
del ram3.bin
del ram1.tap
del ram3.tap
del dogmole.bin
del zcc_opt.def
echo -------------------------------------------------------------------------------
echo ### DONE ###')
Esto es lo que hace nuestro make.bat
$this->bbcode_list('1')
Compila el script y copia sus archivos en /devEnsambla reubica.asm en reubica.binEjecuta "librarian" en /bin, que leerá list.txt y creará nuestro binario para poner en RAM3, además de un librarian.h con la lista de recursos. Luego se copia librarian.h y ram3.bin en /devEnsambla el player de WYZ con las canciones y genera ram1.bin. Luego copia ram1.bin en /devCompila el güego.Crea una cinta con el cargador, la pantalla, reubica.bin, ram1 y ram3, y el juego.Hace limpieza de cacafuti.El player y las músicasUsamos el player que hizo WYZ, que toca músicas que se pueden componer con el tracker que hizo Augusto Ruiz. Este tracker exporta instrumentos como archivos .asm y canciones como archivos .mus. Necesitamos un archivo de instrumentos global para todas las canciones, por lo que todas las canciones habrá que crearlas usando los mismos instrumentos.
Así, para probar, he cogido tres canciones del Maritrini 1 (también de Augusto Ruiz) y sus instrumentos y los he puesto en /mus. Estos son los archivos:
- instrumentos.asm
- menu.mus
- level1.mus
- gameending.mus
Edito WYZproPlay47aZX.ASM, que es el player, y me voy al final, para activarle tres canciones e incluir mis archivos. El final del archivo queda así:
$this->bbcode_second_pass_code('', '...
;; INCLUIR LOS DATOS DE LA MUSICA (PATTERNS/EFFECTS)
INCLUDE "instrumentos.asm"
SONG_0: INCBIN "menu.mus"
SONG_1: INCBIN "level1.mus"
SONG_2: INCBIN "gameending.mus"
;; INCLUIR LOS EFECTOS DE SONIDO:
INCLUDE "efectos.asm"
TABLA_SONG: DW SONG_0, SONG_1, SONG_2
TABLA_EFECTOS: DW EFECTO0, EFECTO1, EFECTO2, EFECTO3, EFECTO4, EFECTO5, EFECTO6, EFECTO7, EFECTO8
;; NADA A PARTIR DE AQUI!!!
BUFFERS_CANALES:
DB 0
')
Cambios en el motorYa casi lo tenemos. Ahora hay que hacer unas mínimas adaptaciones en el código del motor.
En primer lugar, para que funcione el güego con RAM extra de los modelos de 128K hay que mover la pila a un sitio seguro, porque por defecto se ubica justo en el sitio donde se colocan las páginas de RAM extra y se arma el pifostio padre. Lo que hacemos es moverla justo debajo del binario del juego. Editamos dogmole.c y, arriba del todo, nos aseguramos de que quede así:
$this->bbcode_second_pass_code('', '#pragma output STACKPTR=24099')
Ahora hay que poner las llamadas para que suene la música en el momento apropiado. Nosotros tenemos tres: título, ingame, y final. Abrimos mainloop.h y colocamos las llamadas pertinentes:
linea 163: wyz_play_music (0); música de título
linea 272 y 696: wyz_play_music (1); que es nuestra canción.
linea 854: wyz_play_music (2); canción del final.
Tal y como estaba, el código del Ramiro usaba el beeper para hacer ruido mientras salía el texto, y eso ya no nos vale porque no estamos incluyendo el código del beeper para ahorrar memoria (ya que la música y el sonido es ahora por el chip AY y eso está en RAM1). En extern.h, por lo tanto, cambiamos la llamada que hay a peta_el_beeper por wyz_play_sound.
Y, por último, lo más importante: en config.h, activo
MODE_128KNo he probado lo del extern con los textos, ahora lo haré, pero debería funcionar.