tuts_gba
Thread Id: 10725
Thread Name: GBA | Scripting | Evitando el refrescado
#0
JV Works 12391
Antes que nada debo aclarar algunas cosas:


-Esto es Universal, osea para cualquier ROM.

-Para entender esto, debes saber por lo menos usar el comando WBTO(Writebytetooffset)

-Debes saber manipular la ram con WBTO (Para este caso se recomienda saber cambiar las paletas)

-Debes saber usar el HxD (Buscar datos, editar, ect)

-Este metodo debe ser usado con precaucion, la RAM es limitada asi que no es bueno abusar de ella con este metodo.


Comenzemos...


Vosotros debereis saber que al utilizar el WBTO, podemos manipular lo que sea que este en la RAM, cualquier cosa. Inclusive, podemos manipular aspectos graficos de pantalla con esto (Entiendase VRAM o Video Ram).

El problema viene cuando queremos por ejemplo, cambiar las paletas o el mini del prota, que al abrir la mochila, o con un warp, o un fadescreen, estos vuelven a ser normales...

Eso se debe al refrescado de pantalla, que no es mas que la accion de resetear toda la VRAM.

En pocas palabras, olvidaos de cambios de paletas o de minis duraderos, porque apenas abris la mochila y ¡puf! se quitan.


Pero aqui traigo un truco para que el cambio dure para siempre...


Al resetear la VRAM, el juego Carga nuevamente todos los graficos y paletas desde la ROM hasta la VRAM. Lo que vamos a hacer aqui es cambiar esto:

Cargar desde Rom hasta VRAM

por esto:

Cargar desde RAM hasta VRAM

¿Que hacemos con eso?, sencillo, hacemos que el juego cargue los graficos y paletas X desde la RAM y no desde la rom.


Para este ejemplo voy a hacer un cambio de paletas permanente




Con esa tecnica, podreis hacer maravillas, como rutas primaverales que de pronto se ponen blancas por la nieve XD

Y si no me equivoco, también podéis aplicarla para otros datos como los minis y esas cosas, pero lamentablemente eso aun no lo termino de investigar xD
#1
~Javs 12289
En vista de que nuestros users tienen tanta flojera que se limitan
a poner un +Gracias (lo cual, sí, me desepciona..), yo te comento;

Me gustan muchos tus investigaciones, MarioFan. Sin duda, eres
una persona muy curiosa por naturaleza y tus proyectos siempre
tienen un avance muy grande.

Esperemos que sigas poniendo el RomHacking hispano en alto,
junto con otros users de WAH ^^

Ahora, en lo que decimos del tutorial, puede ser muy útil combinado
con la más grande arma, la imaginación.. Ya cada quién puede
saber cómo hacer algo que talvez siempre ha querrido hacer xD

Y bueno, bien explicado, como siempre, bien estructurado, paso a
paso, etc..

Felicidades. ¡Saludos!
#2
Hackun 12904
Muy bien, ya decía yo que este tío andaba en otras andanzas...
Felicidades por esta, por las de antes y por las que vendrán! sigue así!
Saludos.
#3
Sonicarvalho 17082
Es realmente una buena técnica, yo nunca me habría recordado de hacer 'loading' de la RAM.

Solo hay unas pequeñas cosas a apuntar.
Tu dijiste que la WRAM se guardaba con el Sav. Esto no es de todo verdad! Mira:
EWRAM->02000000-02040000 (256Kb)
SRAM(save ram)-> 0E000000-0E010000 (64kb) o en la mayoría de los casos 32Kb.

...Así que no se guarda todo en el SRAM! Tuviste la suerte encontrar un offset que es guardado en el SRAM. Y mas una cosa: el WRAM no guarda los offsets donde los datos estaban en SRAM, el juego es el que decide eso (en el principio, antes de el CopyRight screen, que ya he analizado las rutinas de Loading). Eso significa que estas sobrescribiendo algo que el juego necesita (pero si no hay bugs con ese offset, entonces debes usar ese)

Otra cosa menos importante, solo para que pienses sin errores acerca de esto : Las palletes no van para la VRAM, solo los tiles y tilemaps.
Las palletas tienen una área especifica de la RAM (05000000), 1kb, y en VRAM hay datos que definen cual paleta los tiles van a usar

Mas una cosa: Estar haciendo WTBO's muchas veces es desperdicia mucho espacio en la ROM.
Para te facilitar la tarea, acá esta una rutina que te copiará la palleta desde la ROM al offset en la RAM que quieras (no es para gold road, solo para DevKitArm y Mid2GBA):

Iniciado por Sonicarvalho
.code 16
push {r0, r1, r2, lr}
ldr r1, .PaletteDestination
ldr r0, .PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
.align 2
.PaletteDestination:
.word 0x0202EF88
.PaletteSource:
.word 0x087FFDC4


Solo tienes que cambiar los offsets de las palletas en la ROM y RAM.
Pienso que para goldroad sería así:

Iniciado por Sonicarvalho

@Define PaletteDestination = 0x0202EF88
@Define PaletteSource = 0x087FFDC4
@Thumb
push {r0, r1, r2, lr}
ldr r1, PaletteDestination
ldr r0, PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}

Warning: En las dos rutinas, el 16 y el 11 NO SON HEX. Si quieres hex, sustituis 16 por 0xF y 11 por 0xB.

Bien, esta es mi contribución.
Espero haber ayudado.

Saludos de Sonicarvalho
#4
Cheve_X 15014
¡Vaya!¡Muchas Gracias! Sirve mucho... (Ahora podré cambiar un mapa desde el Rom, usando ésto y setmaptile :awesome: )

Muchas Gracias :D

@Javs: Tienes razón, lo siento :shy:
#5
JV Works 12391
Iniciado por Sonicarvalho

Es realmente una buena técnica, yo nunca me habría recordado de hacer 'loading' de la RAM.

Solo hay unas pequeñas cosas a apuntar.
Tu dijiste que la WRAM se guardaba con el Sav. Esto no es de todo verdad! Mira:
EWRAM->02000000-02040000 (256Kb)
SRAM(save ram)-> 0E000000-0E010000 (64kb) o en la mayoría de los casos 32Kb.

...Así que no se guarda todo en el SRAM! Tuviste la suerte encontrar un offset que es guardado en el SRAM. Y mas una cosa: el WRAM no guarda los offsets donde los datos estaban en SRAM, el juego es el que decide eso (en el principio, antes de el CopyRight screen, que ya he analizado las rutinas de Loading). Eso significa que estas sobrescribiendo algo que el juego necesita (pero si no hay bugs con ese offset, entonces debes usar ese)

Otra cosa menos importante, solo para que pienses sin errores acerca de esto : Las palletes no van para la VRAM, solo los tiles y tilemaps.
Las palletas tienen una área especifica de la RAM (05000000), 1kb, y en VRAM hay datos que definen cual paleta los tiles van a usar

Mas una cosa: Estar haciendo WTBO's muchas veces es desperdicia mucho espacio en la ROM.
Para te facilitar la tarea, acá esta una rutina que te copiará la palleta desde la ROM al offset en la RAM que quieras (no es para gold road, solo para DevKitArm y Mid2GBA):

[QUOTE]Iniciado por Sonicarvalho
.code 16
push {r0, r1, r2, lr}
ldr r1, .PaletteDestination
ldr r0, .PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}
.align 2
.PaletteDestination:
.word 0x0202EF88
.PaletteSource:
.word 0x087FFDC4


Solo tienes que cambiar los offsets de las palletas en la ROM y RAM.
Pienso que para goldroad sería así:

Iniciado por Sonicarvalho

@Define PaletteDestination = 0x0202EF88
@Define PaletteSource = 0x087FFDC4
@Thumb
push {r0, r1, r2, lr}
ldr r1, PaletteDestination
ldr r0, PaletteSource
mov r2, #16
swi 11
pop {r0, r1, r2, pc}

Warning: En las dos rutinas, el 16 y el 11 NO SON HEX. Si quieres hex, sustituis 16 por 0xF y 11 por 0xB.

Bien, esta es mi contribución.
Espero haber ayudado.

Saludos de Sonicarvalho[/quote]

Es buena critica amigo, pero recuerda que el tuto comienza siendo "General", es por eso que me refiero a la VRAM en el, porque la tecnica se puede aplicar a mas cosas.

Y con respecto a lo de la SRam, pues no se como sera, pero el punto es que las variables (Esas que se usan en XSE con setvar) se guardan en la WRAM, y curiosamente se guardan con el sav.

Yo precisamente use la direccion en WRAM de una Var en Xse, y se cual es, asi que, no pasara nada siempre que no la modifique :D

Por ultimo, esa rutina esta muy bien, es aprovechable, solo que yo use el WBTO para referirme mas al publico que no sabe asm, mientras que el que si sabe, puede aprovechar aun mas el potencial de esta tecnica :XD:
#6
WesleyFG 12415
Ainda no tenya visto esto, pero gran tuto amigo,
realmyente puede ser utilizado en muchas cosas,
cuando se piensa en algo nuevo para hacer en una hack,
esta todo muy byen explicado, mereces una +Gracias!!
Muy byen!!
#7
Scarex 12262
Bueno, ya me comentaste esto hace tiempo, de verdad de lo que se puede hacer con la RAM es increible, y de verdad, es que se me ocurren 100 ideas a partir de esto, una locura.

Espero que sigas aportando cosas tan interesantes como estas, el hacking se tiene que volver una lucha de ideas xD

Salu2!