Página 2 de 3

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:00
por antoniovillena
Aquí tienes un MOD del ZX7 que hice del código original que descomprime hacia atrás y que uso en FASE:

https://github.com/DSkywalk/fase/blob/m ... ine/zx7b.c

Modificar la ventana cambiando el código no es muy difícil, pero vamos que puedo hacerlo yo mismo, tan sólo necesito que me pases una colección de archivos de ejemplo de lo que vayas a comprimir (si me puedes pasar todo lo que vayas a comprimir, mejor). Eso sí, tienes que pasármelo todo en archivos sueltos, si tienes una cadena que ocupa 10 bytes pues me la envías en un archivo que ocupa 10 bytes.

Una vez te tunee el compresor tendría que hacer la segunda parte, que es escribir el descompresor en asm, para esto tardaré un poco más.

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:06
por antoniovillena
Es normal lo que te ha dicho Einar, y es que para que LZ77 funcione bien necesita tener una ventana de donde extraer los datos. Pero vamos que aunque comprima mal siempre será mejor que sin comprimir. Yo lo he hecho así en el compresor de mapas, tengo una ventana de 150 bytes, que es minúscula pero suficiente para mejorar la compresión cruda.

Lo que dices de extraer bits no es muy difícil. Te busco el código y te lo pongo en unos momentos

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:09
por na_th_an
Gracias :) El código me vendrá genial.

Sobre lo otro, pues seguro que se alcanza mejor compresión. Pero como todavía el proyecto lo tengo a medias y tendré que añadir muchas más cadenas, tampoco es plan de tener que estar molestándote continuamente.

Si consigo aprender cómo leer N bits de un binario y expandirlos a un byte, ya puedo hacerme mi propio empaquetador (más que compresor) o incluso un sencillo huffman, o simplemente emplear secuencias de escape. Y mi kung-fu mejorará con ello :D

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:13
por antoniovillena
Este es el código, la clave está en la constante que pongas al principio, un $04 es para leer 6 bits, un $02 para leer 7, un $08 para leer 5, etc... A la salida del bucle tendrías el valor extraído en d. Por supuesto debes tener los datos empaquetados en un buffer que apunte a HL

$this->bbcode_second_pass_code('', '
ld d, $04
bucle call getbit
rl d
jr nc, bucle


getbit add a, a
ret nz
ld a, (hl)
inc hl
rla
ret
')

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:16
por na_th_an
Perfecto :D

Gracias, maestro, estudiaré su kung fu y entrenaré para mejorar el mío ;)

Llevo un par de años dándole al ensamblador pero nunca me meto con las rotaciones y debería estudiarlas mejor. Esto me servirá bastante para aclarar conceptos. ¡Gracias de nuevo!

Una última pregunta. Antes de empezar, supongo que necesitaré inicializar a ¿verdad? y conservar su valor tras leer cada valor.

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 14:51
por antoniovillena
Sí, hay varias formas de inicializar el marker bit, te recomiendo la primera.
  • Ponerlo en el bit alto de A, sería con LD A,$80
  • Meter el marker bit (un uno) en el bit bajo del primer byte del stream empaquetado y por tanto conteniendo este primer byte sólo 7 bits útiles, sería con LD A,(HL)
  • O directamente cargar ese primer byte del stream en A, esto último es sólo si vas a descomprimir una vez.

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 15:05
por antoniovillena
Esta es la forma "estándar" de hacerlo, es un código que a lo largo del tiempo hemos ido mejorando entre Metalbrain, Urusergi, Einar y yo. La forma estándar tiene una gran ventaja, y es que puedes leer bits individuales y bytes enteros desde el mismo stream con lo que la idea para acelerar los compresores es aprovechar siempre que puedas para hacer lecturas de bytes que son mucho más rápidas.

En tu caso básicamente lo que necesitas es un descodificador base64, al pasar bit a bit es un poco lenta la rutina, puedas hacer algo más rápido de esta forma:

$this->bbcode_second_pass_code('', '
ld a, (de)
inc de ; o inc e si es posible
rra
rl b
rra
rl b
ld (hl), a
inc hl ; o inc l si es posible

ld a, (de)
inc de ; o inc e si es posible
rra
rl b
rra
rl b
ld (hl), a
inc hl ; o inc l si es posible

ld a, (de)
inc de ; o inc e si es posible
rra
rl b
rra
rl b
ld (hl), a
inc hl ; o inc l si es posible

ld (hl), b
inc hl ; o inc l si es posible
')

Si te das cuenta en la salida escribes de 4 en 4 bytes, puedes aprovechar esto para ganar algunos ciclos extra cambiando 3 de los 4 inc hl por inc l.

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 15:09
por antoniovillena
También puedes tener el código un poco más "enrollado" (aunque algo más lento) de esta forma:

$this->bbcode_second_pass_code('', '
ld c, 4
bucle ld a, (de)
inc de
rra
rl c
rra
rl c
ld (hl), a
inc l
jr nc, bucle
ld (hl), c
inc hl
')

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 15:21
por na_th_an
Impresionante. Muchas gracias. Ahora tengo por delante una divertida tarde de cacharreo y estudio :)

Re: Sobre compresión custom (para A. Villena)

Publicado: Mié, 22 Ene 2014, 15:24
por radastan
Proposición para que A. Villena sea declarado hijo pródigo mojonero, emisario de Vah-Ka, y sumo pontífice de la plantación de plátanos de Eurelio.