Sobre compresión custom (para A. Villena)

For all things Churrera. ¿Estás haciendo un juego? ¿quieres proponer un cambio? ¿tienes alguna duda? ¡Cuéntanoslo!

Moderador: na_th_an

antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 14:00

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.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 14:06

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
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

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

Mensajepor na_th_an » Mié, 22 Ene 2014, 14:09

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
Como diría Rorshach: "Urm..."
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 14:13

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
')
Última edición por antoniovillena el Mié, 22 Ene 2014, 15:26, editado 1 vez en total.
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

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

Mensajepor na_th_an » Mié, 22 Ene 2014, 14:16

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.
Como diría Rorshach: "Urm..."
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 14:51

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.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 15:05

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.
Última edición por antoniovillena el Mié, 22 Ene 2014, 15:14, editado 1 vez en total.
antoniovillena
Mensajes: 494
Registrado: Jue, 24 Oct 2013, 15:52

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

Mensajepor antoniovillena » Mié, 22 Ene 2014, 15:09

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
')
Avatar de Usuario
na_th_an
Mensajes: 26413
Registrado: Vie, 09 Ene 2009, 12:18

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

Mensajepor na_th_an » Mié, 22 Ene 2014, 15:21

Impresionante. Muchas gracias. Ahora tengo por delante una divertida tarde de cacharreo y estudio :)
Como diría Rorshach: "Urm..."
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

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

Mensajepor radastan » Mié, 22 Ene 2014, 15:24

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.

Volver a “La Churrera”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado