Antes de comenzar la clase quiero aclarar mi ausencia de la escuela, y por lo general de la comunidad de este último periodo de tiempo. Por motivos personales no me he visto con las ganas ni con el tiempo de continuar con la escuela hasta hoy. Espero que seáis comprensivos y lo entendáis.
En la clase hoy no vamos a aprender cosas sobre las rutinas en si, sino más bien sobre como lidiar con los fallos que se puedan originar a la hora de desarrollar una rutina. Este apartado es sumamente aconsejable y es de vital importancia aprender a usar el debugger.
¿Qué debugger usaremos?
Bueno, debuggers hay para elegir, pero yo os enseñaré a usar el VBA-SDL-H, pero podeis usar el que más os guste o el que mas comodo os parezca. Lo priemro será obtener la herramientas en si. Y para ello lo buscais en Internet, vagos.
Es broma, el la segunda clase dejé un archivo subido a Mediafire que contenía ciertas herramientas, por si no os acordáis dentro de la carpeta había tres cosas fundamentales, un compilador, un debugger y un desensamblador.
Por lo tanto, si no lo tenis descargado ya descargad el archivo que os dejé en la segunda clase.
¿Como abro el juego y accedo al modo debugger?
Para abrir una ROM limpia de Pokemon Fire Red USA simplemente arrastrad el archivo llamado “Fire Red” al archivo VBA-SDL-H.exe y se os abrirá el programa como si fuese un emulador más:
Para acceder al modo debugger debéis pulsar la tecla F11, (Fn + F11 en ciertos ordenadores). A continuación se os abrirá una ventana idéntica a esta:
¿Como funciona la herramienta?
El debugger tiene varios comandos que podéis ejecutar. Para ver la lista completa simplemente escribid lo siguiente:
y aparecerán los distintos comandos a ejecutar, los que aparecen son los siguientes:
Los que he puesto con asterisco son los que voy a explcuar, los demás no me parecen adecuados para el momento, pero podéis aprender vosotros mismo lo que hacen el resto de comandos.
Break point on read y clear break point on read
El bpr será uno de los comandos con los que vayamos a empezar nuestra tarea con el debugger. Antes de explicar su sintaxis quiero dejar claro su uso.
Si queremos saber lo que falla en una rutina tendremos que poner un break point on read antes de testear la rutina, para que una vez empiece a ejecutarse se abrá el debugger y podamos analizarlo en profundidad.
Imaginad que al principio (no necesariamente el primero comado claro esta, sino de los primeros) de mi rutina he puesto este comando:
Como bien sabéis (y si no es así id a leer las clases anteriores) este comando lee una word del offset almacenado en r0 y lo guarda en r0 asi sobreescribiendo el valor del registro.
Imaginad que la rutina que quiero probar se ejecuta al hablar con un NPC, pues antes de hablar con él, abro el modo debugger y pondré el comado bpr, pulso enter y A continuación escribiré “c” y pulso enter de nuevo.
En consecuencia, una vez que hable con el NPC y se empiece a ejecutar la rutina veré que justo al principio el break point saltará y se abrirá el debugger.
Su sintaxis es la siguiente:
Break Point on Write y Clear Break Point on Write
Este comando se parece mucho al anterior explicado, pero en vez de detectar cuando la rutina lee unos determinados bytes detecta cuando la rutina sobrescribe unos bytes de un offset especifico.
Por lo tanto, su sintaxis es la sigueinte:
Recordad determinar a que memoria os estáis refiriendo. Aunque bien pensado es absurdo poner 08, pues la ROM (Read Only Memory) no se puede editar a la hora de ser ejecutado el juego.
Para eliminar estos tipos de bp simplemente:
Continuar
Es un comando simple y llano, hace que se ejecute la próxima línea, no tiene más misterio. Para hacerlo simplemente ejecutad este comando:
Y despues enter, que todo hay que decirlo.
Desensamblar
Me veo en la obligación de explicarlo pero me parece una tontería. Para desensamblar ya os he dejado una base de datos mucho más clara donde podreís analizar las rutinas del juego. Además, para desensamblar vuestras rutinas no hace más que volver a ver la rutina en el Notepad. Pero bueno, este comando muestra los comandos alrededor del comando que se está ejecutando al momento. Su uso es:
Y os aparecerá algo así, depende del caso evidentemente:
Como os digo, para eso usad la base de datos que os he dejado.
Buscador de memoria
Este comando sirve para buscar una cadena de valores hexadecimales referente a textos a través de todas las memorias. Una vez ejecutado el comando se mostrarán las primeras x busquedas exitosas que se hayan encontrado, donde x lo has determinado tú. Por ejemplo:
Empieza a buscar desde el offset 0 y nos mostrará las primeras, como mucho 30 veces, los valores que haya escrito, en este caso, nos aparecerá lo siguiente:
Como veis hay tres offsets en la RAM donde estén esos caracteres escritos. Para los curiosos, convertido de hex a nuestro alfabeto el teto significa JANICE, el nombre de una entrenadora.
Os aconsejo usar números alto como el 30 para que no os saltéis ningún resultado.
Mostrar Memoria
Son unos comandos muy útiles que nos muestran la memoria a partir de un offset que hayamos determinado, está se puede alinear por bytes, half words o words, para cada uno se usa el comando mb, mh y mw respectivamente. Se usa así:
Y nos enseña una parte de la memoria a partir de ese offset. Por ejemplo,
Ejecutar próxima instrucción
Es un simple comando que su función es ejecutar la próxima instrucción, como antes he mostrado cada vez se mostrará la instrucción actual, la anterior y la siguiente y el valor de cada registro. Para usarlo simplemente:
Cabe mencionar que al escribir cualquier comando hay que darle al Enter para que se ejecute, aclaro esto porque hay de todo en este loco octano nuestro.
No se si esta será la última clase o si haré más, de todas formas os mantendré informado y gracias por la espera
CLASE 4
En la clase hoy no vamos a aprender cosas sobre las rutinas en si, sino más bien sobre como lidiar con los fallos que se puedan originar a la hora de desarrollar una rutina. Este apartado es sumamente aconsejable y es de vital importancia aprender a usar el debugger.
¿Qué debugger usaremos?
Bueno, debuggers hay para elegir, pero yo os enseñaré a usar el VBA-SDL-H, pero podeis usar el que más os guste o el que mas comodo os parezca. Lo priemro será obtener la herramientas en si. Y para ello lo buscais en Internet, vagos.
Es broma, el la segunda clase dejé un archivo subido a Mediafire que contenía ciertas herramientas, por si no os acordáis dentro de la carpeta había tres cosas fundamentales, un compilador, un debugger y un desensamblador.
Por lo tanto, si no lo tenis descargado ya descargad el archivo que os dejé en la segunda clase.
¿Como abro el juego y accedo al modo debugger?
Para abrir una ROM limpia de Pokemon Fire Red USA simplemente arrastrad el archivo llamado “Fire Red” al archivo VBA-SDL-H.exe y se os abrirá el programa como si fuese un emulador más:

Para acceder al modo debugger debéis pulsar la tecla F11, (Fn + F11 en ciertos ordenadores). A continuación se os abrirá una ventana idéntica a esta:

¿Como funciona la herramienta?
El debugger tiene varios comandos que podéis ejecutar. Para ver la lista completa simplemente escribid lo siguiente:
Código:
h
Código:
? Shows this help information. Type ? <command> for command help
ba Adds an ARM breakpoint
bd Deletes a breakpoint
bl Lists breakpoints
bpr Break on read*
bprc Clear break on read*
bpw Break on write*
bpwc Clear break on write*
bt Adds a THUMB breakpoint
c Continues execution*
d Disassembles instructions*
da Disassembles ARM instructions
db Don't break at the following address.
dbc Clear the Don't Break list.
dload Load raw data dump from file
dsave Dump raw data to file
dn Disassembles instructions near PC
dt Disassembles Thumb instructions
eb Modify memory location (byte)
eh Modify memory location (half-word)
er Modify register
eval Evaluate expression
ew Modify memory location (word)
ft Search memory for ASCII-string.
fh Search memory for hex-string.*
fr Resume current search.
h Shows this help information. Type h <command> for command help
io Show I/O registers status
load Loads a Fx type savegame
mb Shows memory contents (bytes)*
mh Shows memory contents (half-words)*
mw Shows memory contents (words)*
n Executes the next instruction*
q Quits the emulator
r Shows ARM registers
rt Run to address
rta Run to address (ARM)
rtt Run to address (Thumb)
save Creates a Fx type savegame
sbreak Adds a breakpoint on the given function
sradix Sets the print radix
sprint Print the value of a expression (if known)
ssymbols List symbols
sverbose Change verbose setting
swhere Shows call chain
trace Control tracer
var Define variables
Break point on read y clear break point on read
El bpr será uno de los comandos con los que vayamos a empezar nuestra tarea con el debugger. Antes de explicar su sintaxis quiero dejar claro su uso.
Si queremos saber lo que falla en una rutina tendremos que poner un break point on read antes de testear la rutina, para que una vez empiece a ejecutarse se abrá el debugger y podamos analizarlo en profundidad.
Imaginad que al principio (no necesariamente el primero comado claro esta, sino de los primeros) de mi rutina he puesto este comando:
Código:
ldr r0, [r0]
Imaginad que la rutina que quiero probar se ejecuta al hablar con un NPC, pues antes de hablar con él, abro el modo debugger y pondré el comado bpr, pulso enter y A continuación escribiré “c” y pulso enter de nuevo.
En consecuencia, una vez que hable con el NPC y se empiece a ejecutar la rutina veré que justo al principio el break point saltará y se abrirá el debugger.
Su sintaxis es la siguiente:
Código:
bpr {offset} {cantidad de bytes a leer}]/CODE]
Ya sois mayorcitos para saber que no basta con poner un offset de seis caracteres, hay que especificar a que memoria nos referimos. Es decir, si el offset es la ROM un 08 por delante, y si es a la RAM 02 (si es I/O RAM creo que era 03, pero es igual).
Para elimiar los bpr que hayamos puesto simplemente escribid:
[CODE]bprc
Una vez que hayamos puesto el comando bpr y haya saltado la alarma, por así decirlo, nos aparecerá la siguiente información útil:
Por una parte está el valor que tiene cada registro antes de ser ejecutada esa línea, lo cual es de vital importancia para saber que ocurre exactamente en la rutina y por otro lado tendremos el comando que se haya ejecutado antes, el que se va a ejecutar y el próximo en ejecutarse.
Ahora iremos ejecutando cada comando de uno en uno, usando el comando n, luego lo explico, y así ver el valor de cada registro en cada momento, lo cual nos sirve para detectar bugs. Si no se entiende preguntad sin miedo.
Código:
R00=00000001 R04=00000000 R08=00000000 R12=00000040
R01=00000004 R05=030030e4 R09=00000000 R13=03007e24
R02=030030f0 R06=030030e4 R10=00000000 R14=080004ab
R03=00000001 R07=030030f0 R11=00000000 R15=080008b0
CPSR=0000003f (......T Mode: 1f)
080008ac 1c18 add r0, r3, #0x0
> 080008ae 4008 and r0, r1
080008b0 2800 cmp r0, #0x0
debugger>
Ahora iremos ejecutando cada comando de uno en uno, usando el comando n, luego lo explico, y así ver el valor de cada registro en cada momento, lo cual nos sirve para detectar bugs. Si no se entiende preguntad sin miedo.
Break Point on Write y Clear Break Point on Write
Este comando se parece mucho al anterior explicado, pero en vez de detectar cuando la rutina lee unos determinados bytes detecta cuando la rutina sobrescribe unos bytes de un offset especifico.
Por lo tanto, su sintaxis es la sigueinte:
Código:
bpw {offset} {cantidad de bytes sobreescritos}
Para eliminar estos tipos de bp simplemente:
Código:
bpwc
Es un comando simple y llano, hace que se ejecute la próxima línea, no tiene más misterio. Para hacerlo simplemente ejecutad este comando:
Código:
c
Desensamblar
Me veo en la obligación de explicarlo pero me parece una tontería. Para desensamblar ya os he dejado una base de datos mucho más clara donde podreís analizar las rutinas del juego. Además, para desensamblar vuestras rutinas no hace más que volver a ver la rutina en el Notepad. Pero bueno, este comando muestra los comandos alrededor del comando que se está ejecutando al momento. Su uso es:
Código:
d
Código:
debugger> d
080008ae 4008 and r0, r1
080008b0 2800 cmp r0, #0x0
080008b2 d0fa beq $080008aa
080008b4 bc01 pop {r0}
080008b6 4700 bx r0
080008b8 30f0 add r0, #0xf0
080008ba 0300 lsl r0, r0, #0x0c
080008bc fffe blh $0ffc
080008be 0000 lsl r0, r0, #0x00
080008c0 4901 ldr r1, [$080008c8] (=$030030f0)
080008c2 6208 str r0, [r1, #0x20]
080008c4 4770 bx lr
080008c6 0000 lsl r0, r0, #0x00
080008c8 30f0 add r0, #0xf0
080008ca 0300 lsl r0, r0, #0x0c
080008cc 4901 ldr r1, [$080008d4] (=$030030f0)
080008ce 2000 mov r0, #0x0
080008d0 6208 str r0, [r1, #0x20]
080008d2 4770 bx lr
080008d4 30f0 add r0, #0xf0
debugger>
Buscador de memoria
Este comando sirve para buscar una cadena de valores hexadecimales referente a textos a través de todas las memorias. Una vez ejecutado el comando se mostrarán las primeras x busquedas exitosas que se hayan encontrado, donde x lo has determinado tú. Por ejemplo:
Código:
fh 0 30 C4BBC8C3BDBF
Código:
Search result (0): 0823fcec
Search result (1): 08243a04
Search result (2): 08243a2c
Search completed.
Os aconsejo usar números alto como el 30 para que no os saltéis ningún resultado.
Mostrar Memoria
Son unos comandos muy útiles que nos muestran la memoria a partir de un offset que hayamos determinado, está se puede alinear por bytes, half words o words, para cada uno se usa el comando mb, mh y mw respectivamente. Se usa así:
Código:
mb/h/w {offset}
Código:
debugger> mb 083D463E
083d463e e8 08 a0 70 e8 08 28 70 e8 08 a0 70 e8 08 28 70 ...p..(p...p..(p
083d464e e8 08 a0 70 e8 08 28 70 e8 08 a0 70 e8 08 b0 a6 ...p..(p...p....
083d465e e8 08 84 a7 e8 08 a4 a7 e8 08 6c a8 e8 08 8c a8 ..........l.....
083d466e e8 08 68 a9 e8 08 90 a9 e8 08 6c aa e8 08 8c aa ..h.......l.....
083d467e e8 08 6c ab e8 08 8c ab e8 08 64 ac e8 08 84 ac ..l.......d.....
083d468e e8 08 44 ad e8 08 64 ad e8 08 38 ae e8 08 5c ae ..D...d...8...\.
083d469e e8 08 40 af e8 08 64 af e8 08 44 b0 e8 08 64 b0 [email protected].
083d46ae e8 08 2c b1 e8 08 48 b1 e8 08 e0 b1 e8 08 00 b2 ..,...H.........
083d46be e8 08 e8 b2 e8 08 10 b3 e8 08 d0 b3 e8 08 f4 b3 ................
083d46ce e8 08 b4 b4 e8 08 d8 b4 e8 08 bc b5 e8 08 e0 b5 ................
083d46de e8 08 c8 b6 e8 08 ec b6 e8 08 a4 b7 e8 08 c8 b7 ................
083d46ee e8 08 8c b8 e8 08 b0 b8 e8 08 84 b9 e8 08 a8 b9 ................
083d46fe e8 08 60 ba e8 08 7c ba e8 08 48 bb e8 08 6c bb ..`...|...H...l.
083d470e e8 08 34 bc e8 08 58 bc e8 08 3c bd e8 08 60 bd ..4...X...<...`.
083d471e e8 08 1c be e8 08 40 be e8 08 2c bf e8 08 4c bf ......@...,...L.
083d472e e8 08 34 c0 e8 08 58 c0 e8 08 38 c1 e8 08 5c c1 ..4...X...8...\.
Debugger>
Es un simple comando que su función es ejecutar la próxima instrucción, como antes he mostrado cada vez se mostrará la instrucción actual, la anterior y la siguiente y el valor de cada registro. Para usarlo simplemente:
Código:
n
@Gosuto @Jaizu @White @KaiZ @Navy_ @Laquin @L!no the Maelstrom @speedgio @Hacko @Derlo @skhorus @Leviatan @BagBoy @Chema @Ancer @Edsteam8000 @Monika @Caco5400 @MasterNet @InmortalKaktus @Sharck @CompuMax @LilBuho19 @axel jose guerra @MichaKing @mikdark @5taDisminuida @★Urufu★ @~Jon. @Raul Company
@Venussaur best starter @Mod @esteban garcia @lucian @Edd el Penas @ElToby @Kurama @Subzero
@Venussaur best starter @Mod @esteban garcia @lucian @Edd el Penas @ElToby @Kurama @Subzero
No se si esta será la última clase o si haré más, de todas formas os mantendré informado y gracias por la espera