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.