Hice un post hace poco de como conseguir ejecutar un script cada período de tiempo que queramos. Aunque para alguien que quiera aprender a fondo como funcionaba el sistema, aparte de tener ciertos errores, el tutorial era demasiado complejo.
Como la unidad de tiempo más práctica me parece el segundo he decidido dejar unas instrucciones claras de como implementar este sistema a una ROM de Fire Red.
Por lo tanto, el objetivo será ejecutar un script cada una cantidad de tiempo que queramos.
En el offset 0x54894 pegad
Donde XX XX XX es el offset +1 permutado de esta rutina:
XX: La cantidad de segundos que queremos que sean el periodo menos un segundo (en hex claro)
YY YY: variable permutada que servirá para activar el sistema, para activarlo setear la var a 1, para desactivarlo sirve cualquier otro valor, aunque por habito, poned un 0.
ZZ ZZ: variable para llevar la cuenta del tiempo, usad una var para esto y después de activar el sistema no toquéis esta variable. Mientras el sistema este desactivado esta var podéis usarla para otra cosa. Si vais a activar el sistema haced un backup de su contenido.
QQ QQ QQ: offset permutado (NO sumar 1) del script que queramos ejecutar
El script para activar el sistema debe tener esta estructura:
Y para desactivarlo:
Esto es todo, si queréis poder ejecutar mas de un script con este sistema simplemente usad el script al que llama la rutina como un switch case.
Byee
Como la unidad de tiempo más práctica me parece el segundo he decidido dejar unas instrucciones claras de como implementar este sistema a una ROM de Fire Red.
Por lo tanto, el objetivo será ejecutar un script cada una cantidad de tiempo que queramos.
Código:
.text
.align 2
.thumb
main:
push {r0-r2}
ldrh r0, system_var
ldr r1, var_finder
push {r1}
bl linker
pop {r1}
ldrh r0, [r0]
cmp r0, #1
bne noCrash
ldrh r0, time_var
bl linker
ldrh r1, [r0]
cmp r1, #0
bne dec_time
mov r1, #(periodo que queramos, max 255)
strh r1, [r0]
ldr r0, =(0x08[offset del script])
bl script_routine
b noCrash
script_routine:
ldr r1, =(0x08069AE4 +1)
bx r1
dec_time:
sub r1, #1
strh r1, [r0]
b noCrash
linker:
bx r1
noCrash:
pop {r0-r2}
ldr r1, [r2]
add r1, #0x11
ldrb r0, [r1]
cmp r0, #59
bls no_minute
ldr r0, =(0x0805489C +1)
bx r0
no_minute:
ldr r0, =(0x080548C4 +1)
bx r0
.align 2
system_var: .word 0x(ID del var para activar o desactivar el sistema)
time_var: .word 0x(variable pra contar el tiempo)
var_finder: .word (0x0806E454 +1)
En el offset 0x54894 pegad
Código:
00 49 08 47 XX XX XX 08
Código:
07 B4 12 48 13 49 02 B4 00 F0 15 F8 02 BC 00 88 01 28 11 D1 0E 48 00 F0 0E F8 01 88 00 29 07 D1 XX 21 01 80 0C 48 00 F0 01 F8 05 E0 0B 49 08 47 01 39 01 80 00 E0 08 47 07 BC 11 68 11 31 08 78 3B 28 01 D9 06 48 00 47 06 48 00 47 YY YY 00 00 FE 40 00 00 55 E4 06 08 QQ QQ QQ 08 E5 9A 06 08 9D 48 05 08 C5 48 05 08
YY YY: variable permutada que servirá para activar el sistema, para activarlo setear la var a 1, para desactivarlo sirve cualquier otro valor, aunque por habito, poned un 0.
ZZ ZZ: variable para llevar la cuenta del tiempo, usad una var para esto y después de activar el sistema no toquéis esta variable. Mientras el sistema este desactivado esta var podéis usarla para otra cosa. Si vais a activar el sistema haced un backup de su contenido.
QQ QQ QQ: offset permutado (NO sumar 1) del script que queramos ejecutar
El script para activar el sistema debe tener esta estructura:
Código:
#dynamic 0x800000
#org @start
setvar 0x(var para activar sistema) 1
setvar 0x(var de la cuenta del tiempo) (cantidad de periodo -1)
...
Código:
#dynamic 0x800000
#org @start
setvar 0x(var para activar sistema) 0
...
Byee
Última edición: