Registrarse

[Otros] FR | Asignar Rutinas al Comando SPECIAL

CompuMax

Discord: CompuMax#0425
Miembro insignia
[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:

Código:
special 0xXXYY
Si la variable contine sólo un byte se puede escribir de la siguiente manera:

Código:
special 0xYY
- 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:

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
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:

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
Probamos In Game y...


Listo! Ya hemos sustituido el callasm 801391 por special 0x6.

:D

Saludos!

Max.



 
Última edición:

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Genial y gracias por compartirlo! :D

En lo personal, me resulta prácticamente lo mismo recordar el valor del special que cargará la rutina que en específico debo usar, o el callasm a la rutina propiamente dicha.

Pero bueno. Lo veo interesante lo que nos has traído! La verdad, no tenia la menor idea de por donde andaban las rutinas que se cargaban mediante los specials xD

Enhorabuena sigue así!

♠Un saludo!♠
 

Adke

weeeh
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Pues qué quieres que te diga, es complicarse un poco más la vida.
Así como el tuto de las imágenes me pareció genial este lo veo un poco inútil, es decir, si ya puedes llamar a las rutinas con el callasm ¿para qué vas a gastar más tiempo en asignarlo a un special? Si dices que es por comodidad al scriptear o para no tener que recordar muchos offsets, también vas a tener que recordar qué special hace qué. Por no decir que eso se escribe para no olvidarse y tenerlo a mano al hacer un script.

Aún así se agradece el aporte y seguro que alguien le encuentra alguna utilidad más directa.
Ya tengo ganas de ver qué será lo próximo :D
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Pues qué quieres que te diga, es complicarse un poco más la vida.
Así como el tuto de las imágenes me pareció genial este lo veo un poco inútil, es decir, si ya puedes llamar a las rutinas con el callasm ¿para qué vas a gastar más tiempo en asignarlo a un special? Si dices que es por comodidad al scriptear o para no tener que recordar muchos offsets, también vas a tener que recordar qué special hace qué. Por no decir que eso se escribe para no olvidarse y tenerlo a mano al hacer un script.

Aún así se agradece el aporte y seguro que alguien le encuentra alguna utilidad más directa.
Ya tengo ganas de ver qué será lo próximo :D
Eso depende de cada quién. Yo veo más fácil recordar el special o hacer una tabla de estos (de ser muchos) que recordar o escribir los offsets de todas las rutinas que inserté, que por lo que veo voy a usar unas cuantas :D

Y aclarando su uso...
Sí, la idea es hacer más comodo el scripting o al menos para mí será más cómodo y espero que a alguien le sirva.

¿Lo próximo?

Seguiré trabajando en los BG

- Modificar los BG 1, 2 y 3
- Desplazamientos para dar efectos gráficos como los de la Vs. Bar, el Teleférico o el Ferrocarril, entre otros que se puedan crear
- Efectos de Transparencias
- Aplicación de efectos fade-in y fade-out

A excepción de los efectos fade-in y fade-out el resto lo tengo casi listo :D
 

KevinXDE

Usuario mítico
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Bueno, como dices, puede ser útil para mucha gente xD. Yo lo veo otra manera de complicarse la vida también, te puedes simplemente apuntar el offset de la rutina y el tamaño que ocupa, y con eso en teoria no tendrías ningún problema en el futuro :v

A menos que pierdas el archivo uh. Si eres de los que suelen perder las cosas quizás esto te vaya bien xD

Veo que te estás poniendo mucho las pilas con el ASM. Sigue así ^^!
 
M

Miembro eliminado 28262

Invitado
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

¡COMENTARIO DEL JINETE WAHPOCALÍPTICO SAGE!
Sorprendente!
Aunque como ya te han comentado me resulta complicarse la vida por na, aunque para una ROM Base parece una idea genial, quizás eso es lo que estaba pensando JPAN al hacer su engine.

Como sea.. estoy to perdío entre este tutorial, el otro y las rutinas de Javi, quizás deba tomarmelo con calma, pero tú no eh, sigue aportando que está to guapo lo que haces.

Si me lo permites, sería genial si trajeras a wah el Follow Me, me lo he leído por encima pero me cuesta entenderlo.
¡Muchas Gracias!
[/B]
【Guerra】
 
Última edición por un moderador:

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Yo para no complecarme la vida expandía la tabla de scripts estandarizados (los std) para llamarlos a puro callstd, pero es más sencillo llamarlos por medio de un special, yo lo veo más sencillo que recordar los callasm, imcluso te ahorras 2 bytes por linea (De 2 en 2 se va viendo el ahorro de bytes)
 

Kaiser de Emperana

Called in hand
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

¡Yo estoy con vos Compumax! Yo hubiera hecho un comando para ahorrarme los setvars..., pero casi
Se demoran 2 minutos en modificar la tabla y termina quedando mucho mejor.

Pero así como dato. No hace falta aprenderse el número ni para el callasm, ni para el special xD Basta con crear un archivo que se llame "lo_que_se_les_cante_la_gana.rbh", que digo lo de abajo, y ponerlo en la misma carpeta que los otros *.rbh
Código:
#define callasm_rutina_genial_que_carga_imágenes 0x801930
#define special_rutina_genial_que_carga_imágenes 0x6
Y después pueden hacer esto:

Código:
#include lo_que_se_les_cante_la_gana.rbh

#DYNAMIC 0x800000

#org @inicio
...
callasm callasm_rutina_genial_que_carga_imágenes
...
special special_rutina_genial_que_carga_imágenes
...
Y así no se están aprendiendo números por nada.
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Respuesta: FR | RF [Tutorial ASM] Asignar Rutinas al Comando SPECIAL by CompuMax

Yo para no complecarme la vida expandía la tabla de scripts estandarizados (los std) para llamarlos a puro callstd, pero es más sencillo llamarlos por medio de un special, yo lo veo más sencillo que recordar los callasm, imcluso te ahorras 2 bytes por linea (De 2 en 2 se va viendo el ahorro de bytes)
Hasta que alguién le vió utilidad! jajaja

Bueno quizás se están limitando sólo a lo que hago en el tutorial y no a las posibilidades de éste. Como mencioné la tabla contiene los offsets de TODOS los especiales. Creo que sería útil para conocer la rutina que hace "x" cosa y aprender un poco más de ASM (o al menos yo que estoy aprendiendo me parece genial). Y como ya he dicho creo que es más fácil recordar el valor de una variable que un offset completo además como muy bien has acotado hasta nos estámos ahorrando espacio.

:D

¡Yo estoy con vos Compumax! Yo hubiera hecho un comando para ahorrarme los setvars..., pero casi
Se demoran 2 minutos en modificar la tabla y termina quedando mucho mejor.

Pero así como dato. No hace falta aprenderse el número ni para el callasm, ni para el special xD Basta con crear un archivo que se llame "lo_que_se_les_cante_la_gana.rbh", que digo lo de abajo, y ponerlo en la misma carpeta que los otros *.rbh
Código:
#define callasm_rutina_genial_que_carga_imágenes 0x801930
#define special_rutina_genial_que_carga_imágenes 0x6
Y después pueden hacer esto:

Código:
#include lo_que_se_les_cante_la_gana.rbh

#DYNAMIC 0x800000

#org @inicio
...
callasm callasm_rutina_genial_que_carga_imágenes
...
special special_rutina_genial_que_carga_imágenes
...
Y así no se están aprendiendo números por nada.
Wow! Esa si no me la sabía bro.

:D

Bueno más fácil imposible!

jejeje

Muchas gracias por el apoyo y por la asesoría por supuesto!
 
Arriba