Revisé el juego Goonies versión XEX de 72670 bytes y descubrí lo siguiente:
Código: Seleccionar todo
65535 [$FFFF] (binhead)
47872-48089 [$BB00-$BBD9] (218) PROG/DATA
738-739 [$02E2-$02E3] (2) -> 47872 [$BB00]
65535 [$FFFF] (binhead)
38656-39167 [$9700-$98FF] (512) PROG/DATA
65535 [$FFFF] (binhead)
39424-39543 [$9A00-$9A77] (120) PROG/DATA
54017-54017 [$D301-$D301] (1) $E3 "11100011"
65535 [$FFFF] (binhead)
16384-31487 [$4000-$7AFF] (15104) PROG/DATA
54017-54017 [$D301-$D301] (1) $E7 "11100111"
65535 [$FFFF] (binhead)
16384-27135 [$4000-$69FF] (10752) PROG/DATA
54017-54017 [$D301-$D301] (1) $EB "11101011"
65535 [$FFFF] (binhead)
16384-32383 [$4000-$7E7F] (16000) PROG/DATA
54017-54017 [$D301-$D301] (1) $EF "11101111"
65535 [$FFFF] (binhead)
16384-25983 [$4000-$657F] (9600) PROG/DATA
54017-54017 [$D301-$D301] (1) $FF "11111111"
65535 [$FFFF] (binhead)
24576-38655 [$6000-$96FF] (14080) PROG/DATA
65535 [$FFFF] (binhead)
5888-12031 [$1700-$2EFF] (6144) PROG/DATA
65535 [$FFFF] (binhead)
1536-1578 [$0600-$062A] (43) PROG/DATA
736-737 [$02E0-$02E1] (2) -> 1536 [$0600]
Por lo tanto, se observa que cada tramo de datos viene precedido de $FFFF (bytes 255, 255), que usualmente sólo se encuentra en los 2 primeros bytes del archivo, pero no está prohibido que vayan entre bloques. Esto permite concatenar binarios y que corran igual. Es más, recuerdo que el ensamblador MAC/65 genera todo el binario con cabeceras completas cada 256 bytes.
Sin conocer el código de CAIN (ninguna versión), me da la impresión que tal vez no esté ignorando esas cabezeras intermedias, y, por ejemplo, está pensando en cargar (38656-65535+1)=
-26878 bytes en lugar de (39167-38656+1)=
512 bytes. Si ese es el valor que está metiendo en la variable L que comentaban, puede ser la causa del error 3 en BASIC.
Y yendo más allá, me puse a revisar el resto, sacando la siguiente información:
El programa carga una rutina de inicialización en la página $BB, es decir, en el área de la pantalla cuando no hay BASIC, y luego llama a esa rutina que pone una presentación, para luego retomar la carga. En ese punto debió haber un pito lento.
Después carga 2 trozos más de código o data consecutiva en memoria (512+120=632 bytes) en la página $97.
A continuación comienza a cargar los 4 bancos de memoria del 130XE. Este banco se ubica en la página $40 y lo accede cargando previamente 1 byte en la dirección $D301 (54017). Cada banco mete hasta 16K de datos y/o código, es decir hasta justo antes de la página $80. Qué porción de código carga en qué banco se puede deducir de los bits que arriba se muestran. No tengo claro si sea necesario meter un pito lento al final de cada bloque donde se hace el cambio de banco.
El último cambio de banco es para volver a la memoria normal, y de ese espacio sólo carga a partir de la página $60 (desde la mitad), pero sigue de largo hasta justo antes de la primera data que cargó después de la presentación, 14K en total.
Luego carga otro bloque de 6K a partir de la página $17 hasat justo antes de la página $2F.
El proceso termina cargando código 43 bytes en la página $06 y le pasa el control. De ahí parte el juego...
NOTA: Cuando hablo de "página" de memoria $XX, me refiero que los datos se cargan a partir de la dirección $XX00, que en decimal corresponde a la dirección de memoria del byte equivalente pero multiplicado por 256.
En resumen, para poder cargar correctamente, el
loader de CAIN no puede estar ubicado en ninguno de los rangos de memoria mencionados en la lista de arriba. Por lo tanto, le quedan disponibles desde la página $07 hasta la $16 (4 kilos) y desde la $30 a la $3F (otros 4 kilos). Ambas zonas son usuales para cargadores (incluyendo el DOS, pero no lo he probado).
Espero que sirva la info...