Hace un tiempo, estuve investigando la compresión RLE (Run-Length Encoding), para utilizarlo en gráficos de MSX. Si no conoces el RLE, se puede resumir, diciendo que es un sistema muy simple, que se basa en reducir secuencias de valores repetidos.
Su funcionamiento es el siguiente:
- Se utiliza un valor como control. He elegido el valor $80 ya que el 0 es un valor muy común y como veremos más adelante, cuando un valor coincida con el número de control se utilizarán 2 bytes. Con este pequeño cambio se obtiene mayor compresión. En una prueba de un tileset de 115 tiles, obtuve una ganancia de más de 70 Bytes.
- Si el siguiente valor al control es 0, se utiliza para cuando el valor coincide con el de control y este no se repite.
- Si el siguiente valor al control es igual a 255, indicará que es el final.
- Si el siguiente valor al control no es ni 0 ni 255, entonces indicará el número de repeticiones (entre 1 y 254), y habrá un tercer dato que contendrá el valor que se repite. Como 1 repetición no se utiliza, en el decodificador se incrementa uno para abarcar de 2 a 255 repeticiones.
- Si el primer valor no es igual al número asignado como control, será un dato que no se repite y se escribe directamente a la salida.
Forma resumida |
---|
$80 nn dd ;repite nn veces (de $1 a $FE) el valor dd $80 $0 ;para cuando el valor a escribir es igual al dígito de control ($80) sin repetición $80 $FF ;final del bloque de datos dd (!=$80) ;valor sin repetición |
En definitiva, los datos que no se repitan sólo ocuparán un valor excepto cuando sea igual al valor de control que se usarán dos, pero en los casos que si se repitan, se gastarán 3 Bytes (dígito de control, numero de repeticiones y valor), uno más que el RLE básico.
Este sistema funciona muy bien con los datos de patrones, pero con los colores hay casos donde es más eficiente el RLE básico.
Adjunto la rutina descompresora a RAM y a VRAM, junto con un ejemplo:
En breve publicaré la utilidad MSXtiles devtool, donde se puede sacar a código y de forma independiente (patrones, colores y mapa), los diferentes tipos de datos que componen una pantalla de MSX (SC2) en RLE básico o el basado en WB.
Notas:
*1 – Si creamos una imagen utilizando un editor gráfico, al convertirlo a datos en formato MSX, puede que dependiendo del algoritmo de conversión, los valores de las lineas queden desordenados, lo cual penalizaría el ratio de compresión. Ejemplo:
- Forma desordenada: $FA,$AF,$AF,$FA,$AF,$1F,$F1
- Forma ordenada: $FA,$FA,$FA,$FA,$FA,$1F,$1F
Deja tu comentario
Debe iniciar sesión para escribir un comentario.