Gracias por las respuestas, Antonio y pacomix. Las pruebas las estoy haciendo en ensamblador. Mi problema es que debo calcular mal la dirección donde alojar mi archivo comprimido en el caso de que su espacio se solape con el del archivo descomprimido. Los cálculos los estoy haciendo tal cual lo hace en el tuto que indico de cpcwiki (ellos hacen trampa, alojan el archivo comprimido en la memoria de pantalla a pesar de calcular la dirección donde debería ir porque su comprimido es menor de 16 kb). Podéis usar de prueba el archivo que he adjuntado: una vez comprimido ocupa 20 kb.
Os cuento lo que hago: tras "exomizar"
mi archivo pasa de 28709 bytes a 19510. Usando las cábalas que se indican en el tuto, 512 (&200, dirección de inicio) + 28709 (longitud del archivo descomprimido) -1 = 29220 + 5 (safety offset) = 29225 dirección final que ocupará en memoria el juego una vez descomprimido.
29225 - 19510 + 1 = 9711 dirección de inicio del archivo comprimido, que es la que le indico al inyectar el archivo en el disco.
Ensamblo en &8000 (por ejemplo) el cargador y tras él deexo.asm:
load_file:
ld hl,filename ;HL = file name address
ld de,&25EF ;(9711) DE = start address to load file to
ld b,12 ;B = length of file name
call &bc77 ;Open the file header
ex de,hl ;Now HL = start address
push hl ;Store it
call &bc83 ;Load the file
call &bc7a ;Close the file
decompress_file:
pop hl ;HL = start address of compressed file
ld de,&0200 ;DE = start address of decompressed data
call deexo ;Decompress the data
start_game:
jp &1f52 ;Start the game
filename:
db "BOULDERC.BIN" ;Name of file containing compressed data