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
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 » Dom 10 Feb , 2013 12:14 pm

Como dije hay veces que se cuelga y hay veces que sigue luego por donde iba pero me sobreescribe algunos bytes por debajo de la dirección de destino que le pongo.

¿Alguna idea?
Cuando dices por debajo... ¿te refieres a las direcciones de menor valor?

Se me ocurre que pudieras no tener en cuenta que al escoger la variedad backwards, no tengas en cuenta que tienes que poner de parámetros las posiciones del último byte tanto en origen como en destino. Si cargas los datos en una dirección, y luego pones como origen esa misma dirección, pues empieza a descomprimir por el último byte y sigue luego descomprimiendo lo que hubiera por delante de esa dirección de carga... entonces puede encontrar un final pronto (con lo que obtienes algo de basura a partir de la dirección que pusiste de destino, hacia atrás), o no encuentra ese final en los datos erroneos que intenta descomprimir, y termina corrompiendo tu memoria y colgando el ordenador.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 4:12 pm

Comando usado para comprimir con exomizer 2.05:

exomizer raw -b -r -c c:\amstrad\sources\011-CompScr\data\fback.bin -o c:\amstrad\sources\011-CompScr\data\FBACK.EXO

Comando usado para exoopt:

exoopt c:\amstrad\sources\011-CompScr\data\fback.exo 0x1000 b3

El fichero descomprimido es una captura de pantalla de 16384 bytes.
La rutina que he usado es la deexo_b_simple.asm adaptada para ser usada dentro de una función de SDCC. La puedes encontrar adjunta.

El código tiene la pila configurada en 0x0FFF y el main empieza en 0x06D9.
El punto de entrada a la función de descompresión está en 0x0138.
La función de descompresión está modificada de modo que el buffer apunta a 0x1000. Ahí tengo definido un array de 256 bytes.

El main:
- Configura el CRTC para el modo que uso (128x240) y pantalla de 32KB (aunque esto no es estrictamente necesario).
- Carga el fichero sin comprimir en el área de memoria de la pantalla (0x8000) y luego la borra. Esto es para ver que todo funciona bien.
- Carga el fichero optimizado con exoopt en memoria en 0x5000 (tiene 0x15D5 bytes) y lo intenta descomprimir en 0x8000.
- A la función le paso 0x8000 como dirección de destino a descomprimir.
- Aún pasándole ambos valores empezando por el último byte no funciona.
- Pasándole 0x5000 como dirección de comienzo de los datos comprimidos y 0xBFFF como dirección de destino obtengo algo en pantalla pero es basurilla.
- Luego entra en un bucle infinito.

Todo lo que se pinta entre 0x8000 y 0xBFFF son datos que se verían en pantalla. He intentado seguir la rutina de descompresión pero me es demasiado complicado entenderla bien. Ahí tu dominas. :)
En el .dsk hay otro fichero exomizado pero sin pasar por el exoopt y obtengo los mismos resultados con él.

El código ensamblador lo tuve que adaptar para que me compilase bien con el SDCC. Para las direcciones de memoria y números se usa la almohadilla #
seguida del número. Si el número va precedido con 0x se considera hexadecimal, de lo contrario se considera decimal.

¡Saludos y muchas gracias!
deexo.zip
deexo
(17.68 KiB) Descargado 95 veces

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 » Dom 10 Feb , 2013 4:30 pm

En ese archivo .zip no hay ningún main ni ningún .dsk, tan solo la rutina descompresora y los datos comprimidos y sin comprimir. Así no hay quien vea nada.

De todas formas, debería funcionar pasándole DE=0xBFFF y HL=0x65D4.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 10 Feb , 2013 5:10 pm

Al igual que Metalbrain, no veo el archivo DSK dentro del zip.

Por otro lado la rutina descompresora deexo_b_simple.asm es para comprimidos sin optimizar, por lo que no necesitas pasarle el exoopt.

En resumen, si usas una de las 4 versiones oficiales, no necesitas exoopt, te vale el archivo generado por exomizer.

Sin embargo, si necesitas más velocidad o descompresores más cortos te recomiendo las versiones optimizadas. Antes era más lioso meterse con las versiones optimizadas. Ahora es muy sencillo, el descompresor te lo genera el propio exoopt en un archivo llamado d.asm. También tienes un ejemplo de funcionamiento y un archivo bat para unificar la optimización en un sólo comando, solo tendrías que bajarte la última versión de exoopt (1.05).

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 5:37 pm

Perdón por el despiste. Después de leer los dos últimos post y haber probado a usar el comprimido usado por exomizer tampoco obtengo un resultado satisfactorio. Éste es algo más corto que el generado con el exoopt (5584 frente a 5589 del exoopt).
La dirección de los datos comprimidos sería 0x65CF y la de descompresión 0xBFFF. Ahora obtengo un cuelgue.
Ahora he incluído el .dsk dentro (run"deexo.bin).

¿Podría ser un error al descomprimir?
deexo.zip
deexo con dsk
(54.81 KiB) Descargado 99 veces

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 10 Feb , 2013 7:49 pm

Hola pacomix

He abierto el DSK y haciendo un CAT encuentro estos archivos:

Código: Seleccionar todo

deexo.bin
deexo.zip
fback.bin
fback.exo
fback.ex.opt
Si ejecuto run"deexo.bin carga una pantalla y luego se cuelga, pero no descomprime nada. Estoy depurando y no encuentro la rutina descompresora por ningún lado.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 8:10 pm

Sí. Empieza en la 0x0138. Cargo los valores de los parámetros que están en la pila (estoy programando en C) en hl y de y luego salto a la rutina descompresora que está en 0x0152.
Si usas WinApe simplement pon un punto de ruptura en la 0x0138 y a partir de ahí sigues. En el post mío de más arriba creo que está toda la información.
Y bueno no te preocupes. Si tampoco quieres enredarte demasiado con esto seguiré intentándolo de otra forma a ver.

¡Saludos!

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 8:20 pm

Otra cosa. Ten en cuenta que ahora el archivo que carga es el FBACK.EXO que no está pasado por el exoopt como bien decís para que la rutina descompresora que se usa sea válida.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 10 Feb , 2013 9:41 pm

Vale, no había leído lo del punto de ruptura. Ahora sí lo he podido depurar. De momento he encontrado 2 fallos:
-Usas una versión antigua del descompresor.
-HL no apunta bien al destino, el final del archivo está en 654F y HL apunta a 65DF

Al hacer el cambio sigue fallando. Lo estoy depurando con WinCPC y no veo si están activadas las interrupciones o no. En la nueva versión debería funcionar incluso con las interrupciones habilitadas.

Si al hacer los cambios que te he dicho sigue sin funcionar, le echo luego otro vistazo.

Edito: He simulado un DI y con la dirección correcta sigue fallando. ¿Has comprimido con la opción -c?

Edito2: ¿Estás seguro que entre 5000 y 654F no hay nada raro como variables del sistema o algo así?

Edito3: He encontrado otro fallo, el comienzo de los datos comprimidos está mal, es 98 90 20 cuando debería ser 04 22 31. Te has comido 128 bytes exactos, lo que muy probablemente sea debido a que te falta añadirle la cabecera al archivo. Tiene que haber una utilidad para añadir cabeceras, por ejemplo en el Spectrum +3 hice un programa que añadía la cabecera (+3DOS) aquí:

http://retrolandia.net/foro/showthread. ... 242#pid242

En tu caso el SO es AMSDOS, pero me imagino que habrá algún método sencillo. Pregunta a algún CPCero, yo podría buscarte la solución pero tardaría más.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 10:10 pm

¡Hola!

Gracias por todo. Sí... he compilado con la opción -c. exomizer raw -b -r -c. Es raro lo del final del archivo en 654F ya que el exomizer dice que tiene 5584 bytes. Si abres el zip verás fback.exo tiene eso. Y que el optimizado tiene 5589. Creo que te has confundido, HL debe apuntar a 65CF en el .dsk que va ahí dentro.

Acabo de mirar en el debugger... y... parece ser que la rutina de carga de disco, aún no sé el por qué, ignora los primeros 128bytes al cargar. Grrrrrrrr... No sigas porque esto parece venir entonces de ahí. Ahora entiendo lo de que acabe en 654F. Es extraño ya que la he usado sin problemas para cargar datos otras veces.

No pensaba que todo podría venir de ahí. Sorry y, ¡muchas gracias por vuestra ayuda e interés!

De todas formas... ¿debería usar siempre la más reciente en este caso la 2.06? ¿Cuál es el link "oficial" para descargar entonces?

¡Saludos!

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor antoniovillena » Dom 10 Feb , 2013 10:40 pm

El link oficial es éste:

https://bitbucket.org/magli143/exomizer/wiki/Home

Y el no oficial (versiones optimizadas) este:

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

En teoría se pueden cargar archivos sin cabecera a bajo nivel con llamadas a rutinas de AMSDOS, pero lo más sencillo es hacerlo desde BASIC. ¿Cómo generas el archivo DSK? Si haces un save desde basic se crea automaticamente la cabecera. La herramienta que tengas para crearlo probablemente tenga la opción de agregar cabeceras AMSDOS a los archivos.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Dom 10 Feb , 2013 10:58 pm

Argngng... odio los edit de los post porque no veo cuando se actualizan.
Exacto. Ese ha sido el problema. ](*,) Parece ser que por defecto la rutina de carga de disco espera que el archivo esté con cabecera y se la salta automágicamente. Uso el CPCDiskXP para generar y agregar ficheros al disco. Agregando la opción de agregar la cabecera amsdos todo se resuelve en parte. Al menos ahora me carga bien los datos del archivo pero aún así cuando descomprime me descomprime basura. Pero la descompresión la hace sin dejar el ordenador bloqueado.

Mañana me pondré con más detenimiento con la última versión del exomizer 2.06 ya que como bien dices eso puede ser un problema.

De todas formas voy a modificar la rutina de carga de disco para que se le pueda especificar si el archivo tiene o no cabecera Amsdos.


@Mochilote:
Por cierto Mochilote si lees esto.

1.- Cuando pongo la opción de -AddAmsdosHeader el programa me modifica físicamente el archivo. Creo que esto es un poco contraproducente ya que puede ser que el archivo se quiera tener guardado sin la cabecera o al menos dar una indicación al usuario de que el archivo original se va a modificar. Lo más correcto creo que sería meterla dentro del .dsk sin modificar para nada el original.
2.- Otra cosa es que cuando se intenta agregar una cabecera a un archivo que ya la tiene una ventana de error aparece advirtiendo que el archivo ya tiene la cabecera y no se agrega al disco. ¿No sería más correcto mostrar un simple aviso y continuar agregando el archivo al .dsk?
3.- Modificando lo explicado en el punto 1 también se resolvería automáticamente el punto 2.


Bueno pues ya está casi todo resuelto. A ver si con el último exomizer se me descomprime bien finalmente.

¡Vaya faena! Grrrrrr ](*,) ](*,)

Muchas gracias por vuestra ayuda.

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 » Lun 11 Feb , 2013 7:46 am

Por cierto Mochilote si lees esto.

1.- Cuando pongo la opción de -AddAmsdosHeader el programa me modifica físicamente el archivo. Creo que esto es un poco contraproducente ya que puede ser que el archivo se quiera tener guardado sin la cabecera o al menos dar una indicación al usuario de que el archivo original se va a modificar. Lo más correcto creo que sería meterla dentro del .dsk sin modificar para nada el original.
2.- Otra cosa es que cuando se intenta agregar una cabecera a un archivo que ya la tiene una ventana de error aparece advirtiendo que el archivo ya tiene la cabecera y no se agrega al disco. ¿No sería más correcto mostrar un simple aviso y continuar agregando el archivo al .dsk?
3.- Modificando lo explicado en el punto 1 también se resolvería automáticamente el punto 2.
Hola (tranquilo, yo leo todo :-ss ):

Punto 1: -AddAmsdosHeader tal y como explica en la ayuda (leeme.txt) añade la cabecera al fichero (sin Dsk ni nada), en tu caso puede parecerte que no hace falta hacerlo sobre el original ya que usas únicamente el dsk para las pruebas, pero yo particularmente uso mucho la opcion "tape bypass" de cpce para probar binarios sin tener que usar dsk's y sobretodo no tener que montar y desmontar el dsk en el emulador cada vez que compilo. Quizas podría incluir una opción para especificar el fichero de salida si se quiere que sea distinto al de origen y así se conservaría el original. Por ahora, si compilas usando un bat, simplemente hazte un backup antes de llamar a cpcdiskxp con algo similar a "copy file.bin file.bak" para ir tirando #-o.

Punto 2: Estoy totalmente de acuerdo, creo que no debería ni avisar, debería modificar la cabecera (por si la dirección que se pasa es diferente a la que ya tiene) y desde luego añadirlo al dsk.

Saludos.

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

Re: Exomizer 2, rutinas actualizadas

Mensajepor pacomix » Lun 11 Feb , 2013 9:51 pm

Bueno ahora he probado el exomizer 2.06 y he conseguido algo de mejor resultado cuando comprimo sin la opción -r. Con la -r sigo obteniendo el mismo problema.
Si comprimo sin la opción -r (solo con -b -c) y uso la rutina de deexo_simple_b.asm ahora al menos medio obtengo la pantalla pero con mucha basura.
Fuí a comprobar los datos y me encuentro conque los datos que se han cargado son diferentes de los que deberían estar en el archivo. ](*,)
Esto no puede ser un fallo en la rutina de carga ya que el otro fichero, el de la pantalla siempre se carga correctamente...
La cosa es que los datos difieren de cuando está sin cabecera (recién exomizado) y cuando se ha pasado porel CPCDiskXP. Esto es una cosa que me extraña ya que la imagen original la cargo sin problemas. O_o
Al final podéis encontrar otro zip con la imagen recién exomizada y después de pasarla por el CPCDiskXP.

Para Mochilote:

Cuando se le agrega la cabecera a un archivo el CPCDiskXP lo que hace es agregarle 128bytes al principio del fichero con los datos adecuado y nada más, ¿cierto? Entonces a partir de la dirección de 0x0080 del fichero y hasta el final debería contener exactamente el mismo contenido que el fichero sin cabecera. Si esto no es así please explícame qué se hace exactamente cuando se agrega la cabecera. Bueno... cambiamos el modo verbal que suena muy dictador. Please si no es así podrías explicarme que hace exactamente cuando se le agrega la cabecera? :mrgreen:
La cosa es que después de pasarle el CPCDiskXP para agregar la cabecera al fichero y poder usarlo para que se cargue con las rutinas de disco que tengo el contenido es prácticamente todo diferente O_o

Plis... dime si me estoy aquí perdiendo algo.
FBACK.zip
Flashback Exomizado
(11.01 KiB) Descargado 110 veces

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 » Lun 11 Feb , 2013 10:23 pm

Para Mochilote:

...

Plis... dime si me estoy aquí perdiendo algo.
Debes tener algún problema en la carga, si comparas tu mismo los dos ficheros (sin cabecera y con cabecera insertada por cpcdiskxp) con algun programa de comparación de ficheros (Beyond Compare, Ultracompare, etc) verás que son exactamente iguales exceptuando los primeros 128 bytes:

Captura de pantalla con tus ficheros:

http://i.imgur.com/0ajtQos.png
Imagen

Saludos.


¿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