Muchas veces hemos intentado buscar un texto en el editor Hex y este no aparece por ninguna parte, por lo que las posibilidades son:
El texto está comprimido: esta es la peor de los casos, hay que identificar cual es el método o algoritmo de compresión, LZSS u otro, encontrar la rutina que descomprime y editarla, y otras cosas, que no competen en este tutorial.
El texto está en formato de Tiles: hay que encontrar la Tabla de Tiles, para esto, puede ver un antiguo tutorial que hice al respecto, usando el juego Ys'III (SNES).
El texto está en formato de Sprites: con esta última posibilidad es la que nos basamos para explicar este tutorial.
Asegurándonos que el texto no está en la ROM en formato ASCII
Para comprobar que el texto no está en ninguna parte en la ROM, como ASCII al menos, si buscamos las palabras "START", u "OPTIONS" que aparecen en el menú principal, estas no aparecen por ninguna parte en el editor hex, en este caso Translhextion buscando en modo "SCAN Relative", tampoco aparecen si las buscamos en minúsculas:
Depurando para obtener la dirección de la ROM desde donde se copian los datos por DMA a la VRAM
Lo primero es recordar que DMA es un técnica donde se utilizan ciertos registros de la SNES, llamados registros DMA, para copiar datos la ROM a VRAM directamente sin pasar por la RAM. Para nosotros como romhackers, tiene la ventaja de que los datos copiados, no están comprimidos, ya que para que los datos como textos o tiles estén comprimdias, necesariamente se utiliza la RAM.
- Lo primero es ejecutar la ROM con el Debugger y cuando llegues pasadito del punto que indica la imagen inferior (justo la imagen se pone negra):
Justo en la imagen negra, debes activar el check DMA de la sección Special Tracing:
Y verás mas o menos en la línea 10:DMA[7]: write Mode: 1 0x95ECDF->0x2118 Bytes: 8192 (inc) V-Line:8 VRAM: 6000 (1,0) word
esto es un paso de bytes por medio de los registros DMA, esto quiere decir, pasar desde la ROM a VRAM directamente sin pasar por la RAM.
por lo tanto, la salida de esta parte es la Dirección SNES de los datos: 0x95ECDF.
Obteniendo la Dirección Hex de los datos de la ROM a partir de la dirección SNES
Con tal de buscar en un Editor Hex o de Tiles los datos obtenidos, debemos convertir a Dirección Hex la dirección anterior, para esto usamos el Hex2Snes:
Por lo tanto, la salida de esta parte es la Dirección Hexadecimal de los datos en la ROM: 0x0AECDF.
Buscando los Sprites (no tiles) en la ROM con un Editor de Tiles en caso que querramos editarlos
Con la dirección anterior podemos buscar los Sprites con el Tile Layer Pro:
Como ya tenemos ubicados los sprites (no confundir con las tiles del texto del juego, que está en otro lado de la ROM), podemos editarlos si deseamos y agregar símbolos especiales. En nuestro caso tenemos los textos:
START -> INICIO
OPTIONS -> OPCIONES
PASSWORD -> se deja igual
por lo que no requerimos símbolos especiales.
Obteniendo una salvada .ZSX con emulador ZSNES para verificar que estén los Sprites
Una archivo de salvada del ZSNES contiene una copia exacta de lo que hay en la memoria VRAM de la SNES justo en ese momento.
Entonces, cuando la pantalla muestre:
Presiona F2 en el emulador, se generará un archivo ZS1, por ejemplo "Addams3 (esp).zs1".
Luego si editas ese archivo con el Tile Layer Pro y vas a la dirección 0x2CC13 te mostrará los Sprites en la VRAM.
Abriendo la Salvada con el VSNES para ver detalles de los Sprites
Si abrimos el archivo ZS1 con el programa VSNES, este nos entrega muchísima información de la Tiles, Background, Sprites, SPC (sonido), etc. del momento en que se presionó F2 en el juego.
Primero se debe abrir el ZST con el ícono de carpeta de la izquierda, y luego ir a SceneViewer
Si seleccionas Layers que significa en inglés "capas", y luego Sprites, se nos verán los famosos sprites que tanto buscamos:
La clave está aquí: se muestra que para el Sprite S de la palabra START, tiene una posición X de 108 y una posición Y 184 y el número o índice del tile es el 22. Por lo tanto si convertimos esos valores a hexadecimal nos dan:
108 dec = 0x6C hex
184 dec = 0xB8 hex
22 dec = 0x16 hex
Es decir, tenemos estos 3 bytes del Sprite 'S': 6CB816.
Entendiendo lo básico de los Sprites en al SNES
Ya que tenemos estos 3 bytes 6C B8 16, podemos investigar un poco acerca de como se almacenan los sprites en la ROM y para eso miramos el excelente documento Qwertie's SNES Documentation (por David Piepgrass) o el buen Tutorial en español de Sprites en la SNES (escrito por David Senavre) que está en http://www.consolasparasiempre.net/ donde podemos resumir que:
Los sprites en SNES se llaman objetos o OAM.
Para manejar dichos Sprites, la SNES tiene la llamada "tabla OAM" que es una zona de memoria que tiene toda la información sobre todos los sprites.
En esta tabla solo pueden haber 128 sprites, y por lo tanto la SNES puede manejar un máximo de 128 sprites a la vez. La NES solo puede manejar 64.
Si se utilizan muchos Sprites a la vez en un juego, lo más seguro es que se vea lento.
Cada Sprite de la tabla OAM es de 4 bytes que se forman así:
Byte 1 : xxxxxxxx Posición X del sprite en la pantalla (0-255)
Byte 2 : yyyyyyyy Posición Y del sprite en la pantalla (0-255)
Byte 3 : tttttttt Número de tile que representa al sprite
Byte 4 : vhoopppt
De este ultimo byte:
v : mirroring vertical
h : mirroring horizontal
o : bits de prioridad
p : bits de paleta
t : bit alto de número de tile
Si aplicamos esta estructura a nuestros 3 bytes 6CB816 tenemos el significado de los 3 bytes y coincide claramente con lo que nos dice el vSNES:
-6C = Posición X = 108
-B8 = Posición Y = 184
-16 = Numero de Tile = 22
Edición de Tabla OAM de prueba
Vamos buscar nuestros 3 bytes del Sprite "S" en la ROM y los encontramos en la posición 0xAEAB7, para esto abres la ROM en Translhextion, luegp te posicionas al comienzo del archivo y buscas con la selección Hex:
Como dato aparte, si buscamos en el archivo de salvada ZST igualmente se encuentra allí:
Si modificamos el número de Tile tenemos (0x16) por un 0x0 nos debería mostrar otra letra en vez de la "S":
Se ve una "ATART" ¡Lo tenemos!
Edición de Tabla OAM (en serio)
Ya que vimos que funciona, ahora vamos a colocar las palabras traducidas al Español:
START -> INICIO -> I = 08, N = 0D, I = 08, C = 02, I = 08, 0 = 0E. NOTA: esta última la letra "0" de INICIO no alcanza exacto con START, por lo que la agregaremos a la tabla OAM al final, en donde hayan tiles vacías.
OPTIONS -> OPCIONES -> O y P quedan igual, T se cambia por C = 02, I, O y N quedan igual, S se cambia por E. NOTA: esta última la letra "S" de OPCIONES tampoco alcanza exacto con OPTIONS, por lo que la agregaremos a la tabla OAM al final, en donde hayan tiles vacías.
PASSWORD -> lo dejaremos igual
NOTA: en la imagen superior se ven posiciones X de cada tile que cambiaron al final cuando ajustaba que el menú se viera centrado, pero el las posiciones Y y el número de tile, son los mismos de la imagen.
Como se ve arriba, aparte de editar que tile del sprite se vea en que posición, movimos los sprites a la izquierda (cambiando el byte que maneja la posición X del Sprite) ya que están muy movidos por las nuevas letras, de esta forma se ve más centrado.
Finalmente, nuestro romhack quedaría así:
NOTA: Al seleccionar con el dedo INICIO o OPCIONES, las nuevas letras que agregamos (O de INICIO y S de OPCIONES) no parpadean, si el resto de la palabra, por lo que quedaría ese detalle por resolver a futuro.