5.0 Expancion de Texto en SNES

    En las roms de SNES existen varias formas de guardar el texto, la primera de ellas es en bloques de texto con tablas de punteros como en las roms de NES. Otras veces esta almacenado en bloques de texto, pero incluyen un codigo hex entre cada cadena de texto y el codigo hex que significa fin de una cadena. Estos bloques de texto suelen no tener tablas de punteros, por lo que no deberian haber problemas para cambiar el largo de las cadenas de texto moviendo este codigo hex. El unico problema en estas roms es la dificultad para encontrar el texto. Aunque se puede usar Thingy como en Nes.
    El texto tambien es almacenado en el formato de "largo de texto constante", el cual es usado comunmente en los RPGs para almacenar los nombres de monstruos, items, armas, etc... Aqui las diversas frases estan una al lado de otra, sin un codigo hex que signifique fin de una cadena, cada frase tiene un tamaño predefinido, por ejemplo:

    Aqui se ven algunas frases donde sobran espacios que se puieden utilizar sin problemas, pero en otras no sobran espacios. La unica forma de aumentar el espacio para este tipo de texto es a traves de ASM.
    Finalmente en algunas roms de SNES el texto solo flota alrrededor de la rom, no se encuentra en bloques de texto especifico, la unica forma de expandir este texto es mover el texto a algun lugar de la rom cerca del extremo para expandirla (esto se explica con detalle mas adelante). A proposito existe un tipo de texto que flota en la rom, pero que se encuentra almacenado "como" bloques de texto, el cual no tiene tabla de punteros.

5.1 SNES Headers

    El cabezal en las roms de SNES es mucho mas grande que en las roms de NES, es de "200" hex bytes y al igual que antes este numero es muy importante, no tanto para las tablas de punteros pero si para mover bloques de texto e informacion en la rom. El cabezal en las roms de SNES luce como esto:

    La informacion del cabezal no es muy importante pero si la rom no tiene cabezal entonces es conveniente agregarle uno ya que esta es la causa por la que a veces la rom no funciona en algunos emuladores. Para agregar un cabezal solo hay que copiar el cabezal de una rom que lo tenga.

5.2 Tablas de Punteros en SNES

    Trabajan de la misma manera que las tablas de punteros de Nes, pero aqui no hay que restar el cabezal (header), aunque no falta la rom travieza en la que hay que hay que restarlo pero eso no es ningun problema. Hay que recordar que algunas roms de Snes no tienen tablas de punteros por lo que si no se encuentra una no hay que alarmarse.

5.3 Expancion de Texto que Flota en la rom

    tEsto se hace cuando el texto no tiene tabla de punteros y no se puede expandir solo moviendo el codigo hex que significa el fin de una cadena de texto. Esto es lo que debe hacerse para expandir el texto que flota en la rom. La mayoria de las veces este texto se encuentra dentro de Bancos de Datos, estos son una parte de la rom en donde se guarda la informacion. Un banco de datos en una low-rom es de 32 KB (8000 hex bytes)y en una high-rom es de 64 KB (10000 hex bytes). Por ejemplo las direcciones 000200 a 0081FF corresponden al primer Banco de Datos en una low-rom y las direcciones 008200 a 0101FF son el segundo, etc... Y en una high-rom 000200 a 0101FF es el primer Banco y 020200 a 0301FF es el segundo Banco , etc..Hay que notar que estas direcciones tienen los 200 bytes del cabezal incluido.
    La mayoria de las veces el texto que flota a traves de la rom solo puede ser movido dentro del banco en el cual se encuentra. Para hacer esto lo primero es convertir al direccion hex en un puntero. Esto se hace tomando un poco de texto del juego por ejemplo de la direccion 09DEC6 del juego FF4, a continuacion hay que restarle el cabezal entoces 09DEC6 se convierte en 09DCC6 como se tomo un poco de texto entonces hay posibilidades de que se pueda mover solo dentro de un banco de datos. Sabiendo esto el texto solo puede ser movido en el banco localizado entre las direcciones 098000 a 09FFFF (las cuales estan sin el cabezal, tambien hay que notar que FF4 es una low-rom).
    El siguiente paso es quitar el 09 a la direccion ya que los punteros dentro de los Bancos de datos se guardan como 2 Hex bytes, por eso 09DCC6 pasa a DCC6, ahora hay que separar los bytes y colocarlos al reves con lo que DCC6 se convierte en C6DC numero que hay que buscar dentro del banco de datos.
    Nota: Las direcciones que se buscan en una low-rom van entre 8000 a FFFF sin excepciones por eso si se busca el puntero para un texto localizado en la direccion 0928B0, quitandole el cabezal y el 09 (o el numero que sea) este se transforma en 26B0 el cual no esta entre 8000 y FFFF. para remediar esto se le suma 8000  con lo que 26B0+8000 = A6B0 entonces separamos los bytes y reordenamos con lo que nos queda el puntero B0A6 que hay que buscar en el banco. Sin embargo en una high-rom las direcciones van entre 0000 a FFFF por que los bancos son de 64 Kb en ves de 32.

5.4 Moviendo Bloques de Texto (Expansion para Texto con Punteros)

    Por lo general los bloques de texto grandes tienen tablas de punteros que nos permiten mover el texto a cualquier parte de la rom, lo cual deja la expansion fisica al alcanse de la mano. Todo lo que hay que hacer es mover el Bloque de Texto a un lugar vacio de la rom para expandirlo (hay que mover el Bloque de texto y su Tabla de punteros separadamente).
    Primero hay que encontrar el lugar donde comienza el Bloque de texto, luego restale el cabezal a esa direccion y luego mirar la siguiente lista. En ella esta la conversion entre la direccion actual y la manera en que el SNES lee las direcciones, esta lista es para low-roms:

    Aqui va un ejemplo a ver si queda mas claro. Digamos que tenemos un Bloque de texto situado en la direccion 080600, le restamos el cabezal y queda 080400 entonces miramos la lista y encontramos que su direccion segun el SNES es 108400. Ahora hay que separar en pares => 10 84 00 y luego colocarlos al reves => 008410. A continuacion buscamos ese numero en la rom y la cambiamos por la nueva direccion donde vamos a mover el Bloque de texto, usualmente estos punteros tienen el caracter BF adelante por lo que 008410 podria ser BF008410. Como el juego puede llamar varias veces al mismo Bloque de texto lo mejor es cambiar todos los punteros.
    En las high-roms los bancos son de 64Kb por lo que las direcciones son diferentes, estas parten en C00000 asi que para obtener la lista de las direcciones de una high-rom hay que sumar C00000 a cada una de las direcciones. Por ejemplo se toma un poco de texto de la direccion 1AE380 se le resta el cabezal y pasa a 1AE180 y ahora se le suma C00000 con lo que queda DAE180 con lo cual podemos tener nuestro propio puntero. Este procedimiento a veces sirve para el texto que solo flota en la rom. cuando este se encuentra almacenado en Bloques de texto.

5.5 Expancion Fisica

    Esta es la parte mas facil de todo, en las roms de SNES todo lo que se tiene que hacer para aumentar el tamaño de la rom es agregarle espacios. En total tienen que ser multiplos de 32 Kb o 8000 hex bytes o 1 banco. Sin embargo las roms suelen ser mas estables si son multiblos de 4 Mbit. Esta pequeña lista da los tamaños mas estables (las direcciones llevan incluido los 200 bytes del cabezal) :

             MBITs              HEX BYTES            SIZE

            4mbit                 $080200                  0.5MB
            8mbit                 $100200                  1.0MB
            12mbit               $180200                  1.5MB
            16mbit               $200200                  2.0MB
            20mbit               $280200                  2.5MB
            24mbit               $300200                  3.0MB

6.0 Conclusion

    Bien esta segunda entrega corrige algunos errores y agrega algunas cosas pero aun faltan otras cosas que pienso agregar mas adelante. Cualquier duda, pregunta, sugerencia o correccion enviame un mail.
 

FastCounter by LinkExchange