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.
Sobre compresión custom (para A. Villena)
Moderador: na_th_an
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sobre compresión custom (para A. Villena)
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
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)
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
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
Como diría Rorshach: "Urm..."
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sobre compresión custom (para A. Villena)
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
')
$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
')
Última edición por antoniovillena el Mié, 22 Ene 2014, 15:26, editado 1 vez en total.
Re: Sobre compresión custom (para A. Villena)
Perfecto
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.
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.
Como diría Rorshach: "Urm..."
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sobre compresión custom (para A. Villena)
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.
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sobre compresión custom (para A. Villena)
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.
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.
Última edición por antoniovillena el Mié, 22 Ene 2014, 15:14, editado 1 vez en total.
-
- Mensajes: 494
- Registrado: Jue, 24 Oct 2013, 15:52
Re: Sobre compresión custom (para A. Villena)
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
')
$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)
Impresionante. Muchas gracias. Ahora tengo por delante una divertida tarde de cacharreo y estudio
Como diría Rorshach: "Urm..."
Re: Sobre compresión custom (para A. Villena)
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.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 85 invitados