10535-GBA_|_Scripting_|_\[THUMB_MODE]Mini_Tutorial:_Cómo_ejecutar_scripts_a_través_de_ASM
#0
Sonicarvalho 17082
Buenas!

Mientras no termino el BIG UPDATE al Safari, voy posteando aquí unas cosas.

Hoy será ejecutar scripts a través de ASM. Este método solo funciona en OverWorld, claro. No en Bag, no en batallas, solo en OverWorld.

Requisitos mínimos:


Entonces, sigan el tutorial de ~Javs antes de empezaren este pues el de ~Javs vos da los basicos de ASM.
Pero mismo así, vos voy a explicar cada comando y hacer una analogía con el Scripting, para que perciban mejor.

El comando Ldr sirve para cargar números en los registros y acceder a la RAM. Pero aquí en este tutorial solo vamos a utilizar 'cargar numeros'. Este comando es una especie de loadpointer en el sentido literal. Carga un numero 32bit a la Memoria (en este caso, los registros)

El comando Bl es como en scripting el comando 'call', que llama una subrutina (en scripting, un subscript, como el 'CallStd'). Para que funcione correctamente, la Subrutina llamada tiene que terminar en Pop {pc} (puede dar Pop a mas registros, pero el Registro PC (R15) TIENE que estar presente!). Ese pop {pc} es como el comando 'Return' en scripting: Vuelta al función que le ha llamado.

El comando Bx rX tiene que ser usado con el ldr rX, pues ese comando pone el processador a ejecutar las instrucciones de código en el offset de el registro rX. Es como el comando 'Goto' en scripting. No tiene retorno. Por eso vamos a usar ese dentro de un Bl (buen truco, no? ;))
---------------------------------------------

Después de los básicos, vos voy a presentar una rutina hecha para que puedan llamar scripts en rutinas.
ATENCION: YO NO USO GOLDROAD COMO COMPILADOR. ESTE CODIGO ES PARA DEVKITARM y EL ENSAMBLADOR QUE VIENE CON MID2AGB (as.exe y objcopy.exe)
Ejemplo FIRERED:

.thumb
.align 2
push {lr}
ldr r0, SCRIPT_ADRESS
bl SCRIPT_ROUTINE //subrutina que va a ejecutar los scripts
pop {pc}

SCRIPT_ROUTINE:
ldr r1, SCRIPT_EXECUTER
Bx r1

.align 2
SCRIPT_ADRESS: .word 0x081624F5 //Aquí definen vuestro script offset
SCRIPT_EXECUTER: .word 0x08069AE5 //Esta es la rutina que ejecuta los scripts. Offset +1


Ahora deben ter reparado en algo.
Porque no he push'ado los registros r0 y r1? ¿:.
La verdad es, cuando no damos push a registros y llamamos un Bl, significa que estamos pasando argumentos a la rutina que estamos llamando. Asi que en este caso especifico, NO DEBEMOS dar push {r0-r1, lr}, solo push {lr}.
Los argumentos son:
r0= Script offset (un script que quieran)
r1= Script executer (el offset de la rutina que hace con que los scripts sean ejecutados!)

Los offsets de el Script Ejecuter para las versiones Ruby, Firered y Emerald son(no vos olvidéis de poner el offset + 1!Es necesario para que funcione correctamente):
Ruby:080655B8
FireRed:08069AE4
Emerald:08098EF8

Por ahora es todo. Espero tener ayudado!
-------------------------------------
Tutorial made by Sonicarvalho AKA Dark Rayquaza

PD: Como en este forum todos usan GOLDROAD, entonces pido a alguien que adapte la rutina para GOLDROAD. Gracias.