Estructura Yaz0

Contenido

  1. Introducción
  2. Funcionamiento
  3. Definiciones
  4. Estructura
  5. Ejemplo
  6. Notas
  7. Referencias

Introducción

Las letras Yaz0 se encuentran muy frecuentemente entre los juegos de Nintendo. En el caso de Super Mario Galaxy estas letras se encuentran, en su mayoria, en la cabecera de los archivos ARC en las diferentes carpetas del juego. Yaz0 hace referencia a un algoritmo de compresión. Afortunadamente, es un algoritmo sencillo (es fácil de decodificar) y existen múltiples implementaciones del mismo dado su uso extendido en múltiples juegos. Esta página almacena información acerca de lo que he aprendido de Yaz0 viendo los archivos de Super Mario Galaxy.


Image could not be loaded.

Archivo ObjectData/CubeBubbleExPlanetA.arc visto en ImHex

Funcionamiento

Yaz0 es un algoritmo de compresión que usa los datos ya codificados/leídos para reconstruir el archivo original hacia adelante. Es decir, es un algoritmo que se basa en la repetición de patrones de bytes ya procesados para comprimir/reducir el tamaño de un archivo binario.


Esto lo hace guardando bloques de datos que "apuntan" hacia secuencias de bytes pasadas (cuando sea posible guardarlas). Estos bloques también guardan la información de cuantos bytes copiar de esa dirección. En el proceso de descompresión, los bytes especificados por la instrucción de copiado se colocan al frente de los bytes ya recuperados del archivo (en un contenedor aparte). El resultado es que poco a poco se va escribiendo el archivo de nuevamente.


Image could not be loaded.

Ejemplo visual y simplificado de la forma de compresión Yaz0

Se puede ver a través de la imagen que Yaz0 es sólo un conjunto de instrucciones en secuencia (que se leen de izquierda a derecha) que indican como reconstruir los datos de un archivo.


El formato binario de Yaz0 es un poco más complejo que lo que se muestra en la figura, pero ésta debería ayudar a dar una idea general de como funciona. En la siguiente sección se explicaran los detalles.

Definiciones

Yaz0 define 2 instrucciones de copiado:


Yaz0 almacena el identificador de estas instrucciones en paquetes de 8. En un byte se almacenan 8 instrucciones y el orden de ellas (de izquierda a derecha) especifica cómo se interpretan los siguientes bytes del archivo comprimido. A este byte lo denomino byte de instrucciones.


Image could not be loaded.

Paquete de 8 instrucciones, byte de instrucciones

Los datos que manejan las instrucciones 0 y 1 que vienen después de un byte de instrucciones se almacenan binariamente de la siguiente forma:

Image could not be loaded.

Ejemplo visual simple de un byte de instrucciones y sus bytes siguientes

De aquí puede verse que seekback puede tener valores entre 0x1 y 0xFFF + 0x1, y, n puede tener valores entre 0x3 y 0xFF + 0x12 (IMPORTANTE!).

Estructura

La estructura del archivo descrita aquí es la estructura que se ha conseguido en los archivos originales de SMG. Esta información no significa que la estructura tenga que ser exactamente como se describe en la página.


Encabezado

Nombre Tamaño Descripción
Magia 4 bytes La cadena ASCII Yaz0.
Tamaño del archivo sin comprimir 4 bytes Almacenado en Big Endian. Es importante saber que el proceso de descompresión se detiene solamente cuando el tamaño del archivo reconstruído es mayor o igual a este tamaño.
Relleno 8 bytes Compuesto por 0x00.

Conjunto de tamaño no determinado de bytes de instrucciones

Nombre Tamaño Descripción
Inicio: Arreglo de instrucciones de compresión (explicado arriba)
Byte de instrucción 1 byte Determina como se leen los bytes siguientes.
Arreglo de bytes Variable Cómo leer este arreglo depende del byte de instrucción (Byte a copiar/Número de bytes a copiar desde una dirección atrás).
Final: Arreglo de instrucciones de compresión
Relleno No mayor a 32 bytes Rellena con 0x00 hasta que el tamaño del archivo sea múltiplo de 0x20.

Ejemplo

Estructura coloreada de ObjectData/CubeBubbleExPlanetA.arc

En la imagen se muestran los bytes de instrucción en rojo, los bytes directamente copiados en azul y los copiados de bytes en verde. El resto de las variables estan en otros colores.

Notas

Referencias