Exomizer 2, rutinas actualizadas

Programando el Amstrad en Ensamblador.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.

De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Lun 11 Feb , 2013 10:45 pm

Voy a mirarlo. Por cierto las opciones de exomizer son un poco liosas, se me olvidó decirle a Metalbrain que pusiera la línea de comandos correcta cuando se llama a exomizer. Te pongo un listado aquí:

Código: Seleccionar todo

deexo.asm exomizer raw <input> -o <output>
deexo_simple.asm exomizer raw <input> -c -o <output>
deexo_b.asm exomizer raw <input> -b -o <output>
deexo_simple_b.asm exomizer raw <input> -b -c -o <output>
En las optimizadas es más fácil usar compress.bat, pero se puede hacer a la antigua usanza con una de estas 4 llamadas:

Código: Seleccionar todo

exomizer raw <ifile> -o <ofile>
exomizer raw <ifile> -c -o <ofile>
exomizer raw <ifile> -b -r -o <ofile>
exomizer raw <ifile> -b -r -c -o <ofile>
Edito: Me he dado cuenta que no está el DSK, si lo subes te lo podría depurar.

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Mar 12 Feb , 2013 12:28 am

Yo estoy flipándolo...

Mira esto...
OhMyGot!.png
O_o
Voy a probar a borrarle los primeros 128bytes al convertido y a probar con el Winmerge. Y... perfecto. Tienes razón. Si lo dice winmerge es que es verdad. ¡Son iguales!
Ostias entonces el Notepad++ con el plugin WinHex falla en algo... ¡esto no hay derecho! Mil perdones.
Es más... ahora mismo el Notepad++ me ha dicho que hay una actualización disponible. Estaba actualizando mientras escribía este mensaje y mira:
Notepá.png
Notepá
Pues entonces eso no deja otra duda. Mierdaaaaaaaaaa... sigo con lo mismo de la descompresión... No me tira. ¿Alguna otra idea?

Yo <----------------- DESMORALIZADO
Adjuntos
OhMyGot!.png
O_o

Avatar de Usuario
Mochilote
Keeper of The Forum
Keeper of The Forum
Mensajes: 903
Registrado: Sab 08 Oct , 2005 4:26 pm
Contactar:

Re: Exomizer 2, rutinas actualizadas

Mensajepor Mochilote » Mar 12 Feb , 2013 6:36 am

Yo estoy flipándolo...

...

Pues entonces eso no deja otra duda. Mierdaaaaaaaaaa... sigo con lo mismo de la descompresión... No me tira. ¿Alguna otra idea?

Yo <----------------- DESMORALIZADO
Jeje, tu tranquilo, que al final saldrá. Se me ocurren varias cosas que pueden estar liándote:

-Ignoro como haces la carga de ficheros, pero si la memoria no me falla, si utilizas las funciones del firmware, en la carga el firmware analiza la cabecera y luego la quita, es decir, la cabecera no la copia en la dirección de carga.

-¿Has comprobado mediante carteles/printf, después de la carga del fichero a imprimir por pantalla el valor de los primeros bytes donde se ha cargado y los has comparado con el fichero original? Puedes probar a limpiar primero la memoria (todo a 0) mediante un memset (o LDIR en asm) y comprobar si después de la carga ya no está a cero (por si falla la carga y estabas siempre viendo la basura que había en la memoria).

A ver si te sirve de algo,

Saludos.

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Mié 13 Feb , 2013 12:00 am

Pues ya no sé qué más hacer :(
He pausado la emulación con el winape justo después de la carga de los archivos y tanto como la pantalla de carga y los datos comprimidos son exactamente iguales a los que están en los archivos en el disco.
Si exomizo el archivo con las opciones -b -r -c únicamente obtengo basura y si lo exomizo con -b -c obtengo parte de la pantalla correcta y el resto corrupto. eso usando la rutina deexo_simple_b.asm

Si uso deexo_b.asm y exomizo con -b -c o con -b consigo que al menos se me dibujen dos líneas de la pantalla y el resto o las ignora o se descomprimen a saber donde...

La carga de disco es correcta ya que he salvado los datos que carga directamente de la memoria, con el winape, a un archivo y luego los he comparado con los originales antes de cpcdiskearlos. En el .zip adjunto de este post podéis comprobarlo. Tiene la extensión .sav.

Estoy usando únicamente los archivos que se proveen dentro del Exomizer 2.06. Nada de los optimizados.

¿Qué puedo hacer?

Ignoro como haces la carga de ficheros, pero si la memoria no me falla, si utilizas las funciones del firmware, en la carga el firmware analiza la cabecera y luego la quita, es decir, la cabecera no la copia en la dirección de carga.
La carga de disco usa las fdctools así que no usa el firmware para nada. Automáticamente se salta la cabecera. Es por ello que no funciona como bien dije por ahí arriba sin las cabeceras de Amsdos. Pero eso ahora no es problema. Todo carga perfectamente y comprobado.
¿Has comprobado mediante carteles/printf, después de la carga del fichero a imprimir por pantalla el valor de los primeros bytes donde se ha cargado y los has comparado con el fichero original? Puedes probar a limpiar primero la memoria (todo a 0) mediante un memset (o LDIR en asm) y comprobar si después de la carga ya no está a cero (por si falla la carga y estabas siempre viendo la basura que había en la memoria).
Ya te digo... Dentro del zip que adjunto están los ficheros FBACK.EXO y fback.exo.sav. El .sav contiene el volcado de memoria. Ambos son iguales. Comparados con el Winmerge.

La cosa es que si descomprimo con el exomizer en windows el archivo resultante (fbackdex.exo) es correcto. Es el mismo que el original. Conque todo apunta a que algo puede estar yendo mal en la rutina de descompresión para el Z80.

¿Podría intentar alguien descomprimir el archivo nativamente en el amstrad? Ya sé que es mucha molestia pero es que no veo dónde puede estar el error a no ser que haya metido la pata convirtiendo las rutinas. ](*,) ](*,) ](*,)
deexo.zip
fback last
(42.67 KiB) Descargado 119 veces

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Mié 13 Feb , 2013 1:06 am

Hola pacomix

He depurado hasta que se cuelga y he comparado el bitstream comprimido con el archivo original y me da la siguiente diferencia:

Código: Seleccionar todo

Comparando archivos fback.exo y FBACKMEMO.BIN
00000FA7: FC 60
Por lo que en un momento dado el byte 5FA7 se corrompe. No tengo ni idea de a qué puede deberse, y me extraña porque están las interrupciones deshabilitadas. Trataré de mirarlo con más calma mañana.

Edito: Ya he encontrado el fallo, que por cierto no es tuyo sino mío. Había un bug en los descompresores oficiales. Hay que cambiar esto:

Código: Seleccionar todo

dec d
jp p, exo_dontgo
Por esto otro:

Código: Seleccionar todo

dec d
inc d
jr nz, exo_dontgo
Así que gracias por "molestarme" porque has descubierto un bug que se me había pasado por alto. Sólo fallaba cuando la longitud estaba entre 256 y 511, si no lo hemos detectado antes ha sido porque en nuestros archivos de test no se producían coincidencias de esa longitud.

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Mié 13 Feb , 2013 3:00 am

Habrá que ver cual es la solución más rápida. De momento esta solución es mejor:

Código: Seleccionar todo

rlc d
jr nz, exo_dontgo
dec e
ld bc, 512+32 ;2 bits, 48 offset
jr z, exo_goforit
dec e ;2?
exo_dontgo: ld bc, 1024+16 ;4 bits, 32 offset
jr z, exo_goforit
ld de, 0
ld c, d ;16 offset
exo_goforit: call exo_getbits1

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Mié 13 Feb , 2013 9:04 pm

ARgngngng... Bueno. Después de tanto sufrimiento encontramos/taste el problema. Lo bueno de todo esto es que se ha encontrado un bug y ha sido solucionado.
No tengas ningún reparo en agenciarte el archivo comprimido para agregarlo a las pruebas unitarias que realicéis para la posteriores versiones. :)

¡Muchas gracias por todo! ¡A Exomizar!

¡Saludos!

Avatar de Usuario
Metalbrain
Forero habitual
Forero habitual
Mensajes: 151
Registrado: Mar 30 Oct , 2007 1:45 pm
Ubicación: Sevilla

Re: Exomizer 2, rutinas actualizadas

Mensajepor Metalbrain » Jue 14 Feb , 2013 8:40 am

Hola Antonio
Habrá que ver cual es la solución más rápida. De momento esta solución es mejor:

Código: Seleccionar todo

rlc d
jr nz, exo_dontgo
dec e
ld bc, 512+32 ;2 bits, 48 offset
jr z, exo_goforit
dec e ;2?
exo_dontgo: ld bc, 1024+16 ;4 bits, 32 offset
jr z, exo_goforit
ld de, 0
ld c, d ;16 offset
exo_goforit: call exo_getbits1
Este código solo vale para los descompresores normales, supongo que para los simples basta con hacer el otro cambio que pusiste antes de inc d, jr nz en lugar de jp, ¿no?

Lo digo por mandarle la corrección a Magnus lo antes posible.

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Jue 14 Feb , 2013 9:22 am

Hola Antonio
Habrá que ver cual es la solución más rápida. De momento esta solución es mejor:

Código: Seleccionar todo

rlc d
jr nz, exo_dontgo
dec e
ld bc, 512+32 ;2 bits, 48 offset
jr z, exo_goforit
dec e ;2?
exo_dontgo: ld bc, 1024+16 ;4 bits, 32 offset
jr z, exo_goforit
ld de, 0
ld c, d ;16 offset
exo_goforit: call exo_getbits1
Este código solo vale para los descompresores normales, supongo que para los simples basta con hacer el otro cambio que pusiste antes de inc d, jr nz en lugar de jp, ¿no?

Lo digo por mandarle la corrección a Magnus lo antes posible.
En realidad es lo mismo poner inc d / dec d que rlc d, tanto en ciclos como en bytes, pero he puesto rlc porque es una línea menos. En los simples no nos vale el truco de ld de,0 / ld c,d porque c se carga a 128. No se me ocurre ninguna solución más rápida. Los cambios están actualizados en el repositorio.

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 26 May , 2013 6:25 pm

YO <------- :cry:


¡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!
Adjuntos
1_lv.zip
Exomized file (first 128bytes AMSDOS header)
(4.13 KiB) Descargado 118 veces

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 26 May , 2013 9:40 pm

No he visto el código pero estoy seguro al 99% que estás usando una versión del descompresor sin literales cuando el bitstream comprimido sí los tiene, o todo lo contrario, usas un descompresor con literales y el bitstream no los genera. Prueba a comprimir con el parámetro -c en exomizer (o el guión si usas compress) a ver si no te da error.

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 26 May , 2013 9:56 pm

Para evitar que te ocurra esto, utiliza siempre el descompresor que te genera exoopt (el archivo d.asm), y si vas a usar el mismo descompresor con varios bitstreams, emplea una única llamada a exoopt.

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 26 May , 2013 11:05 pm

¡Hola!

El código que estoy usando es el que usa literales. Y sí... tenías razón. Estaba usando el compresor sin la opción -c. Pero hice también pruebas con la opción -c obteniendo los mismos resultados.
Acabo de revisar el código con el que está en la versión 2.07 y es el mismo. Lo tienes aquí adaptado a la sintaxis que usa SDCC para compilar inline assembler. _gBuffer es una variable de preprocesador definida a #0xC000.

Código: Seleccionar todo

deexo: ld iy, #_gBuffer+#11 ;#0x1000+#11
ld a, (hl)
dec hl
ld b, #52
push de
cp a
exo_initbits: ld c, #16
jr nz, exo_get4bits
.db #0xDD, #0x69 ;ld ixl, c
ld de, #1 ;DE=b2
exo_get4bits: call exo_getbit ;get one bit
rl c
jr nc, exo_get4bits
inc c
push hl
ld hl, #1
ld 41(iy), c ;bits[i]=b1 (and opcode 41 == add hl,hl)
exo_setbit: dec c
jr nz, exo_setbit-#1 ;jump to add hl,hl instruction
ld -11(iy), e
ld 93(iy), d ;base[i]=b2
add hl, de
ex de, hl
inc iy
pop hl
.db #0xDD, #0x2D ;dec ixl
djnz exo_initbits
pop de
jr exo_mainloop
exo_literalrun: ld e, c ;DE=1
exo_getbits: dec b
ret z
exo_getbits1: call exo_getbit
rl e
rl d
jr nc, exo_getbits
ld b, d
ld c, e
pop de
exo_literalcopy:lddr
exo_mainloop: inc c
call exo_getbit ;literal?
jr c, exo_literalcopy
ld c, #239
exo_getindex: call exo_getbit
inc c
jr nc, exo_getindex
ret z
push de
ld d, b
jp p, exo_literalrun
ld iy, #_gBuffer-#229 ;#0x1000-#229
call exo_getpair
push de
rlc d
jr nz, exo_dontgo
dec e
ld bc, #512+#32 ;2 bits, 48 offset
jr z, exo_goforit
dec e ;2?
exo_dontgo: ld bc, #1024+#16 ;4 bits, 32 offset
jr z, exo_goforit
ld de, #0 ;16 offset
ld c, d
exo_goforit: call exo_getbits1
ld iy, #_gBuffer+#27 ;#0x1000+#27
add iy, de
call exo_getpair
pop bc
ex (sp), hl
ex de, hl
add hl,de
lddr
pop hl
jr exo_mainloop ;Next!

exo_getpair: add iy, bc
ld e, d
ld b, 41(iy)
call exo_getbits
ex de, hl
ld c, -11(iy)
ld b, 93(iy)
add hl, bc ;Always clear C flag
ex de, hl
ret

exo_getbit: srl a
ret nz
ld a, (hl)
dec hl
rra
ret
REspecto a lo de exoopt lo revisaré mañana cuando ya tenga más tiempo. Ahora mismo ya estoy en las últimas :)

¡Muchas gracias por tus sugerencias!

pacomix
Forum Addict
Forum Addict
Mensajes: 459
Registrado: Dom 11 Nov , 2012 8:05 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Lun 27 May , 2013 11:32 am

Se me olvidó poner ayer... aún no usando exoopt las rutinas que aparecen en el zip oficial de exomiyer 2.07 deberían funcionar perfectamente sin usar exoopt, ¿cierto?
Luego probaré a usar también la versión simple por si arregla algo. Otra cosa... exoopt no está incluído en el zip oficial de exomizer 2.07. ¿Desde dónde me pueod descarga la última versión de exoopt?

antoniovillena
Forero habitual
Forero habitual
Mensajes: 115
Registrado: Mar 26 Abr , 2011 9:25 pm

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Lun 27 May , 2013 12:28 pm

Ups, pues es cierto. La versión optimizada se puede descargar de aquí:

http://retrolandia.net/foro/showthread. ... 285#pid285

Lo que puedo hacer es probar el archivo con Ticks, así si me da error es porque hay un bug, y si no es por otra razón. Pásame el archivo sin comprimir, los valores de HL, DE, dirección de la tabla temporal y dirección donde ubicas el descompresor.


¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic