Volver
Edición de Sprites en la SNES: cuando el texto no aparece por ninguna parte

por Dark-N hernaldog@gmail.com
http://darknromhacking.com
23 de Agosto 2011


La Idea

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:






    Herramientas

  • La Rom en Inglés. La pueden obtener de CoolRoms
  • Emulador ZSNES para obtener un salvada ZST: ZSnes 1.51 Debugger
  • Emulador SNES9X con Debugger: Snes9X 1.43 Debugger
  • Editor Hexadecimal: Translhextion
  • Editor de Tiles: Tile Layer Pro 1.1
  • Visor de ZST: vSNES
  • Conversor de Direcciones SNES/Hex: Hex2Snes


  • Buscando la Tabla de Sprites


    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.


    Volver
    blog comments powered by Disqus
    2003 - 2018    La Web de Dark-N