Mostrando las entradas con la etiqueta NOTAS. Mostrar todas las entradas
Mostrando las entradas con la etiqueta NOTAS. Mostrar todas las entradas

martes, 1 de diciembre de 2020

[Notas Romhacking] Compresión de Golomb-Rice de 4 bits

En este artículo documentaré como funciona la codificación de Golomb, esto se hace con la intención de compartir conocimientos con la comunidad de romhack hispana.

Esta codificación se hace presente de la desarrolladora Imagineering Inc. específicamente en los siguientes títulos de NES:

  • Barbie
  • Home Alone 2
  • Ren & Stimpy Show, The
  • Simpsons Bart vs Space Mutants
  • Simpsons Bart vs The World
  • Simpsons Bartman Meet Radiactive Man

Para entender como funciona primero debemos entender la diferencia entre 1 byte y 1 bit. Recordemos un 1 byte esta conformado por una cadena binaria conformada por 8 bits, tal y como muestra la imágen de abajo.



Si ocupamos las mates, con potencias de 2 tenemos que 2^8 = 256 combinaciones, y los bytes pueden representarse en formato hexagecimal del 0x00 al 0xFF.

Bien para la codificación de estos juegos se han ocupado 4 bits, osea la mitad de un byte, si ocupamos mates nuevamente, 2^4 = 16 combinaciones, no es mucho, ya que el alfabeto consta de 26 letras (sin contar caracteres de puntuación, etc), sin embargo como solución podemos sacrificar un espacio y asignarle un "byte flag", de esta manera podemos crear otro alfabeto de 16 espacios, y cuantos queramos sacrificando siempre un espacio en el primer diccionario.

Para ver esto de mejor forma tomare como ejemplo el juego: "The Ren & Stimpy Show - Buckeroo$!" de NES. Si analizamos su tabla de caracteres (char map):



Como podemos ver en la imágen en la parte seleccionada, este juego ocupa 49 caracteres, a su derecha los tenemos en ASCII. Bien si hacemos los calculos: 49 / 16 = 3,0625, (aproximamos al entero siguiente) o sea necesitaremos 4 diccionarios para poder llenar todos los caracteres. Ahora, ¿cuántos caracteres caén en el primer diccionario?, Si pensaste en 13 estas en lo correcto, pues debemos sacrificar 3 espacio para ocuparlos como flag para apuntar a los otros diccionarios.

La siguiente tabla resume lo anterior:


Algo importante de mencionar es que orden de los caracteres están basado es su frecuencia de aparición, lo que quiere decir que los caracteres de la columna 0 seŕan los que tienen mayor probabilidad de aparecer y por lo tanto al no requerir de un "flag" ocuparan solo 4 bits , por el contrario los de la demas columnas( 1, 2 y 3) ocuparán 8 bits.

Ahora solo debemos encontrar donde esta el texto(no explicaré esto aquí) y tomar todos los valores hexagecimales y dividirlos en 2 partes cada byte, por ejemplo el byte "D0", nos quedaría "D" y "0", si lo pasamos a decimal "13" "0", a esto se le llamarán "nybbles", y abajo tenemos un extracto del texto en nybbles.



Ahora, solo debemos interpretar lo números como si fueran coordenadas, y ocupar la tabla de más arriba, recuerden ocuparemos por defecto la fila 0, si es que llegamos a un flag, cambiamos de diccionario y  ocupamos el "nybble" siguiente, para ejemplificar mejor ocuparemos la región que está encerrada.

5 = N, 6 = I,
13 (flag para ir al diccionario 1) -> 0 = C, 
13 (flag para ir al diccionario 1) -> 12 = K,

1 = E, 12 = L, 2 = O, 10 = D, 1 = E, 2 = O , 5 = N, 11 = {0D}

Así nos queda la cadena de texto:

NICKELODEON{0D}

Bien, ya decodificamos el texto, y esto corresponde a la intro del juego, la primera línea específicamente:


Ahora, solo queda hacer una herramienta que haga esto automáticamente, y bueno hacer lo contrario, osea comprimir de texto, para eso debemos también crear nuevos diccionarios, basados en la frecuencia de aparición de cada caracter, para comprimir con la misma eficacia. Y por último y no menos importante manejar los punteros de los textos.

Herramienta disponible aquí.

Hasta pronto en otra nota de romhacking.



lunes, 30 de noviembre de 2020

[Notas Romhacking] Robocop Vs The Terminator (USA) (Proto) (NES)

Este juego de Virgin Games para NES, al igual que M.C KIDS (McDonaldLand) tiene el texto comprimido con un algoritmo LZ77, también ambos juegos presentan punteros de 2 bytes separados en 2 tablas, en un lado los bits menos siginificativo (LSB) y en otro los bits mas significativos (MSB). 

El algoritmo funciona de la siguiente manera:

  • 4 bits: tamaño del argumento "source" para las copias anteriores, en bits.
  • 4 bits: tamaño del argumento "length" para las copias anteriores, en bits.
  • Secuencia de bits comprimidos; lee cada byte de más significativo a menos significativo.

La secuencia de bits comprimidos consta de una serie de dos comandos:

1.- Pastcopy0 (source) (length)
  • Copia los datos que ya se han descomprimido previamente.
  • El número de bits utilizados por "source" y "length" se especifica en el primer byte de los datos comprimidos.
  • El "source" es cuántos bytes atrás copiar, y un valor de 0 indica el final.
  • El "length" es el número de bytes a copiar, menos tres (por lo que una longitud de 0 copia 3 bytes, 1 copia 4, etc.)
2.- Literal1 nnnnnnnn
  • Genera un byte literal.
    Tenia hecho hace tiempo un editor para esto, originalmente hecho por Alchemic, el cual agradezco, ya que puede tradcuir el M.C Kids con su ayuda, sin embargo la herramiento presentaba falencias a la hora de comprimir el texto,entre algunas, la compresión ocupan más espacio, no formatea punteros, no poder maneja caracteres no ASCII, como también no poder ocupar una tabla de caracteres externos. 

     Así que era hora de aportar con mi granito de arena a la comunidad de romhacking, y me di la tarea de hacer la herramienta desde 0, pero que además de mejorar el algorimo de compresión, ayudará a cubrir lo puntos anteriormente expuestos.

    He aquí los resultados:

Texto original descompresión

Texto orignal(sin modificar) compresión


    Algo que olvidé mencionar es que el juego posee tres bloques comprimidos de texto, divididos en script1,2,3... Utilizaremos como ejemplo el primero, el texto ocupa un total de 1782 bytes, sin embargo como muestra la imágen , al descomprimir tenemos 2641 bytes, un crecimiento del 48%. Ahora si lo comprimimos nuevamente podemos apreciar que nos quedan 72 bytes libres en ese bloque, por lo tanto, texto comprido original: 1782, compresión mía: 1710 bytes, una mejora de compresión de un 5% con respecto al original.

    Se que no es mucho, pero si lo pensamos al traducir al español, solemos ocupar más palabras para decir lo mismo en inglés (con excepciones), así que esto ayuda muchísimo.


    Bueno me despido, y nos vemos en otra nota de romhacking.



[Notas Romhacking] 03-02-2025



1.- Mississippi Satsujin Jiken (NES)

Desarrolle la herramienta "HexString" para este juego, tiene la capacidad de comprimir por DTE/MTE, además formatear los punteros automaticamente, proximamente más avances.






2.- Compresión de Golomb de 4-bits:


He estado trabajando en la creación de herramientas para sacar adelante nuevas traducciones de ROM que por su complejidad aún no se disponen de traducción. En este caso la compresión de Golomb, permite al desarrollador crear un mapa de caracteres, que divide en distintos diccionarios, lo que permite seleccionar los caracteres que presentan más frecuencia y en este caso asignarlo con un valor de 4 bits (mitad de byte), de esta forma asignamos al primer diccionario los 16 valores con más repetición. Si se preguntan de donde sale el 16 (2^4 =16). Con esto podemos asignar a un byte 2 valores.


Ahora, esto es hipotético, si tenemos mucho mas que 16 caracteres, necesitaremos construir otros diccionarios, pero deberemos sacrificar indices, osea reduciremos la capacidad a 15. Y en 1 por cada diccionario extra. A estos índices por cierto, se les denomina "nybble".

Pero dejemos de tanta explicación técnica, he localizado una serie de juegos, de la desarrolladora Imagineering que ocupa esta compresión de texto. Entre algunos títulos:


Barbie (NES)
Home Alone 2 (NES)
Ren & Stimpy Show, The (NES)
Simpsons Bart vs Space Mutants (NES)
Simpsons Bart vs The World (NES)
Simpsons Bart Meet Radiactive Man (NES)
(Y otros más que no he revisado)


Algunas imágenes de textos dumpeados:


Simpsons Bart vs The World


Simpsons Bart vs Space Mutants






Y en el juego que comenzé a trabajar:


The Ren & Stimpy Show







3.- Robocop vs The Terminator (NES)


Mientras reivsaba que juego podia traducir me di cuenta de la existencia de este título, pero algo llamo mi atención, la desarroladora era Virgin, y recordé otro juego con compresión de la misma desarroladora, exacto "M.C KIDS", así que tome el decompresor sin modificar, solo depure algunas direcciones y la ROM, y grande fue mi sorpresa:




Pero, sin embargo, debo reconstruir la herramienta para manejar mejor los caracteres no ASCII, también debo agregar que ya se donde está su tabla de punteros, así que toca incluirlo y queda una mega herramienta. Quizás le haga un repaso a M.C kids.


4.- Star Fox 2 (SNES)


Bueno este a sido un dolor de cabeza, si bien el texto es facil de dumpear, es simple DTE. Los gráficos son otro cuento, el chip que incluye, el FX , que permite medio rendelizar en 3D (Algo bastante adelantado a su época). Sobra decir que está todo comprimido y no he podido dar con la tabla de las letras. Sin embargo he descomprimido bastante offset de gráficos, (y son bastantes), un proyectoq ue veo que me supera más que nada por la gran inversión de tiempo que se debe dedicar ( además no me considero artista gráfico), me gustaría delegar esto a alguien que tome el liderazgo del proyecto.



Texto Principal Dumpeado









Así que se vienen cositas...


Última actualización
03-02-2025