Registrarse

[ASM] FR | chequeo de teclas

L!no

GBA Developer
Hoy les traigo una rutina que encontre en pokecommunity para saber que tecla pulso el jugador, la rutina es de FBI,creditos para el.

¿qué necesitamos?
---------------------
HxD
Un cerebro (obligatorio)
---------------------

Empezemos!
Primero descargamos FR compilamos esta rutina y la insertamos en un offset vacio:
.text
.align 2
.thumb
.thumb_func

main:
ldr r0, =(0x30030F0)
ldrh r1, [r0, #0x2E] @byte in super state for keypress
cmp r1, #0x0
beq cont
ldr r0, =(0x20370B8) @var 0x8000 location
strh r1, [r0]
ldr r4, =(0x806B922 +1)
bx r4

cont:
mov r0, #0x1
and r0, r0, r1
cmp r0, #0x0
beq section
ldr r1, =(0x806B922 +1)
bx r1

section:
ldr r0, =(0x806B8A6 +1)
bx r0

.align 2

Como los amo a todos, les dejare la rutina ya compilada:
07 48 C1 8D 00 29 03 D0 06 48 01 80 06 4C 20 47 01 20 08 40 00 28 01 D0 03 49 08 47 03 48 00 47 F0 30 00 03 B8 70 03 02 23 B9 06 08 A7 B8 06 08

Para quienes la vayan a insertar ya compilada, el espacio necesario es de 30 bytes.
----------------------------------------------------------------------------------
¡Es muy importante anotar donde la insertaron!
----------------------------------------------------------------------------------
Ok, sigamos.
Vayan al offset 6B89A con ctrl+G y pegen escribiendo ctrl+B esto:
Código:
00 00 00 48 00 47 XX XX XX 08[CODE]
Donde XX XX XX es el pointer a nuestra rutina +1.

[SPOILER="como crear el pointer"]Imaginemos que yo puse la primera rutina en la posicion 0x800000:
Tomen su direccion y agregenle 1:
0x800000 - 0x800001
Separenla en 3 grupos de dos numeros/letras:
0x800001 - 0x80 0x00 0x01
Ahora pongan el primer grupo en el ultimo lugar y el ultimo en el primero:
0x80 0x00 0x01 - 0x01 0x00 0x80
Y nuestro pointer es:
01 00 80[/SPOILER]

¿Que hicimos?
Le dimos a la variable 0x8000 la funcion de guardar la tecla que pulsamos.
Y los valores de las teclas son:
[QUOTE]Abajo: 0x80
Arriba:  0x40
Izquierda: 0x20
Derecha: 0x10
A: 0x1
B: 0x2
Select: 0x4
Start: 0x8[/QUOTE]

Para saber que tecla es pulsada pongan esto en un script:
[CODE]pause 0x250
compare 0x8000 0x(valor de la tecla)
if 0x1 goto @(direccion)
Ejemplo:
Código:
#dynamic 0X800000
#org @inicio
lock
msgbox @msg 0x6
[COLOR="Red"]pause 0x250[/COLOR]
[COLOR="Blue"]compare 0x8000 0x20[/COLOR]
[COLOR="Black"]if 0x1 goto @continua[/COLOR]
msgbox @msg1 0x6
release
end

#org @continua
msgbox @msg2 0x6
release
end

#org @msg
= maldicion... esta contraseña es\nnueva...\l¿que hago?\lpulsa [R] para poner la contraseña\loriginal o [L] para apretar numeros al\lazar

#org @msg1
= la alarma! yo me piro!

#org @msg2
= uffff...\nabrio!
Rojo: Te da diez segundos para elegir una tecla, una vez elegida, mantener.
Azul: Compara la variable 0x8000 con 0x20, que significa que tocamos izquierda.
Negro: La condicion, sin condicion no hay compare.

Ya ven,con esto pueden hacer el sistema de hacks como pokemon triangulo origen o pokemon ancient en su propio hack.
Y por ultimo,las imagenes del testeo:
Click para ver el album.
 
Última edición:

KrenoZ

Pulling off deep emotions
Respuesta: ASM|chequeo de teclas

Y porqué no han comentado todavía aquí? xD

Muy bueno el aporte,siempre me preguntaba como hacer eso(aunque no se si ya lo habían posteado aquí),pero no sabía que era tan fácil.
Bueno,muchas gracias tío,gran aporte,de seguro lo uso.
Saludos.
 

Skyflyer

Creador de Pokémon Zenit
Re: ASM|chequeo de teclas

La verdad es que esto está guay para llevar a cabo ciertos puzles del juego y darle así más variedad.

Por cierto, veo que usas "->" para las flechas, puedes poner el simbolo de flecha como tal si pones en la msgbox:

(Up)
[D] (Down)
[L] (Left)
[R] (Right)

Imagino que no hace falta aclararlo pero por si acaso, es poner la letra en cada caso con sus corchetes (los paréntesis no).

Un saludo!
 
M

Miembro eliminado 28262

Invitado
Respuesta: ASM|chequeo de teclas

Damn! DamnDammDamn!
Vaya que estoy sorprendido, eres nuevo y ya estas aportando cosas como esta, sin duda es genial, a mucha gente (incluyéndome) le servirá un montón! No sabía que había otra forma de hacerlo sin wbto.
Sin duda acabas de robar mi atención y ganarte mi respeto
Sigue asi!
 

Sasaki Haise

Sugoi desu~
Respuesta: ASM|chequeo de teclas

Esto ya se podía hacer con WTBO de hecho el script del Pokémon Triángulo Origen está hecho con WTBO si mal no recuerdo.
Pero bueno, nunca vienen mal otros métodos ya que quién sabe, quizá este método te deje hacer cosas con WTBO no.
Puede que lo pruebe en un futuro, gracias por el aporte.
Saludos!
 

Bugrhak

A long time ago I used to call myself "Subzero".
Respuesta: ASM|chequeo de teclas

No es muy diferente al método anterior, pero está bien que haya mas de una manera.
No recuerdo pero creo que el engin de jpan tenia algo de esto (NO RECUERDO).
Esta todo bien, todo perfecto y fácil de entender :)
Lindo aporte!

-------------
Para llevar tan poco tiempo en el RH, te has sabido mover bastante bien colega, sigue así!
 

CompuMax

Discord: CompuMax#0425
Miembro insignia
Respuesta: ASM|chequeo de teclas

Primero que nada gracias por traer la rutina a la comunidad (no sé si ya estaba aquí). Yo uso esta rutina desde hace ya un tiempo y tengo que aclarar unas cuantas cosas respecto a ella que no lo has comentado en el post.

1) No hace falta hacer una pausa ni mantener presionado el botón a seleccionar. Para ello puedes llamar la función que "escucha" que presionas alguna tecla en determinado momento y continuar con el script. La función es waitkeypress y lo que hace es esperar que sea presionada una tecla y continúa con la siguiente línea del script donde se puede verificar qué tecla se presionó de acuerdo al valor de la variable, en este caso, la variable 0x8000. Un ejemplo:

#org @loop
waitkeypress 'Espera a que se presione alguna tecla
compare 0x8000 0x10 'Verifica si fué la tecla derecha
if 0x1 goto @derecha 'Va al script correspondiente a la tecla derecha
compare 0x8000 0x20 'Verifica si fué la tecla izquierda
if 0x1 goto @izquierda 'Va al script correspondiente a la tecla izquierda
compare 0x8000 0x80 'Verifica si fué la tecla abajo
if 0x1 goto @abajo 'Va al script correspondiente a la tecla abajo
compare 0x8000 0x40 'Verifica si fué la tecla arriba
if 0x1 goto @arriba 'Va al script correspondiente a la tecla arriba
goto @loop 'Si no se presionó ninguna de las teclas esperadas omite la tecla presionada y sigue monitoreando las teclas
end

2) Se debe tener en cuenta que si se mantiene presionado más de una tecla al mismo tiempo, el valor de la variable 0x8000 será la sumatoria del valor de las teclas presionadas, es decir, que si presionamos A + B , el valor de la variable será 0x3. Quizás parezca insignificante, pero si ven casos como B + START + DERECHA será 0x20, lo que corresponde a la tecla IZQUIERDA. Además de que con un poco de ingenio le dá un mayor espectro de usos a esta maravillosa rutina como hacer condiciones de multiples teclas.

Finalmente agradezco una vez más que hayas traido la rutina al foro, pero creo que no debería ser solo traducir lo que medio se entiende y postearlo sin tener un conocimiento a fonde de lo que se está publicando. No sé si será una falta, pero ni siquiera te has tomado la molestia de publicar el enlace al post original. Espero que mejores la manera en que haces tus publicaciones y que sigas trayendo estos maravillosos aportes a la comunidad.

Saludos!

Max.
 

Nachoius

Caminante del cielo
Re: FR | ASM | chequeo de teclas

Hoy les traigo una rutina que encontre en pokecommunity para saber que tecla pulso el jugador, la rutina es de FBI,creditos para el.

¿qué necesitamos?
---------------------
HxD
Un cerebro (obligatorio)
---------------------

Empezemos!
Primero descargamos FR compilamos esta rutina y la insertamos en un offset vacio:
.text
.align 2
.thumb
.thumb_func

main:
ldr r0, =(0x30030F0)
ldrh r1, [r0, #0x2E] @byte in super state for keypress
cmp r1, #0x0
beq cont
ldr r0, =(0x20370B8) @var 0x8000 location
strh r1, [r0]
ldr r4, =(0x806B922 +1)
bx r4

cont:
mov r0, #0x1
and r0, r0, r1
cmp r0, #0x0
beq section
ldr r1, =(0x806B922 +1)
bx r1

section:
ldr r0, =(0x806B8A6 +1)
bx r0

.align 2

Como los amo a todos, les dejare la rutina ya compilada:
07 48 C1 8D 00 29 03 D0 06 48 01 80 06 4C 20 47 01 20 08 40 00 28 01 D0 03 49 08 47 03 48 00 47 F0 30 00 03 B8 70 03 02 23 B9 06 08 A7 B8 06 08

Para quienes la vayan a insertar ya compilada, el espacio necesario es de 30 bytes.
----------------------------------------------------------------------------------
¡Es muy importante anotar donde la insertaron!
----------------------------------------------------------------------------------
Ok, sigamos.
Vayan al offset 6B89A con ctrl+G y pegen escribiendo ctrl+B esto:
Código:
00 00 00 48 00 47 XX XX XX 08[CODE]
Donde XX XX XX es el pointer a nuestra rutina +1.

[SPOILER="como crear el pointer"]Imaginemos que yo puse la primera rutina en la posicion 0x800000:
Tomen su direccion y agregenle 1:
0x800000 - 0x800001
Separenla en 3 grupos de dos numeros/letras:
0x800001 - 0x80 0x00 0x01
Ahora pongan el primer grupo en el ultimo lugar y el ultimo en el primero:
0x80 0x00 0x01 - 0x01 0x00 0x80
Y nuestro pointer es:
01 00 80[/SPOILER]

¿Que hicimos?
Le dimos a la variable 0x8000 la funcion de guardar la tecla que pulsamos.
Y los valores de las teclas son:


Para saber que tecla es pulsada pongan esto en un script:
[CODE]pause 0x250
compare 0x8000 0x(valor de la tecla)
if 0x1 goto @(direccion)
Ejemplo:
Código:
#dynamic 0X800000
#org @inicio
lock
msgbox @msg 0x6
[COLOR="Red"]pause 0x250[/COLOR]
[COLOR="Blue"]compare 0x8000 0x20[/COLOR]
[COLOR="Black"]if 0x1 goto @continua[/COLOR]
msgbox @msg1 0x6
release
end

#org @continua
msgbox @msg2 0x6
release
end

#org @msg
= maldicion... esta contraseña es\nnueva...\l¿que hago?\lpulsa [R] para poner la contraseña\loriginal o [L] para apretar numeros al\lazar

#org @msg1
= la alarma! yo me piro!

#org @msg2
= uffff...\nabrio!
Rojo: Te da diez segundos para elegir una tecla, una vez elegida, mantener.
Azul: Compara la variable 0x8000 con 0x20, que significa que tocamos izquierda.
Negro: La condicion, sin condicion no hay compare.

Ya ven,con esto pueden hacer el sistema de hacks como pokemon triangulo origen o pokemon ancient en su propio hack.
Y por ultimo,las imagenes del testeo:
Click para ver el album.
Lino ando tratando de desarrollar lo siguiente, un d-pad con las direciones de caminar invertidas. Peri necesito que se ejecute la inversión durante un tiempo. Esto serviría? Es decir poder caminar de forma invertida durante un tiempo o al menos que se pueda activar o desactivar.
 
Arriba