Con el beneplácito de la afición me permito dar unas breves indicaciones para que el quiera y le apetezca pueda hacer una megarom con el SDCC.
El motivo de abrir este hilo es que yo no he encontrado informacion al respecto más allá del mini tutorial que en su día hizo Nerlaska para hacer ROMs de 32 kb, y como complemento al mismo (siempre que tenga su permiso, of course), me permito compartir lo poco que he podido descubrir por mis propios haberes y saberes.
En primer lugar he creado un fichero .sh (el equivalente a los .bat del DOS pero en Linux) con el siguiente contenido
#!/bin/sh -e
#
# ...compiler at last (take note about '--data-loc' must be changed for each subpage)
#
echo "--------------------------------------------------------------"
echo "Compiling C file"
echo "--------------------------------------------------------------"
sdcc -mz80 --no-std-crt0 --code-loc 0x4010 --data-loc 0xC000 main.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage03.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage04.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage05.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage06.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage07.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage08.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage09.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage10.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage11.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage12.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage13.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage14.c
sdcc -mz80 --no-std-crt0 --code-loc 0xA000 --data-loc 0xC000 subpage15.c
echo " "
echo "* Building MEGAROM 128K"
echo "-------------------------------------------------------------"
echo "** running hex2bin"
./Hex2bin.exe -e bin main.ihx
./Hex2bin.exe -e bin subpage03.ihx
./Hex2bin.exe -e bin subpage04.ihx
./Hex2bin.exe -e bin subpage05.ihx
./Hex2bin.exe -e bin subpage06.ihx
./Hex2bin.exe -e bin subpage07.ihx
./Hex2bin.exe -e bin subpage08.ihx
./Hex2bin.exe -e bin subpage09.ihx
./Hex2bin.exe -e bin subpage10.ihx
./Hex2bin.exe -e bin subpage11.ihx
./Hex2bin.exe -e bin subpage12.ihx
./Hex2bin.exe -e bin subpage13.ihx
./Hex2bin.exe -e bin subpage14.ihx
./Hex2bin.exe -e bin subpage15.ihx
echo "-------------------------------------------------------------"
echo "** adding header..."
echo "-------------------------------------------------------------"
cat rom_header.b > megarom.rom
cat main.bin >> megarom.rom
echo "-------------------------------------------------------------"
echo "** running fillfile with main module"
echo "-------------------------------------------------------------"
./FillFile.exe megarom.rom 24576
echo "-------------------------------------------------------------"
echo "** running fillfile with subpages"
echo "-------------------------------------------------------------"
./FillFile.exe subpage03.bin 8192
./FillFile.exe subpage04.bin 8192
./FillFile.exe subpage05.bin 8192
./FillFile.exe subpage06.bin 8192
./FillFile.exe subpage07.bin 8192
./FillFile.exe subpage08.bin 8192
./FillFile.exe subpage09.bin 8192
./FillFile.exe subpage10.bin 8192
./FillFile.exe subpage11.bin 8192
./FillFile.exe subpage12.bin 8192
./FillFile.exe subpage13.bin 8192
./FillFile.exe subpage14.bin 8192
./FillFile.exe subpage15.bin 8192
echo "-------------------------------------------------------------"
echo "** creating ASCII8 MEGAROM at last"
echo "-------------------------------------------------------------"
cat subpage03.bin >> megarom.rom
cat subpage04.bin >> megarom.rom
cat subpage05.bin >> megarom.rom
cat subpage06.bin >> megarom.rom
cat subpage07.bin >> megarom.rom
cat subpage08.bin >> megarom.rom
cat subpage09.bin >> megarom.rom
cat subpage10.bin >> megarom.rom
cat subpage11.bin >> megarom.rom
cat subpage12.bin >> megarom.rom
cat subpage13.bin >> megarom.rom
cat subpage14.bin >> megarom.rom
cat subpage15.bin >> megarom.rom
echo " "
echo "... Job was finished"
echo " "
El código compila cada bloque por separado, el primero de todos es de 24 kb (8 kb x 3), y el resto son de 8 kb que se ensamblan en la dirección A000h, pero que nada impide hacerlo en otra, y donde la idea es incluir datos (no código), aunque al igual que antes tampoco hay impedimento para usar código siempre que se sepa a que dirección hay que llamar. Luego pasa del formato .ihx al binario y se termina de rellenar con basura hasta los 8kb para finalmente concatenar todos los archivos que generan la megarom final
lo siguiente que he hecho es cambiar la línea que Nerlaska añadió para detectar los 32 kb
g_slotPort = (g_slotPort & 0xCF) | ((g_slotPort & 0x0C) << 2);
por una llamada a la siguiente función, que fue PLAGIADA directamente del ASMSX, el motivo principal es que no pierdo el contacto con la máquina, pasando además de las opciones del compilador
void search(void)
{
/* ensambla pagina 2 para ROM y MEGAROM que arrancan en la página 1 */
/* solo hay que llamarla una vez */
/* PLAGIADO del asmsx */
_asm
call 0x0138 ;RSLREG
rrca
rrca
and #0x03
; Secondary Slot
ld c,a
ld hl,#0x0FCC1
add a,l
ld l,a
ld a,(hl)
and #0x80
or c
ld c,a
inc l
inc l
inc l
inc l
ld a,(hl)
; Define slot ID
and #0x0C
or c
ld h,#0x80
; Enable
call 0x0024 ;ENASLT
_endasm;
}
y por último me hice con una funcion para la seleccion de los bancos, tal como la que sigue, donde subpage indica la subpagina de la megarom (que como todos ya sabeis va de la 0 a la 15 en Megaroms de 128 kb)
void select(unsigned char subpage, int adress)
{
/*
Es importante saber que las MEGAROM usan solo las 32 kb intermedias, por tanto en el formato ASCII8
el banco 0 = 0x4000 (8kb)
el banco 1 = 0x6000 (8kb)
el banco 2 = 0x8000 (8kb)
el banco 3 = 0xA000 (8kb)
*/
subpage=subpage;
if (adress==0xA000) {
_asm
ld a,4(ix)
ld (0x7800),a
_endasm;
} else if (adress==0x8000) {
_asm
ld a, 4(ix)
ld (0x7000),a
_endasm;
} else if (adress==0x6000) {
_asm
ld a, 4(ix)
ld (0x6800),a
_endasm;
} else if (adress==0x4000) {
_asm
ld a, 4(ix)
ld (0x6000),a
_endasm;
}
}
voila!!,
tenemos una megarom de 128 kb en formato ASCII8kb
Por supuesto admito críticas y mejoras, (hasta aclaraciones)
La idea es simplemente mostrar que es muy sencillo hacer una megarom en C, a pesar de que con el AsMSX es incluso mas sencillo, pero siempre es bonito que haya variedad.