Clase 2
En la clase de hoy empezaremos a hacer nuestras propias rutinas, y como no podía ser de otro modo empezaremos con el concurso para ver quien es el mejor alumno. Sobre el contenido de la clase daremos las siguientes cosas.
- Sintaxis principal de la rutina
- Cargar y almacenar datos mediante registros
- Operaciones matemáticas básicas con registros
Antes de nada, como procederemos a hacer una rutina necesitaréis un compilador. En el siguiente enlace os dejaré un archivo que entre otras cosas contiene un compilador, por ahora, centraos en el compilador solo.
Sintaxis principal de la rutina
No sabía muy bien como llamar a este apartado, creo que os abréis dado cuenta al ver el título tan cutre que he puesto, pero simplemente quiero explicar las cosas que se ponen en todas las rutinas. Cabe destacar que para hacer las propias rutinas usaré un editor de textos, como el Notepad que viene de serie con Windows.
Por lo tanto, primero abrimos el editor de texto, tal que así:
Y ahora empieza la rutina. Lo primero que pondremos siempre (siempre) será lo siguente:
Código:
.text
.align 2
.thumb
main:
Con esto ya podemos empezar con la rutina!
Cargar y almacenar datos mediante registros
En el ASM el objetivo principal es mediante unos datos iniciales editar cierta parte de la RAM, a grandes rasgos vamos. Por lo tanto, primero necesitaremos cargar nuestros datos de inicio. ¿Dónde los cargamos? Sencillo, en los registros. Si no te acuerdas de lo que es un registro vuelve a la clase anterior.
Los comandos para cumplir esto son ldr, ldrb y ldrh
Cada uno de estos comandos se puede usar de dos formas posibles. La primera para cargar un offset en un registro. La segunda, para cargar los valores que haya en los offsets antes mencionados.
Pero antes de nada, la diferencia entre todos ellos radica en la capacidad de cargar valores en los registros. Es decir, el ldr es capaz de cargar una word (cuatro bytes) en un registro desde un offset. El ldrb puede cargar un byte desde un offset y el ldrh hace lo mismo pero con dos bytes (half word).
Para aclarar esto, un ejemplo. Imaginad que queremos cargar en r0 el valor de la variable 0x800D, más conocida como LASTRESULT.
Lo primero es hacer una equivalencia entre el offset y una palabra que vosotros queráis. Es decir, como normalmente los offsets se usan más de una vez, es más cómodos darle un nombre y usarlo, habiendo definido que offset corresponde a esa palabra:
Código:
.text
.align 2
.thumb
main:
.align 2
lastresult: .word 0x20370D0
Algunos os preguntaréis que diablos querrá decir el offset que yo he puesto. Porque al principio he dicho que usaré la variable 0x800D. Pues bien, los valores de las variables se almacenan en distintos offsets de la memoria RAM (de ahí el prefijo 2, si fuera un offset de la ROM sería 8, esto os lo recordaré más adelante).
Y el offset en el que se almacena el valor de la variables 0x800D es precisamente 20370D0. Por ejemplo, estos son los offsets de otras variables.
(al final del post os podré una lista de offsets de la RAM)0x20370B8 0x8000
0x20370BA 0x8001
0x20370BC 0x8002
0x20370BE 0x8003
Ahora vamos a cargar el offset correspondiente a lastresult en r0:
Código:
.text
.align 2
.thumb
main:
push {r0, lr}
ldr r0, lastresult
.align 2
lastresult: .word 0x20370D0
Este es un comando que lo podremos en el 99 por cada 100 casos. Se trata de hacer un backup de los valores que tenían los registros seleccionados para que podamos usarlos sin perder los anteriores datos. Esto se guarda en un stack (mirar clase anterior si no sabéis que es) y el funcionamiento del comando es el siguiente.
Si voy a usar tres registros:
Otra forma de usar el push es seleccionar uno a uno cada uno de los registros a usar (es absurdo pero lo explicaré igual. Imaginad que quiero usar r0, r2 y r6. Pues el push será así:
Pero vamos, el primer método es el útil, esto no tiene mucho sentido, al darnos igual que registro usar.
Es decir, empujaremos a la pila los valores de los registros r0, r1, r2... hasta rX incluido. Además del registro link register (simplemente hay que ponerlo, no tiene más misterio). Por ejemplo, si en mi rutina voy a usar dos registros al principio tendré que poner lo siguiente:Push {r0-rX, lr}
Código:
.text
.align 2
.thumb
main:
push {r0-r1, lr}
Código:
.text
.align 2
.thumb
main:
push {r0-r2, lr}
Código:
.text
.align 2
.thumb
main:
push {r0, r2, r6, lr}
Lo siguiente será cargar el valor de la variable 0x800D en un registro, para ello continuaremos así:
Código:
.text
.align 2
.thumb
main:
push {r0, lr}
ldr r0, lastresult
ldrh r0, [r0]
.align 2
lastresult: .word 0x20370D0
Bien, usado de esta forma el ldr (o ldrh o ldrb) lo que hará será cargar en el registro primero indicado una word, half word o byte (depende del comando usado) del offset contenido por el registro entre corchetes. Así de simple. En este caso, para ahorrarme registros sobrescribiré el offset del r0 por el valor de la variables, al ser inútil la anterior información (por ahora...)
Si en vez de querer cargar datos de un offset de un registro quiero hacerlo, por ejemplo, de cuatro bytes más adelante, simplemente haré esto:
Código:
.text
.align 2
.thumb
main:
push {r0, lr}
ldr r0, lastresult
ldrh r0, [r0, #0x4]
.align 2
lastresult: .word 0x20370D0
Para guardar datos en determinados offset de la RAM se usarán los comandos str, strb y strh. Tiene un único uso y es el siguiente:
Guarda el word almacenado en el registro r0 en el offset almacenado en el registro r1. Si se usa strb se cogerá el byte de r0, con strh el half word. Como en el caso del ldr aquí también podemos seleccionar un offset de más adelante:str r0, [r1]
Para entender esto vamos con un ejemplo. Lo que haré será simular el comando copyvar del XSE, que copia el valor de una variable en otra. En este caso copiaré el valor de 0x800D en 0x8000.str r0, [r1, #0xC]
Lo primero, la sintaxis y declarar los offsets:
Código:
.text
.align 2
.thumb
main:
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Código:
.text
.align 2
.thumb
main:
push {r0, lr}
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Código:
.text
.align 2
.thumb
main:
push {r0, lr}
ldr r0, lastresult
ldrh r0, [r0]
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Código:
.text
.align 2
.thumb
main:
push {r0-r1, lr}
ldr r0, lastresult
ldrh r0, [r0]
ldr r1, varnumber_8000
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Código:
.text
.align 2
.thumb
main:
push {r0-r1, lr}
ldr r0, lastresult
ldrh r0, [r0]
ldr r1, varnumber_8000
strh r0, [r1]
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Al usar un push y empujar los valores de los registros, después de la rutina necesitamos devolver sus valores originales a los registros. Para eso existe el comando pop. Sabed que necesitamos usar pop con todos los registro a los que hayamos usado push. Su sintaxís es exactamente igual al push.
Por lo tanto, la rutina queda así:
Bueno, en vez de lr se pone pc, simplemente ponedlo.
Por lo tanto, la rutina queda así:
Código:
.text
.align 2
.thumb
main:
push {r0-r1, lr}
ldr r0, lastresult
ldrh r0, [r0]
ldr r1, varnumber_8000
strh r0, [r1]
pop {r0-r1, pc}
.align 2
lastresult: .word 0x20370D0
varnumber_8000: .word 0x20370B8
Se que esta parte de la clase ha sido un infierno, pero necesito que los comandos push, pop, ldr y str (y sus derivados) sean entendidos al cien por cien. Y si han quedado dudas, preguntad porque esto es muy muy muy importante. De verdad, preguntad sin miedo (en serio).
Operaciones matemáticas básicas con registros
Esta parte de la clase no es especialmente pesada ni difícil, simplemente os enseñaré a hacer operaciones entre registro. A si que... pues empezamos con el primero.
mov
No es una operación por si misma, pero es un comando importante y hay que aprenderlo. Lo que hace es mover un byte a un registro, es decir, un valor ente 0x00 y 0xFF ambos incluidos. Con el siguiente ejemplo veréis como se usa.
Es decir, definís el registro de destino y el byte que queráis.mov r0, 0xC
add
Suma el valor de dos registros o el valor de un registro con un byte (de ahora en adelante conocidos como valores inmediatos). Un ejemplo,
Guarda en el primero registro el valor de la suma de los valores que contienen los otros dos registro. En este caso, r0 + r1 => r0add r0, r0, r1
Guarda en el primer registro la suma del valor del siguiente registro y el valor inmediato que hayáis definido. En este caso, r0 + #0x3 => r0add r0, r0, #0x3
sub
Resta el valor de un registro al valor de otro registro o resta al valor de un registro un valor inmediato. For example,
Guarda en el primero registro el valor de la resta de los valores que contienen los otros dos registro. En este caso, r0 - r1 => r0sub r0, r0, r1
Guarda en el primer registro la resta del valor del siguiente registro y el valor inmediato que hayáis definido. En este caso, r0 - #0x3 => r0sub r0, r0, #0x3
mul
Multiplica el valor de dos registros y los guarda en un registro (notese que se puede elevar un valor en dos si los dos registros a multiplicar son el mismo).
Guarda en r0 en resultado de la multiplicación de los valores de r0 y r1.mul r0, r0, r1
Para hacer el valor de un registro al cuadrado:
Bueno, por hay suficiente, me he pasado lo sé, pero eh, aquí venimos aprender. La cosa es que hoy ya toca tarea. No os voy a poner ninguna, que cada uno haga una rutina y que lo postee en este post, que me lo mande por perfil o por MP (como queráis).mul r0, r0, r0
Cabe decir que cada rutina tendrá que estar explicada. Y cada offset que uséis decid cual es, que no soy adivino (por ahora).
Os pongo una lista de offset de la RAM a ver si se os ocurre algo. Aunque con estos conocimientos no os aconsejo ir más lejos de las variables.
Map of FireRed's RAM
0x02002D40 ? Start of data that apparently controls
the colors of the pixels inside of the
current box (menu, msgbox, etc.).
0x020204B4 12b Dialog box 1
0x020204C0 12b Dialog box 2
0x020204CC 12b Dialog box 3
0x020204D8 12b Dialog box 4
0x020204E4 12b Dialog box 5
0x020204F0 12b Dialog box 6
0x020204FC 12b Dialog box 7
0x02020508 12b Dialog box 8
0x02020514 12b Dialog box 9
0x02020520 12b Dialog box 10
0x0202052C 12b Dialog box 11
0x02020538 12b Dialog box 12
0x02020544 12b Dialog box 13
0x02020550 12b Dialog box 14
0x0202055C 12b Dialog box 15
0x02020568 12b Dialog box 16
0x02020574 12b Dialog box 17
0x02020580 12b Dialog box 18
0x0202058C 12b Dialog box 19
0x02020598 12b Dialog box 20
0x020205A4 12b Dialog box 21
0x020205B0 12b Dialog box 22
0x020205BC 12b Dialog box 23
0x020205C8 12b Dialog box 24
0x020205D4 12b Dialog box 25
0x020205E0 12b Dialog box 26
0x020205EC 12b Dialog box 27
0x020205F8 12b Dialog box 28
0x02020604 12b Dialog box 29
0x02020610 12b Dialog box 30
0x0202061C 12b Dialog box 31
0x02020628 12b Dialog box 32
0x02021CD0 32b String buffer 0
0x02021CF0 20b String buffer 1
0x02021D04 20b String buffer 2
0x02021D18 ? String to be displayed in a message box
0x02022B4B 1b Flags for current battle?
0x02022B4C 4b Flags for current battle? Set to 0x8 by repeattrainerbattle.
0x02023E8A 1b Repeattrainerbattle: Unknown. Loaded if battle type is 9.
0x02024029 1b Repeattrainerbattle: Unknown. Loaded if battle type is 9.
0x0202402C 100b Enemy Pokemon 1
0x02024090 100b Enemy Pokemon 2
0x020240F4 100b Enemy Pokemon 3
0x02024158 100b Enemy Pokemon 4
0x020241BC 100b Enemy Pokemon 5
0x02024220 100b Enemy Pokemon 6
0x02024284 100b Party Pokemon 1
0x020242E8 100b Party Pokemon 2
0x0202434C 100b Party Pokemon 3
0x020243B0 100b Party Pokemon 4
0x02024414 100b Party Pokemon 5
0x02024478 100b Party Pokemon 6
0x02031DB4 1b Previous map bank number
0x02031DB5 1b Previous map number
0x02031DB6 1b Warp through which the player entered the current map?
0x02031DB7 1b Padding?
0x02031DB8 2b X where player entered previous map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DBA 2b Y where player entered previous map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DBC 1b Current map bank number
0x02031DBD 1b Current map number
0x02031DBE 1b Warp through which the player entered the current map?
0x02031DBF 1b Padding?
0x02031DC0 2b X where player entered current map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DC2 2b Y where player entered current map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DC3 1b Padding?
0x02031DC4 1b Current2 map bank number
0x02031DC5 1b Current2 map number
0x02031DC6 1b Warp through which the player entered the current2 map?
0x02031DC7 1b Padding?
0x02031DC8 2b X where player entered current2 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DCA 2b Y where player entered current2 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DCC 1b Current3 map bank number
0x02031DCD 1b Current3 map number
0x02031DCE 1b Warp through which the player entered the current3 map?
0x02031DCF 1b Padding?
0x02031DD0 2b X where player entered current3 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DD2 2b Y where player entered current3 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DD4 3b? Warping: Unknown. Always set to 01 01 00 when "warp" and
"warpmuted" finish, but not when "warp3" finishes. While
walking into a door warp, the second byte is 02.
0x02031DD7 1b Warping: Unknown. Seems to always be 0x03.
0x02031DD8 1b Warping: Unknown. If non-zero, "warp" fails to play a
sound.
0x02031DDA 2b? Unknown. Changes every time you warp.
0x02036E38 36b OW 00 (player)
0x02036E5C 36b OW 01
0x02036E80 36b OW 02
0x02036EA4 36b OW 03
0x02036EC8 36b OW 04
0x02036EEC 36b OW 05
0x02036F10 36b OW 06
0x02036F34 36b OW 07
0x02036F58 36b OW 08
0x02036F7C 36b OW 09
0x02036FA0 36b OW 10
0x02036FC4 36b OW 11
0x02036FE8 36b OW 12
0x0203700C 36b OW 13
0x02037030 36b OW 14
0x02037054 36b OW 15
0x02037078 1b Three least-significant bits control player speed.
0x02037079 1b Something to do with switching into biking OW?
0x0203707A 1b Is a D-pad button pressed (player attempting to move)?
0x0203707B 1b Is the player actually moving?
0x0203707C 1b Unknown.
0x0203707D 1b Person number to be controlled by the D-pad.
0x0203707E 1b If set to 0x01, all OW movement is locked. (lockall flag?)
0x020370B8 2b Script variable 0x8000
0x020370BA 2b Script variable 0x8001
0x020370BC 2b Script variable 0x8002
0x020370BE 2b Script variable 0x8003
0x020370C0 2b Script variable 0x8004
0x020370C2 2b Script variable 0x8005
0x020370C4 2b Script variable 0x8006
0x020370C6 2b Script variable 0x8007
0x020370C8 2b Script variable 0x8008
0x020370CA 2b Script variable 0x8009
0x020370CC 2b Script variable 0x800A
0x020370CE 2b Script variable 0x800B
0x020370D0 2b Script variable 0x800D // there is no var 0x800C?
0x020370D2 2b Script variable 0x800E // overwritten by "trainerbattle"?
0x020370D4 2b Script variable 0x800F
0x020386AC 2b Trainerbattle: Battle type.
0x020386AE 2b Trainerbattle: Trainer flag.
0x020386B0 2b Trainerbattle: Argument 3.
Some battle types save it into var 0x800E.
0x020386B2 2b Unknown.
0x020386B4 4b Trainerbattle: Arg4 (types 1, 2, 4, 6, 7, 8) or null (others).
0x020386B8 4b Trainerbattle: A4 (0, 3, 5), A5 (1, 2, 4, 6, 7, 8, 9), or null.
0x020386BC 4b Trainerbattle: Argument 5 (type 9) or null (others).
0x020386C0 4b Trainerbattle: Argument 6 (types 6, 8) or null (others).
0x020386C4 4b Trainerbattle: Offset of next script command byte.
0x020386C8 4b Trainerbattle: A6 (types 1, 2), A7 (types 6, 8), or null.
0x020386CC 2b Trainerbattle: Unknown.
0x0203AAA8 4b Unknown. Written to by the "setbyte" command.
0x0203ADFA 1b Unknown.
If equal to 0x2, "warp" fails to play a sound.
If lower than 0x04, "setworldmapflag" fails to set
the specified flag.
If equal to 1, trainerbattle types 5 and 7 will
clear this byte and then some sections of RAM.
0x0203ADFC 4b Unknown. A pointer used by trainerbattle types 5 and 7.
0x0203AE04 4b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x0203AE08 4b? Unknown. Used and cleared by "trainerbattle" (types 5, 7)
if the byte at 0x0203ADFA is 0x01.
0x0203AE8C 4b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x0203AE98 ? Unknown.
0x0203AF98 ? Unknown. A pointer used by trainerbattle types 5 and 7.
0x0203B01E 2b Unknown. Read by a reused ASM routine in script commands'
code.
0x0203B0EE 1b Help: Player's opened it before? Y / N, 0x00 / 0x01.
0x0203B1A0 14291b Help: unknown. // to 0x0203E973
0x0203E973 2050b Help: unknown. Cleared only when opening help for the 1st
time. // to 0x0203F175
0x0203F176 1b Help: start of GUI state data.
0x0203F194 1b Help: number of menu options.
0x0203F195 1b Help: Unknown.
0x0203F196 1b Help: number of menu options visible on-screen.
0x0203F199 1b Help: Unknown. Apparently 0x04 for top-level menu or 0x15
for submenus.
0x0203F19C 1b Help: scroll position in a menu.
0x0203F19D 1b Help: cursor position in a menu (relative to scroll).
0x0203F19E 1b Help: unknown. Apparently 0x00 for top-level menu, 0x03
for submenus, and 0x06 for static pages.
0x0203F1AC ?b Help: start of menu data. String pointer (not aligned),
followed by menu item number. List is terminated with
0xFEFFFFFF
0x0203E000 4096b Unused RAM found by JPAN (is used by D/N patch)
0x0203F3C0 1856b RAM used in JPAN's Hacked Engine.
0x03000EA8 1b Unknown. Set by (defunct?) "choosecontestpkmn" command, and
also set to 0x1 by "repeattrainerbattle".
0x03000EB0 74b Script engine RAM
0x03000F9C 1b 0x01 if the screen is fading, 0x00 otherwise.
0x03000FC0 4b Music for the current map (truncated to 2b when read)
0x03000FC4 1b Warping: Unknown.
0x03005000 4b Current PRNG seed
0x03005008 4b Pointer to a DMA-protected save block (map data)
0x0300500C 4b Pointer to a DMA-protected save block (personal data)
0x03005010 4b Pointer to a DMA-protected save block (box data)
0x03005074 1b Trainerbattle: number of the OW we are battling, or 0x10 if
invalid. This offset is used by special 13A, which in turn
is called by some of the scripts (yes, scripts) that
trainerbattle calls.
0x03005E88 1b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x03007324 2b Warping: Unknown. Related to the fade timer.
0x03007326 2b Warping: Unknown. Related to the fade timer.
0x03007328 2b Warping: Timer used for fades. Duration varies with type
of map being entered.
-----------------------------------------------
[0x03005008] + 0x0000 2b Camera X-position
[0x03005008] + 0x0002 2b Camera Y-position
[0x03005008] + 0x0004 1b Current map.
[0x03005008] + 0x0005 1b Current map bank.
-------------------------------------------------------------------------
Map of DMA-protected RAM:
[0x0300500C] + 0x0000 8b Character name including terminator, padded to end with 0xFFs
[0x0300500C] + 0x0008 1b Gender (00/01 m/f)
[0x0300500C] + 0x0009 1b Unknown
[0x0300500C] + 0x000A 2b Trainer ID
[0x0300500C] + 0x000C 2b Secret ID (halfword)
[0x0300500C] + 0x000E 2b Playtime (hours)
[0x0300500C] + 0x0010 1b Playtime (minutes)
[0x0300500C] + 0x0011 1b Playtime (seconds)
[0x0300500C] + 0x0012 1b Playtime (frames)
[0x0300500C] + 0x0013 1b Unknown
[0x0300500C] + 0x0014 2b Options // this and above thanks to hackmew's asm tut pt. 1
...
[0x0300500C] + 0x001A 1b If 0xDA, then National Dex is enabled.
...
[0x0300500C] + 0x0F20 4b Unknown (encryption key for hidden vars)
[0x0300500C] + 0x0F24 End (byte after)
Créditos a Missingyep Pokecommunity por la lista de los offsets
0x02002D40 ? Start of data that apparently controls
the colors of the pixels inside of the
current box (menu, msgbox, etc.).
0x020204B4 12b Dialog box 1
0x020204C0 12b Dialog box 2
0x020204CC 12b Dialog box 3
0x020204D8 12b Dialog box 4
0x020204E4 12b Dialog box 5
0x020204F0 12b Dialog box 6
0x020204FC 12b Dialog box 7
0x02020508 12b Dialog box 8
0x02020514 12b Dialog box 9
0x02020520 12b Dialog box 10
0x0202052C 12b Dialog box 11
0x02020538 12b Dialog box 12
0x02020544 12b Dialog box 13
0x02020550 12b Dialog box 14
0x0202055C 12b Dialog box 15
0x02020568 12b Dialog box 16
0x02020574 12b Dialog box 17
0x02020580 12b Dialog box 18
0x0202058C 12b Dialog box 19
0x02020598 12b Dialog box 20
0x020205A4 12b Dialog box 21
0x020205B0 12b Dialog box 22
0x020205BC 12b Dialog box 23
0x020205C8 12b Dialog box 24
0x020205D4 12b Dialog box 25
0x020205E0 12b Dialog box 26
0x020205EC 12b Dialog box 27
0x020205F8 12b Dialog box 28
0x02020604 12b Dialog box 29
0x02020610 12b Dialog box 30
0x0202061C 12b Dialog box 31
0x02020628 12b Dialog box 32
0x02021CD0 32b String buffer 0
0x02021CF0 20b String buffer 1
0x02021D04 20b String buffer 2
0x02021D18 ? String to be displayed in a message box
0x02022B4B 1b Flags for current battle?
0x02022B4C 4b Flags for current battle? Set to 0x8 by repeattrainerbattle.
0x02023E8A 1b Repeattrainerbattle: Unknown. Loaded if battle type is 9.
0x02024029 1b Repeattrainerbattle: Unknown. Loaded if battle type is 9.
0x0202402C 100b Enemy Pokemon 1
0x02024090 100b Enemy Pokemon 2
0x020240F4 100b Enemy Pokemon 3
0x02024158 100b Enemy Pokemon 4
0x020241BC 100b Enemy Pokemon 5
0x02024220 100b Enemy Pokemon 6
0x02024284 100b Party Pokemon 1
0x020242E8 100b Party Pokemon 2
0x0202434C 100b Party Pokemon 3
0x020243B0 100b Party Pokemon 4
0x02024414 100b Party Pokemon 5
0x02024478 100b Party Pokemon 6
0x02031DB4 1b Previous map bank number
0x02031DB5 1b Previous map number
0x02031DB6 1b Warp through which the player entered the current map?
0x02031DB7 1b Padding?
0x02031DB8 2b X where player entered previous map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DBA 2b Y where player entered previous map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DBC 1b Current map bank number
0x02031DBD 1b Current map number
0x02031DBE 1b Warp through which the player entered the current map?
0x02031DBF 1b Padding?
0x02031DC0 2b X where player entered current map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DC2 2b Y where player entered current map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DC3 1b Padding?
0x02031DC4 1b Current2 map bank number
0x02031DC5 1b Current2 map number
0x02031DC6 1b Warp through which the player entered the current2 map?
0x02031DC7 1b Padding?
0x02031DC8 2b X where player entered current2 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DCA 2b Y where player entered current2 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DCC 1b Current3 map bank number
0x02031DCD 1b Current3 map number
0x02031DCE 1b Warp through which the player entered the current3 map?
0x02031DCF 1b Padding?
0x02031DD0 2b X where player entered current3 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DD2 2b Y where player entered current3 map, or 0xFFFF if unused.
(Only seems to be used when the warp was a door.)
0x02031DD4 3b? Warping: Unknown. Always set to 01 01 00 when "warp" and
"warpmuted" finish, but not when "warp3" finishes. While
walking into a door warp, the second byte is 02.
0x02031DD7 1b Warping: Unknown. Seems to always be 0x03.
0x02031DD8 1b Warping: Unknown. If non-zero, "warp" fails to play a
sound.
0x02031DDA 2b? Unknown. Changes every time you warp.
0x02036E38 36b OW 00 (player)
0x02036E5C 36b OW 01
0x02036E80 36b OW 02
0x02036EA4 36b OW 03
0x02036EC8 36b OW 04
0x02036EEC 36b OW 05
0x02036F10 36b OW 06
0x02036F34 36b OW 07
0x02036F58 36b OW 08
0x02036F7C 36b OW 09
0x02036FA0 36b OW 10
0x02036FC4 36b OW 11
0x02036FE8 36b OW 12
0x0203700C 36b OW 13
0x02037030 36b OW 14
0x02037054 36b OW 15
0x02037078 1b Three least-significant bits control player speed.
0x02037079 1b Something to do with switching into biking OW?
0x0203707A 1b Is a D-pad button pressed (player attempting to move)?
0x0203707B 1b Is the player actually moving?
0x0203707C 1b Unknown.
0x0203707D 1b Person number to be controlled by the D-pad.
0x0203707E 1b If set to 0x01, all OW movement is locked. (lockall flag?)
0x020370B8 2b Script variable 0x8000
0x020370BA 2b Script variable 0x8001
0x020370BC 2b Script variable 0x8002
0x020370BE 2b Script variable 0x8003
0x020370C0 2b Script variable 0x8004
0x020370C2 2b Script variable 0x8005
0x020370C4 2b Script variable 0x8006
0x020370C6 2b Script variable 0x8007
0x020370C8 2b Script variable 0x8008
0x020370CA 2b Script variable 0x8009
0x020370CC 2b Script variable 0x800A
0x020370CE 2b Script variable 0x800B
0x020370D0 2b Script variable 0x800D // there is no var 0x800C?
0x020370D2 2b Script variable 0x800E // overwritten by "trainerbattle"?
0x020370D4 2b Script variable 0x800F
0x020386AC 2b Trainerbattle: Battle type.
0x020386AE 2b Trainerbattle: Trainer flag.
0x020386B0 2b Trainerbattle: Argument 3.
Some battle types save it into var 0x800E.
0x020386B2 2b Unknown.
0x020386B4 4b Trainerbattle: Arg4 (types 1, 2, 4, 6, 7, 8) or null (others).
0x020386B8 4b Trainerbattle: A4 (0, 3, 5), A5 (1, 2, 4, 6, 7, 8, 9), or null.
0x020386BC 4b Trainerbattle: Argument 5 (type 9) or null (others).
0x020386C0 4b Trainerbattle: Argument 6 (types 6, 8) or null (others).
0x020386C4 4b Trainerbattle: Offset of next script command byte.
0x020386C8 4b Trainerbattle: A6 (types 1, 2), A7 (types 6, 8), or null.
0x020386CC 2b Trainerbattle: Unknown.
0x0203AAA8 4b Unknown. Written to by the "setbyte" command.
0x0203ADFA 1b Unknown.
If equal to 0x2, "warp" fails to play a sound.
If lower than 0x04, "setworldmapflag" fails to set
the specified flag.
If equal to 1, trainerbattle types 5 and 7 will
clear this byte and then some sections of RAM.
0x0203ADFC 4b Unknown. A pointer used by trainerbattle types 5 and 7.
0x0203AE04 4b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x0203AE08 4b? Unknown. Used and cleared by "trainerbattle" (types 5, 7)
if the byte at 0x0203ADFA is 0x01.
0x0203AE8C 4b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x0203AE98 ? Unknown.
0x0203AF98 ? Unknown. A pointer used by trainerbattle types 5 and 7.
0x0203B01E 2b Unknown. Read by a reused ASM routine in script commands'
code.
0x0203B0EE 1b Help: Player's opened it before? Y / N, 0x00 / 0x01.
0x0203B1A0 14291b Help: unknown. // to 0x0203E973
0x0203E973 2050b Help: unknown. Cleared only when opening help for the 1st
time. // to 0x0203F175
0x0203F176 1b Help: start of GUI state data.
0x0203F194 1b Help: number of menu options.
0x0203F195 1b Help: Unknown.
0x0203F196 1b Help: number of menu options visible on-screen.
0x0203F199 1b Help: Unknown. Apparently 0x04 for top-level menu or 0x15
for submenus.
0x0203F19C 1b Help: scroll position in a menu.
0x0203F19D 1b Help: cursor position in a menu (relative to scroll).
0x0203F19E 1b Help: unknown. Apparently 0x00 for top-level menu, 0x03
for submenus, and 0x06 for static pages.
0x0203F1AC ?b Help: start of menu data. String pointer (not aligned),
followed by menu item number. List is terminated with
0xFEFFFFFF
0x0203E000 4096b Unused RAM found by JPAN (is used by D/N patch)
0x0203F3C0 1856b RAM used in JPAN's Hacked Engine.
0x03000EA8 1b Unknown. Set by (defunct?) "choosecontestpkmn" command, and
also set to 0x1 by "repeattrainerbattle".
0x03000EB0 74b Script engine RAM
0x03000F9C 1b 0x01 if the screen is fading, 0x00 otherwise.
0x03000FC0 4b Music for the current map (truncated to 2b when read)
0x03000FC4 1b Warping: Unknown.
0x03005000 4b Current PRNG seed
0x03005008 4b Pointer to a DMA-protected save block (map data)
0x0300500C 4b Pointer to a DMA-protected save block (personal data)
0x03005010 4b Pointer to a DMA-protected save block (box data)
0x03005074 1b Trainerbattle: number of the OW we are battling, or 0x10 if
invalid. This offset is used by special 13A, which in turn
is called by some of the scripts (yes, scripts) that
trainerbattle calls.
0x03005E88 1b? Unknown. Cleared by "trainerbattle" (types 5, 7) if the byte
at 0x0203ADFA is 0x01.
0x03007324 2b Warping: Unknown. Related to the fade timer.
0x03007326 2b Warping: Unknown. Related to the fade timer.
0x03007328 2b Warping: Timer used for fades. Duration varies with type
of map being entered.
-----------------------------------------------
[0x03005008] + 0x0000 2b Camera X-position
[0x03005008] + 0x0002 2b Camera Y-position
[0x03005008] + 0x0004 1b Current map.
[0x03005008] + 0x0005 1b Current map bank.
-------------------------------------------------------------------------
Map of DMA-protected RAM:
[0x0300500C] + 0x0000 8b Character name including terminator, padded to end with 0xFFs
[0x0300500C] + 0x0008 1b Gender (00/01 m/f)
[0x0300500C] + 0x0009 1b Unknown
[0x0300500C] + 0x000A 2b Trainer ID
[0x0300500C] + 0x000C 2b Secret ID (halfword)
[0x0300500C] + 0x000E 2b Playtime (hours)
[0x0300500C] + 0x0010 1b Playtime (minutes)
[0x0300500C] + 0x0011 1b Playtime (seconds)
[0x0300500C] + 0x0012 1b Playtime (frames)
[0x0300500C] + 0x0013 1b Unknown
[0x0300500C] + 0x0014 2b Options // this and above thanks to hackmew's asm tut pt. 1
...
[0x0300500C] + 0x001A 1b If 0xDA, then National Dex is enabled.
...
[0x0300500C] + 0x0F20 4b Unknown (encryption key for hidden vars)
[0x0300500C] + 0x0F24 End (byte after)
Créditos a Missingyep Pokecommunity por la lista de los offsets
Si queréis testear vuestras rutinas compiladlas (explicado en la primera clase) con el compilador que os he dejado y valeos del scripting para ver sus resultados. Las rutinas deberán ser entregadas como muy tarde (se agradece antes) el próximo miércoles día 12 de Septiembre.
@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