Registrarse

[ASM] E | Ampliar variables y flags "seguras"

Samu

Usuario de Oro
Bueno, pues por aquí os dejo el otro tutorial que iba a subir este fin de semana, pero que no me fue posible subir a tiempo.

Lo que os traigo ni es nada nuevo, ni es algo que haya hecho yo, pero me ha sorprendido no verlo en el foro (de hecho si que está para FRED desde hace años, pero ni siquiera está en el índice de tutorialles IDKWHY).

La rutina original es de Jambo51 (pokeco), y la versión para Emerald fue publicada en ese mismo foro por Starfall321. Yo simplemente la traigo aquí "traducida" al castellano y voy a explicar a grandes rasgos lo que hace para que quien quiera pueda editarla, colocando otras regiones de memoria libre (en el caso de que las usadas por la rutina ya estén ocupadas) o modificando la cantidad de flags//vars extra que se añaden.


Ampliar flags y vars seguras

Los juegos de pokemon en gba poseen una cantidad de variables denominadas "seguras" relativamente limitadas (generalmente se habla del rango 0x4000-0x40FF && 0x8000-0x8016), siendo el resto consideradas variables "no seguras" por diversos motivos. De forma análoga ocurre algo similar con los flags (aunque hay bastante más flags que variables).
Para más información sobre las variables y flags seguros en pokemon emerald os recomiendo visitar este enlace. La misma información para pokemon fire red está disponible aquí.

Teniendo en cuenta que las variables y los flags son como hemos dicho limitados, hay gente que necesita más variables o más flags de los que puede utilizar de forma segura en el juego. Estas rutinas lo que hace es aumentar el número de variables y flags seguras, dándonos 0x200 variables y 0x1000 flags seguras adicionales.

Puntualizar antes de entrar en cada una de las rutinas que NO es necesario instalar ambas, cada una de las rutinas es independiente. Se pueden usar varias o solo una de ellas.
Jambo51 dijo:
It should be noted that these routines are not mutually exclusive. You can have both or you can have one or the other. You do NOT need both for only the flag hack, or both for the var hack. Obviously, if you want both the flags and vars hack, you need both.
@Lilith hizo una mala traducción hace años cuando posteo este aporte para Fred y dijo que ambas eran necesarias.


Código:
.thumb
.align 2

/************* VARIABLES SEGURAS @EMERALD *********************************
******** Credits to Jambo51 && Starfall321 ********************************
***************************************************************************
************** Instrucciones de instalación *******************************
- Abrir el rom con HxD e ir a "0x9D650". Escribimos los siguientes bytes:
"00 48 00 47 XX+1 XX XX 08", siendo "XX+1 XX XX 08" el pointer permutado +1
del offset en el que insertaremos esta rutina.
- Abrir el rom con HxD e ir a "0x9D664". Escribimos los siguientes bytes:
"00 00"
- Compilar esta rutina e insertarla en "08 XX XX XX".
***************************************************************************
Rango seguro de variables: 0x4000-0x40FF,0x5000-0x51FF,0x8000 - 0x8016
/**************************************************************************

VAR4000_40FF:		@Si la variable a utilizar está entre 0x4000- 0x40FF
mov r0, #0x40	 [MENTION=37310]Sal[/MENTION]e de la rutina y opera con normalidad
lsl r0, r0, #0x8
cmp r1, r0
blt exit

mov r0, #0x41
lsl r0, r0, #0x8
cmp r1, r0
blt normal

VAR5000_5200:		@Si la variable a utilizar está entre 0x5000-0x5200
mov r0, #0x50		@Ejecuta la rutina 
lsl r0, r0, #0x8
cmp r1, r0
blt exit

lsl r0, r1, #0x10
cmp r0, #0x0
blt alt

mov r0, #0x52
lsl r0, r0, #0x8
cmp r1, r0
bge exit

MEMORY_LOCATION:
mov r0, #0x50
lsl r0, r0, #0x8
sub r1, r1, r0
lsl r1, r1, #0x1
ldr r0, save_block	@Dirección de memoria ram libre, se necesitan 0x400 bytes
add r0, r0, r1


exit2:	pop {r1}
bx r1

exit:	mov r0, #0x0
b exit2

normal:	ldr r0, =0x0809D67C+1
bx r0
alt:	ldr r0, =0x0809D664+1
bx r0


.align 2
save_block:			@Cada variable ocupará 2 Bytes de espacio
	.word 0x0203db00

Las instrucciones de instalación se encuentran en la cabecera de la propia rutina en forma de comentario. Está rutina utiliza un área de memoria no usada por el juego (0203DB00), para guardar 0x200 variables que ocupan 2 Bytes cada una. Podréis cambiar este área de memoria siempre que utilicéis otra con al menos 0x400 bytes no usados por el juego.
Si necesitáis la dirección en la ram de alguna de las variables, podéis calcularla con la siguiente ecuación:
Código:
Dir_variable = (Número var-5000)·2 + 0203DB00
La variable 5000 se encontrará en (0203DB00), la variable 5001 en (0203DB02), la 5002 en (0203DB04) etc.
Código:
.thumb
.align 2

/************* FLAGS SEGUROS @EMERALD *************************************
******** Credits to Jambo51 && Starfall321 ********************************
***************************************************************************
************** Instrucciones de instalación *******************************
- Abrir el rom con HxD e ir a "0x9D702". Escribimos lo siguientes bytes:
"00 00 00 48 00 47 XX+1 XX XX 08", siendo "XX+1 XX XX 08" el pointer permutado +1
del offset en el que insertaremos la rutina.
- Compilar esta rutina e insertarla en "08 XX XX XX".
***************************************************************************
Rango seguro de variables: 0x0-0x900 && 0x900-0x18FF (rango añadido)
/**************************************************************************

FLAG900_1900:
mov r0, #0x9
lsl r0, r0, #0x8
cmp r2, r0
blt normal
mov r0, #0x19
lsl r0, r0, #0x8
cmp r2, r0
bge noget

mov r0, #0x9
lsl r0, r0, #0x8
sub r2, r2, r0
lsr r1, r2, #3
ldr r0, save_block		@Dirección de memoria ram libre, se necesitan 0x200 bytes
exit:	add r0, r0, r1
pop {r1}
bx r1

normal:	ldr r0, =0x03005d8c
ldr r0, [r0, #0]

there:	lsr r1, r1, #0x13
ldr r2, =0x1270
add r1, r1, r2
b exit

noget:	add r0, r2, #0x0
b there

.align 2
save_block:			@Cada flag ocupará 1 bit de espacio
	.word 0x0203DF00
De nuevo, las instrucciones de instalación se encuentran en la cabecera de la propia rutina en forma de comentario. De forma análoga a la rutina de las variables, está utiliza otra región de memoria no usada por el rom (0203DF00) y, al igual que en el caso anterior, podéis sustituir esta dirección por cualquier otra que contenga 0x200 bytes libres.

IMPORTANTE:
Al instalar estas rutinas queda cortado el acceso al resto de las variables y flags "no seguras" (tampoco es que nos afecte demasiado, ya que no deberíamos utilizarlas de todas maneras). También es importante remarcar que esta rutina no debe aplicarse a ningún proyecto que ya sea "jugable" a modo de actualización. Las rutinas provocan un cambio en la estructura de guardado del .sav, haciendo incompatibles las partidas viejas con el nuevo rom.

***SI SE APLICA LA RUTINA DEBERÁS COMENZAR UNA PARTIDA NUEVA***




Fuentes:
 

kakarotto

Baneado
Respuesta: [EM][ASM] Ampliar variables y flags "seguras"

Aunque no sea de tu autoría mereces todo mi elogio, gracias por contribuir a que wah crezca con tus aportes de calidad.. espero darle uso.
 
Arriba