Compresor ZX7

Sinclair QL, ZX81, +2, +3, 128K ...
Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 840
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Compresor ZX7

Mensajepor Namek » 10 Dic 2013, 19:28

He estado mirando el compresor ZX7 y la verdad es que comprime casi tanto como el Exomizer y su rutina descompresora mas simple solo usa 69 bytes (75 al cargar las direcciones de origen y destino en los registros), y mi idea es usarlo para comprimir juegos en lugar del File Compresor que usaba hasta ahora, pero tiene la pega de que solo descomprime hacia adelante, por lo que si quiero descomprimir un bloque de datos que llegue hasta el final de la memoria ocupando mas de la mitad del total, no puedo hacerlo directamente y tengo que mover el bloque a posteriori. Por este motivo estoy pensando en invertir el flujo de datos comprimidos que genera el compresor y modificar la rutina descompresora para que descomprima hacia atras, en teoria es facil, pero si alguien sabe si esto ya esta hecho me podria ahorrar el calentamiento de tarro... :roll:

P.D: Acabo de caer en que ademas de invertir el flujo de los datos comprimidos tambien tengo que invertir el orden de los bytes originales antes de la compresion... #-o

Avatar de Usuario
zup
Amiga 2500
Amiga 2500
Mensajes: 3013
Registrado: 04 Sep 2009, 20:07
Sistema Favorito: Spectrum 16Kb/48Kb
primer_sistema: Spectrum 16Kb/48Kb
consola_favorita: Nintendo DS/3DS
Primera consola: Nintendo GameBoy
Ubicación: Navarra
Gracias dadas: 86 veces
Gracias recibidas: 360 veces
Contactar:

Re: Compresor ZX7

Mensajepor zup » 11 Dic 2013, 11:06

En eso te llevo algo de ventaja... como mis cargadores son para disco, el equipo debe estar en modo 128k y puedo apoyarme en las páginas de RAM para descomprimir.

La primera vez que oí algo del zx7 fue en este hilo de WOS. Si miras el hilo (y los créditos de zx7), verás que antoniovillena y metalbrain han colaborado en el invento. Los dos suelen andar activos por aquí y por speccy.org, seguro que acaban respondiendo.

(Sin modificar la rutina, puedes dividir los datos en bloques de 6k, y apoyarte en la RAM de pantalla para descomprimir... pero será un poco peñazo)
I have traveled across the universe and through the years to find Her. Sometimes going all the way is just a start.
Además vendo cosas!

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Compresor ZX7

Mensajepor antoniovillena » 11 Dic 2013, 11:18

Exacto. Lo bueno es que el compresor no tienes que modificarlo, basta con invertir el archivo de entrada y el archivo de salida. Hace tiempo hice una utilidad para invertir archivos:

http://retrolandia.net/foro/showthread.php?tid=47

El descompresor sí que hay que modificarlo, son pocos cambios (algún inc por dec, el ldir por lddr y algo más) pero hay que saber donde hacerlos. Dime el descompresor que estás utilizando y te lo modifico. El más adecuado aquí creo que es el smart, ya que te permite una mayor compresión en las pantallas de carga sin merma en el resto.

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 840
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Compresor ZX7

Mensajepor Namek » 11 Dic 2013, 18:25

Gracias Antonio, me haces un Rey, el descompresor que me gustaria utilizar es el mas pequeño de todos, aunque si resulta mas facil modificar el smart pues ese, y eso de que permite comprimir mas las pantallas como va? Y otra pregunta mas aprovechando la coyuntura, cuanto mejor aproximadamente es el Exomizer comparado con el ZX7? A mi lo que me gusta del ZX7 es que no necesita buffer para descomprimir... :roll:

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Compresor ZX7

Mensajepor antoniovillena » 11 Dic 2013, 21:38

Ahora estoy de viaje y sólo tengo internet por el móvil, así que sí no te importa esperar una semana.

El exomizer comprime un pelin más que apack, que a su vez comprime un poco más que el zx7, haz tú mismo la prueba, pero creo que rondará un 5% la diferencia. Para archivos pequeños pasa al revés, el que mejor comprime es zx7

Avatar de Usuario
antoniovillena
Amiga 1200
Amiga 1200
Mensajes: 2013
Registrado: 16 Abr 2012, 21:22
Gracias recibidas: 8 veces

Re: Compresor ZX7

Mensajepor antoniovillena » 23 Dic 2013, 15:13

Aquí tienes el descompresor modificado:

Código: Seleccionar todo

; -----------------------------------------------------------------------------
; ZX7 decoder by Einar Saukas, Antonio Villena & Metalbrain
; "Standard" version (69 bytes only)
; -----------------------------------------------------------------------------
; Parameters:
;   HL: source address (compressed data)
;   DE: destination address (decompressing)
; -----------------------------------------------------------------------------

dzx7_standard:
        ld      a, $80
dzx7s_copy_byte_loop:
        ldd                             ; copy literal byte
dzx7s_main_loop:
        call    dzx7s_next_bit
        jr      nc, dzx7s_copy_byte_loop ; next bit indicates either literal or sequence

; determine number of bits used for length (Elias gamma coding)
        push    de
        ld      bc, 0
        ld      d, b
dzx7s_len_size_loop:
        inc     d
        call    dzx7s_next_bit
        jr      nc, dzx7s_len_size_loop

; determine length
dzx7s_len_value_loop:
        call    nc, dzx7s_next_bit
        rl      c
        rl      b
        jr      c, dzx7s_exit           ; check end marker
        dec     d
        jr      nz, dzx7s_len_value_loop
        inc     bc                      ; adjust length

; determine offset
        ld      e, (hl)                 ; load offset flag (1 bit) + offset value (7 bits)
        dec     hl
        defb    $cb, $33                ; opcode for undocumented instruction "SLL E" aka "SLS E"
        jr      nc, dzx7s_offset_end    ; if offset flag is set, load 4 extra bits
        ld      d, $10                  ; bit marker to load 4 bits
dzx7s_rld_next_bit:
        call    dzx7s_next_bit
        rl      d                       ; insert next bit into D
        jr      nc, dzx7s_rld_next_bit  ; repeat 4 times, until bit marker is out
        inc     d                       ; add 128 to DE
        srl     d                       ; retrieve fourth bit from D
dzx7s_offset_end:
        rr      e                       ; insert fourth bit into E

; copy previous sequence
        ex      (sp), hl                ; store source, restore destination
        ex      de, hl
        adc     hl, de
        lddr
dzx7s_exit:
        pop     hl                      ; restore source address (compressed data)
        jr      nc, dzx7s_main_loop
dzx7s_next_bit:
        add     a, a                    ; check next bit
        ret     nz                      ; no more bits left?
        ld      a, (hl)                 ; load another group of 8 bits
        dec     hl
        rla
        ret

Avatar de Usuario
Namek
Atari 1040 STf
Atari 1040 STf
Mensajes: 840
Registrado: 11 Jul 2011, 13:13
Gracias dadas: 18 veces
Gracias recibidas: 63 veces

Re: Compresor ZX7

Mensajepor Namek » 25 Dic 2013, 15:22

Muchisimas gracias Antonio, por cierto no se si te has dado cuenta pero con los cambios para que descomprima hacia atras la rutina se queda en 68 bytes...

Gracias otra vez y feliz navidad.


Volver a “Sinclair/Spectrum”

¿Quién está conectado?

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