YO <-------
¡Buenas!
Muchas gracias por vuestro interés mostrado previamente en el bug con el que me topé. Después de hacer las modificaciones pertinentes me he encontrado con otro problema recientemente. Espero que no sea un fallo por mi parte y no os haga perder el tiempo.
Después de haber aplicado los cambios mostrados y haber comparado, verificado y reverificado, antes de postear, que estaba generando los archivos exomizados correctamente creo que he encontrado otro problema.
El síntoma es que a la hora de desexomizar usando la rutina deexo_b.asm ésta descomprime demasiado. En mi caso, alrededor, supongo que dependiendo del archivo exomizado empleado, de unos 100 bytes de más. .
El archivo ha sido exomizado usando "exomizer raw -b" y "exomizer raw -b -c" con los mismos/parecidos resultados.
La cosa es que esto ha estado pasando desde que apliqué las modificaciones pero no se ha manifestado hasta ahora. En el código del juego que estaba programando tengo puesta la rutina de descompresión dentro de una función en C a la que le paso los dos punteros necesarios para descomprimir y la única diferencia sería el código que se encuentra antes de la rutina y el final. Esto si no me equivoco no debería afectar en nada a la misma. Lo pongo a continuación:
Código: Seleccionar todo
void uncompressExo206(void* pAddrSrc, void* pAddrDest)
{
__asm
LD L, 4(IX) ; HL = Compressed data
LD H, 5(IX)
LD E, 6(IX) ; DE = Destination data
LD D, 7(IX)
di
call deexo
ei
jp exo_endexec
deexo:
.
.
.
.
.
exo_endexec:
__endasm;
};
y el código que genera el compilador es:
Código: Seleccionar todo
_uncompressExo206:
push ix <----- frame pointer
ld ix,#0
add ix,sp
LD L, 4(IX) ; HL = Compressed data
LD H, 5(IX)
LD E, 6(IX) ; DE = Destination data
LD D, 7(IX)
di
call deexo
ei
jp exo_endexec
deexo:
.
.
.
.
.
exo_endexec:
pop ix
ret
El código adicional generado por el compilador no debería afectar al funcionamiento de la rutina si no me equivoco. Siempre lo he estado haciendo así en otras rutinas que tengo, como la carga de disco por ejemplo, y funcionan todas correctamente. Así que llego a la conclusión que es un problema de la rutina desexomizadora.
Sería de gran utilidad que pudiéseis testear el archivo que adjunto para comprobar que todo es correcto. Me falta decir que al comprobar la descompresión desde la versión del exomizer en windows el archivo se descomprime correctamente. Ha sido comprimido con "exomizer raw -b".
El archivo que adjunto contiene la cabecera de fichero de AMSDOS, aún así la versión de windows, supongo que por estar comprimida con la opción -b, funciona correctamente. En el código de carga del fichero en el CPC dicha cabecera se suprime.
Para depurar lo que hice fué poner un punto de ruptura condicional en las dos instrucciones LDDR que son las que, si no me equivoco, se encargan de volcar los datos a la dirección de destino poniendo como condición "DE < #
dirección_inicial" siendo
dirección_inicial la última dirección donde se descomprimen datos.
Cualquier dato que os falte hacédmelo saber.
¡Saludos!