Buscando a Huffman desesperadamente

He cogido un viejo proyecto que tenía por aquí, el NiCo (Nintendo Compressor), que, básicamente, es un programillas para hacer las compresiones que usan las consolas GBA/NDS en sus BIOS, con el propósito de hacer las compresiones más rápidas (hasta 80 veces en algunas LZSS), ampliarlo un poco con algunas compresiones más que se usan en la NDS, y todo ello para hacer público el código fuente y que se pueda aprovechar, estudiar, copiar, etc.

Compresiones normales, soportadas por la BIOS
- RLE
- LZ (con opciones para WRAM y VRAM)
- Huffman (para 4 y 8 bits, aunque soporta también 1 y 2 bits, pues el código es el mismo)

* la LZ es una LZSS normal pero se suele llamar equivocadamente LZ77
* las 3 quedan exactamente como en los ficheros originales (se comprueba descomprimiendo y volviendo a comprimir los ficheros

Compresiones añadidas
- LZE, usada en los dos últimos Luminous Arc de NDS
- RLZ, usada en Ace Attorney en el último Golden Sun de NDS

* la LZE son en realidad dos codificaciones LZSS, comprimiendo datos con una u otra dependiendo de los bytes tratados
* la RLZ se suele llamar equivocadamente LZ11 y LZ40 (son la misma compresión, pero una guarda los datos en big endian y la otra en litte end¡an), y no es más que una ampliacion de la llamada compresión YAZ0 usada en algunas consolas de Nintendo (una mezcla de RLE y LZSS)

¿Dónde está el problema? Pues que a la hora de hacer pruebas me encuentro con la desagradable sorpresa que no hay ni un sólo programa que use la codificación Huffman para esas consolas, cosa bastante extraña porque la GBA tiene sus añitos. Todos los que hay lo hacen mal, para decirlo claramente (Crystal Tile, DSDecmp, GBACrusher, y todos los que se basan en ellos). En algunos casos avisan de que la compresión "falla" a veces (forma bonita de decir que no saben cual es el problema), o no comprimen ciertos ficheros, o no guardan bien los datos, o no alinean los datos correctamente, etc. La verdad es que a mí me ha pasado también. De los 119 ficheros comprimidos que he hallado (en los dos primeros juegos del Profesor Layton, que usan las tres compresiones soportadas por la BIOS), me he encontrado con problemas en 12 de ellos (los 107 restantes no dan problema). Sé cual es el problema y por qué se produce, pero necesito más ficheros comprimidos para hacer pruebas, y resulta imposible si no hay ningún programa que lo pueda hacer. Así que a ver si alguien conoce alguno que funcione, que venga en alguno de los kits de desarrollo o algo.

Cómo saber si un programa comprime bien: creando un fichero de 256 caracteres, desde el 0x00 hasta el 0xFF. Si no lo puede codificar ya podemos asegurar que el programa no sirve. Si lo codifica, basta con decodificarlo y si el resultado obtenido no tiene los caracteres originales es que tampoco sirve. Ésas son las dos opciones de los programas citados.
Interesante el tema compañero, solo por cultura general, esto para que sirve?

Saludos...
Mientras hacía mi emulador de GBA y programaba las funciones de la BIOS me di cuenta de que hay muy poquitos juegos que usen compresión Huffman. Creo que el primer Kirby era uno de ellos, si no recuerdo mal. En cambio, el LZSS lo usan bastantes.

Busca el GBACrusher, soporta todos los tipos de compresión de la GBA (que son los mismos que los de la DS).

foroweb escribió:Interesante el tema compañero, solo por cultura general, esto para que sirve?

Saludos...

Para que los datos que tienes que meter en el juego ocupen menos y puedas usar cartuchos más pequeños (más baratos).
Siento decirte que el GBACrusher no sirve, como ya indiqué en el primer post, y falla en dos situaciones:
- no soporta ficheros con frecuencia equilibrada de caracteres, como el ejemplo que mencioné de 256 bytes, todos diferentes (cada byte aparece una y sólo una vez, que es el ejemplo de frecuencias más equilibrado)
- no soporta ficheros de más de 256KB (la DS soporta cualquier tamaño que no llegue a 16MB)

Vamos, que es como si hubiese un programa que simule una calculadora pero no calcule operaciones de más de tres dígitos, por poner un ejemplo que se asemeje.

El caso es que la codificación/compresión se puede hacer perfectamente, pero el problema está a la hora de generar el árbol de códigos para almacenarlo.
3 respuestas