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