[HEX] Asignar Rutinas al Comando SPECIAL
Es común que insertemos una gran variedad de rutinas ASM en nuestro hack para darle ese toque "especial" y a veces personal (dependiendo como adaptemos las rutinas), pero ello conlleva tener que recordar muchos offsets y correr el riesgo de olvidar sumarle 1 y darnos uno que otro dolor de cabeza en el scripting. La solución a ello sería que por medio de una variable y un comando común llamemos nuestras rutinas ¿y qué creen? las ROMs de Pokémon lo trae implementado y es el comando SPECIAL el cual nos permite elaborar o en este caso modificar una tabla donde se encuentra una gran diversidad de rutinas ASM y que son llamadas por dicho comando.
A continuación aprenderemos como asignarle un SPECIAL a cualquier rutina ASM en Fire Red y Rojo Fuego haciendo más fácil llamar la rutina sólo recordando el valor del SPECIAL y cómo ejecutarlo con éxito.
Las características de la modificación son:
- Mayor facilidad de llamar rutinas, ya que sólo basta apuntar el valor del especial para dicha rutina y llamarlo con el script SPECIAL 0xXXYY donde XXYY es el valor asignado o entrada de la tabla de especiales. Dicho script se escribe de la siguiente manera:
Si la variable contine sólo un byte se puede escribir de la siguiente manera:
- Podemos sustituir o asignar nuevos especiales
Herramienta a usar:
- HxD DESCARGAR
Lo primero que debemos saber es la dirección de la Tabla de Especiales. Ésta se encuentra en los siguientes offset de acuerdo a la edición del juego:
Fire Red = 0x15FD60
Rojo Fuego = 0x15FDEC
Hechemos un vistazo al Fire Red :
Como se puede notar es una tabla con simples offsets ¿o no? Lo que tenemos aquí son las direcciones de las rutinas incluido el +1, preestablecidas por los comandos SPECIAL y SPECIAL2. La diferencia entre el primero y el segundo es que el segundo recibe también una variable para almacenar un valor devuelto por la rutina a ejecutar. En nuestro caso nos bastará con el primer comando.
Cada índice de la tabla tiene un sólo puntero, el cual, es el offset +1 de la rutina a ejecutar, por lo tanto cada índice tiene una longitud de 0x4. La tabla original tiene una longitud de 0x718, es decir, 454 entradas que van desde 0x0000 hasta 0x01C6 ¿Pero podemos incluir más? Sí! Teóricamente podemos insertar hasta 0xFFFF entradas, es decir, 65536 especiales. Sólo basta con mover el contenido de la tabla, colocar al final 4 bytes a 00 para indicar el final de la tabla y repuntar dicho offset a los siguientes offsets dependiendo de la edición:
Fire Red = 0x69F18 y 0x69F6C
Rojo Fuego = 0x69FE0 y 0x6A020
Pero créanme, no es necesario el trabajo. Afortunadamente las ROMs de estás ediciones traen especiales que acarrearon de las versiones anteriores (R/Z/E) y no funcionan en estas por carecer del sistema de reloj de tiempo real RTC de forma nativa. Esos especiales están disponibles de forma segura para ser reutilizados sin necesidad de expandir la tabla. En total son 194 como se muestra en la siguiente tabla:
Pueden conseguir más información al respecto en este post:
Research Study on the Special and Special2 commands
Ok, ya está bueno de teoría pasemos a la práctica. Para ello usaré la base que usé para el tutorial FR | RF Mostrar Imágenes a Pantalla Completa by CompuMax ahora sabiendo que la rutina la inserté en 0x801390 y como debo sumarle +1 pasaré a editar la tabla empezando con el primer especial que puedo editar según la tabla, el 006, para ello le sumo al offset de la tabla (0x15FD60) + 0x18 que es (0x4 x 0x6) y allí, en 0x15FD78 estará el puntero a la rutina que tiene asignado el especial 0x6 y reemplazo con el puntero de mi rutina +1, es decir, 91 13 80 08.
Guardamos y abrimos el ROM con AdvanceMap y editamos el script de esta manera:
Probamos In Game y...
Listo! Ya hemos sustituido el callasm 801391 por special 0x6.
Saludos!
Max.
A continuación aprenderemos como asignarle un SPECIAL a cualquier rutina ASM en Fire Red y Rojo Fuego haciendo más fácil llamar la rutina sólo recordando el valor del SPECIAL y cómo ejecutarlo con éxito.
Las características de la modificación son:
- Mayor facilidad de llamar rutinas, ya que sólo basta apuntar el valor del especial para dicha rutina y llamarlo con el script SPECIAL 0xXXYY donde XXYY es el valor asignado o entrada de la tabla de especiales. Dicho script se escribe de la siguiente manera:
Código:
special 0xXXYY
Código:
special 0xYY
Herramienta a usar:
- HxD DESCARGAR
Lo primero que debemos saber es la dirección de la Tabla de Especiales. Ésta se encuentra en los siguientes offset de acuerdo a la edición del juego:
Fire Red = 0x15FD60
Rojo Fuego = 0x15FDEC
Hechemos un vistazo al Fire Red :
Como se puede notar es una tabla con simples offsets ¿o no? Lo que tenemos aquí son las direcciones de las rutinas incluido el +1, preestablecidas por los comandos SPECIAL y SPECIAL2. La diferencia entre el primero y el segundo es que el segundo recibe también una variable para almacenar un valor devuelto por la rutina a ejecutar. En nuestro caso nos bastará con el primer comando.
Cada índice de la tabla tiene un sólo puntero, el cual, es el offset +1 de la rutina a ejecutar, por lo tanto cada índice tiene una longitud de 0x4. La tabla original tiene una longitud de 0x718, es decir, 454 entradas que van desde 0x0000 hasta 0x01C6 ¿Pero podemos incluir más? Sí! Teóricamente podemos insertar hasta 0xFFFF entradas, es decir, 65536 especiales. Sólo basta con mover el contenido de la tabla, colocar al final 4 bytes a 00 para indicar el final de la tabla y repuntar dicho offset a los siguientes offsets dependiendo de la edición:
Fire Red = 0x69F18 y 0x69F6C
Rojo Fuego = 0x69FE0 y 0x6A020
Pero créanme, no es necesario el trabajo. Afortunadamente las ROMs de estás ediciones traen especiales que acarrearon de las versiones anteriores (R/Z/E) y no funcionan en estas por carecer del sistema de reloj de tiempo real RTC de forma nativa. Esos especiales están disponibles de forma segura para ser reutilizados sin necesidad de expandir la tabla. En total son 194 como se muestra en la siguiente tabla:
Código:
006 --> 01b
024 --> 026
02B --> 031
03E --> 044
046 --> 05B
061 --> 076
07e,07f,081
086 --> 08c
090 --> 092
097,098
09a --> 09c
0A0 --> 0A2
0Ac --> 0B3
0C9 --> 0CC
0CF --> 0D3
0D9,0DA
0E1,0E2
0E4,0E5
0F7
100 --> 105
109 --> 10D
112
115 --> 11C
120 --> 123
12A
12C,12D
12F
131
133
13B,13C
140,141
144 --> 146
149,14A
14D,14E
151
154
Research Study on the Special and Special2 commands
Ok, ya está bueno de teoría pasemos a la práctica. Para ello usaré la base que usé para el tutorial FR | RF Mostrar Imágenes a Pantalla Completa by CompuMax ahora sabiendo que la rutina la inserté en 0x801390 y como debo sumarle +1 pasaré a editar la tabla empezando con el primer especial que puedo editar según la tabla, el 006, para ello le sumo al offset de la tabla (0x15FD60) + 0x18 que es (0x4 x 0x6) y allí, en 0x15FD78 estará el puntero a la rutina que tiene asignado el especial 0x6 y reemplazo con el puntero de mi rutina +1, es decir, 91 13 80 08.
Guardamos y abrimos el ROM con AdvanceMap y editamos el script de esta manera:
Código:
'---------------
#dynamic 0x900000
#org @Inicio
setvar 0x40F2 0x1 'variable de la cual depende la rutina. Carga la segunda entrada de la tabla.
special 0x6 'llamo la rutina 0x801390+1 a través del especial
pause 0x50 'hago un pausa para poder ver la imágen
setvar 0x40F2 0x0 'variable de la cual depende la rutina. Cargo la primera entrada de la tabla. La de Borrar
special 0x6 'llamo la rutina 0x801390+1 a través del especial
end 'fin del script
Listo! Ya hemos sustituido el callasm 801391 por special 0x6.
Saludos!
Max.
Última edición: