Registrarse

FR | ASM | Rutina JPAN Save Block Hack

Gold

Porrero a tiempo parcial
Miembro insignia
Bueno, quizás muchos ya saben de que trata esto, pero para quienes no, les presento la rutina para aplicar el Save Block hack de JPAN, el cual tiene muchísimos usos y se requiere para varios sistemas.

Para resumirlo, lo que hace esta rutina es modificar la manera en que se organizan ciertos datos en la memoria RAM, a modo de hacer que ciertos bloques de memoria queden libres para usar y podamos darles usos a esos bloques depara nuestra conveniencia. Los bloques de memoria liberada se encuentran ubicados en 0x203C1C8, 0x203C420 y 0x203CFC0.

La mayoría aplica esta rutina mediante un parche que ronda en internet (Que ocupa la offset 0x8A00000, que en mi caso la tengo ocupada) o deja que la misma la aplique G3HS o PGE. Dichas rutinas se aplican si expandimos la dex (Cosa que no pienso hacer) y la de PGE por algún motivo buguea mi hack. Esta opción hace que la insertes a mano tú mismo y sepas donde la vas a poner. Además de ser más eficiente compilar desde el código fuente.

Y finalmente, la rutina.
Código:
.thumb
.global JPAN_Save_Block_Recycle
.equ rom, 0x8000000
.equ offset, 0xFFFFFF  [MENTION=42591]Mod[/MENTION]IFICA A LA OFFSET DONDE INSERTARÁS ESTA RUTINA

.org 0xD991E, 0xFF
	bx r7

.org 0xD995C, 0xFF
.word Recycle_2 + rom + 1

.org 0xD9EDC, 0xFF
	ldr r0, .Pointer1
	bx r0
.align 2
.Pointer1: .word Recycle_1 + rom + 1

.org 0x3FEC9A, 0xFF
.byte 0xF0, 0x0F, 0xF0, 0x0F, 0xF0, 0x0F, 0xE0, 0x1F, 0xF0, 0x0F, 0xD0, 0x2F, 0x98, 0xD, 0x0, 0x0, 0xF0, 0x0F, 0xF0, 0xF, 0xF0, 0xF, 0xE0, 0x1F, 0xF0, 0xF, 0xD0, 0x2F, 0xF0, 0xF, 0xC0, 0x3F, 0xF0, 0xF, 0xB0, 0x4F, 0xF0, 0xF, 0xA0, 0x5F, 0xF0, 0xF, 0x90, 0x6F, 0xF0, 0xF, 0x80, 0x7F, 0x50, 0x4

.org offset, 0xFF
Recycle_1:
	ldr r1, [r4]
	mov r3, #0xFF
	lsl r3, #0x4
	add r3, r1
	ldrh r0, [r3, #0x4]
	cmp r0, #0x0
	beq Size1
	cmp r0, #0x4
	beq Size2
	cmp r0, #0xD
	beq Size3

BigLoop:
	cmp r5, #0xD
	ble Return
	mov r0, #0x1
	pop {r3}
	mov r8, r3
	pop {r4-r7,pc}

Size1:
	mov r1, #0xCC
	ldr r2, .Loc1
	b SmallLoop

Size2:
	mov r1, #0x96
	lsl r1, #0x2
	ldr r2, .Loc2
	b SmallLoop

Size3:
	mov r1, #0xBA
	lsl r1, #0x4
	ldr r2, .Loc3

SmallLoop:
	sub r3, #0x4
	ldr r0, [r3]
	str r0, [r2]
	sub r2, #0x4
	sub r1, #0x4
	cmp r1, #0x0
	bne SmallLoop
	b BigLoop

.align 2
.Loc1: .word 0x203C1C8
.Loc2: .word 0x203C420
.Loc3: .word 0x203CFC0

Return:
	ldr r0, .Return
	bx r0

.align 2
.Return: .word 0x80D9E71
.word 0xFFFFFFFF

Recycle_2:
	mov r7, #0xFF
	lsl r7, #0x4
	add r7, r1, r7
	strh r0, [r7, #0x6]
	ldrh r6, [r7, #0x4]
	cmp r6, #0x0
	beq Size1_2
	cmp r6, #0x4
	beq Size2_2
	cmp r6, #0xD
	beq Size3_2
	lsl r0, #0x0

Return_2:
	ldr r0, .Return2
	bx r0

.align 2
.Return2: .word 0x80D9923

Size1_2:
	mov r3, #0xCC
	ldr r2, .Loc1_2
	b SmallLoop_2

Size2_2:
	mov r3, #0x96
	lsl r3, #0x2
	ldr r2, .Loc2_2
	b SmallLoop_2

Size3_2:
	mov r3, #0xBA
	lsl r3, #0x4
	ldr r2, .Loc3_2

SmallLoop_2:
	sub r7, #0x4
	ldr r0, [r2]
	str r0, [r7]
	sub r2, #0x4
	sub r3, #0x4
	cmp r3, #0x0
	bne SmallLoop_2
	b Return_2

.align 2
.Loc1_2: .word 0x203C1C8
.Loc2_2: .word 0x203C420
.Loc3_2: .word 0x203CFC0
Al compilar la rutina, solo deben abiri el archivo .bin generado y copiar los datos de las direcciones de los hooks, que se encuentan en 0x80D991E, 0x80D995C, 0x80D9EDC 0x83FEC9A. Tambien debes copiar los bytes ubicados en donde indicaste que insertarías la rutina.

Ten en cuenta que es muy probable que tras aplicar esta rutina debas de inicaiar una nueva partida, debidoa que muchos bytes en la RAM son modificados, haciendo que la partida vieja se corrompa.

Los créditos van para JPAN por la rutina original y jiangzhengwnjz ya que fue quien me facilitó por Discord el código fuente de la rutina que parecía perdida y nadie la tenía, además del parche.
 
Última edición:

Xuuki

holi
Buen aporte, pero tengo una duda
Yo había conseguido la rutina hace bastante tiempo, pero se ve un poco diferente a la que aportas aquí, igual recuerdo que tenias que modificar la rutina del guardado para que no hubiera bugs, con esta rutina se soluciona eso o es necesario igual modificar dicha rutina??
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Re: FR | ASM | Rutina JPAN Save Block Hack

Buen aporte, pero tengo una duda
Yo había conseguido la rutina hace bastante tiempo, pero se ve un poco diferente a la que aportas aquí, igual recuerdo que tenias que modificar la rutina del guardado para que no hubiera bugs, con esta rutina se soluciona eso o es necesario igual modificar dicha rutina??
Pues esta rutina está hecha para que las 2 rutinas que modifican los bloques de la RAM y el guardado se ensamblen en una sola. Si compilas este código encontrarás los dos hooks de dichas rutinas c:
 

Nachoius

Caminante del cielo
gold alguna aplicación real en juego para esto ? no le estoy viendo la utilidad o no lo estoy entendiendo una de dos. saludos
 

Gold

Porrero a tiempo parcial
Miembro insignia
Respuesta: Re: FR | ASM | Rutina JPAN Save Block Hack

gold alguna aplicación real en juego para esto ? no le estoy viendo la utilidad o no lo estoy entendiendo una de dos. saludos
Es para todo aquello que necesite de memoria RAM extra para funcionar y por falta de optimización en la misma no es posible. Ejemplos donde es esencial para funcionar son:

* Expandir la Pokédex
* Expandir la cantidad de flags/variables
* Expandir la cantidad de objetos que la mochila puede llevar

Y un montón más que ahora mismo quizás esté olvidando. Pero si es algo que es de muchísima importancia de tener.
 
Arriba