Página 1 de 1

Compresor ZX7

Publicado: 10 Dic 2013, 19:28
por Namek
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

Re: Compresor ZX7

Publicado: 11 Dic 2013, 11:06
por zup
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)

Re: Compresor ZX7

Publicado: 11 Dic 2013, 11:18
por antoniovillena
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.

Re: Compresor ZX7

Publicado: 11 Dic 2013, 18:25
por Namek
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:

Re: Compresor ZX7

Publicado: 11 Dic 2013, 21:38
por antoniovillena
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

Re: Compresor ZX7

Publicado: 23 Dic 2013, 15:13
por antoniovillena
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

Re: Compresor ZX7

Publicado: 25 Dic 2013, 15:22
por Namek
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.