inv_gba
Thread Id: 11176
Thread Name: Oam
#0
cosarara97 12296
Esto es para ruby, pero se puede aplicar a todos los roms de GBA, pues la RAM está igualmente estructurada en todos ellos (por lo menos las secciones principales, vaya), y el OAM específicamente es siempre igual. Este tama es para separar lo que empecé en el tema del cambio de mini, porque hay suficiente información para separarlo (y por que lo ha pedido eing xD)


Primero os paso el Link mas cool de todos los links que hay en este foro (?)
http://www.daftcode.net/gbatek/gba

Bueno, en esta pagina tenemos de todo. Está extraído de la documentación de No$gba.
En esta pagina, mas o menos, está explicado como funciona la GBA.


La sección que nos interesa es la que habla sobre la OAM (Object Attribute Memory).
http://www.daftcode.net/gbatek/gba#lcdobjoamattributes

Que es el (o la) OAM:
La OAM es la "Object Attribute Memory", que (mal xD) traducido sería "memoria de atributos de objeto". Básicamente es una parte de la RAM en la que se guardan las propiedades (atributos) de los objetos (como los sprites). Estas propiedades son la X, la Y, la paleta y más cosas sobre el objeto.


Donde está la OAM
Si usáis el memory viewer de VBA, veréis que hay una sección llamada OAM, que se encuentra en el offset 0x07000000 (siete millones)

Como vemos la información del OAM
Ya os digo ahora que des del memory viewer no. Así que dale a "Save...", y guarda unos 100 bytes empezando en el 0x07000000.
Abrid el dump de la memoria con un buen editor Hex (en realidad un editor binario). Yo que uso Linux usaré Okteta.
Si vuestro editor os lo abre en Hex, tenéis que cambiarlo a binario, de modo que os muestre 1s y 0s. Normalmente van en grupos de 6 (000000 111100 010101...), pero si no no pasa nada.
Bien, ya tenéis la información en binario, ahora hay que separar los bits.

Como se organizan las casillas
Primero hay que entender lo siguiente:
There are 128 entries in OAM for each OBJ0-OBJ127. Each entry consists of 6 bytes (three 16bit Attributes). Attributes for OBJ0 are located at 07000000, for OBJ1 at 07000008, OBJ2 at 07000010, and so on.


Esto quiere decir lo siguiente:
Hay 128 entradas en el OAM, del objeto 0 al 127. Cada entrada ocupa 6 bytes (de 8 bits cada uno, lo que suma 48 bits por entrada). Los atributos del objeto 0 estan en el offset 07000000, los del objeto 2 al 07000008, etc.

Información de las casillas

Lo siento pero no voy a traducirlo ahora porque está explicado en el siguiente paso.

Como buscar una casilla
Atención! El dump debe ser del mismo momento en que aparece el sprite, si no, no sirve de nada.

En este mismo momento en que aparece el sprite, hacemos el dump y abrimos el OAM viewer de VBA.
En mi caso tengo 3 sprites. Son 2 cajas y el mini del player chico. Aunque realmente las 2 cajas usan el mismo sprite y paleta, en el OAM son dos objetos diferentes, y tienen cada uno su entrada. Como es mucho mas divertido buscaremos al player ;)

Cogemos un conversor que convierta hex, binario y decimal, la calculadora científica de windows sirve
Abrimos el dump en un editor binario (o un editor hex que pueda leer en binario).

En la ventana del OAM viewer, vamos al sitio donde está el sprite.
Tenemos mucha información, pero solo usaremos el primer dato: La posición (pos). Aquí la posición está en "X, Y", pero en la tabla del OAM está primero la Y y luego la X.
Leemos el primer valor de la posición, la X. En mi caso 112. Este valor es decimal, como lo queremos en binario, cogemos la calculadora y lo convertimos en binario. En mi caso es 1110000, en realidad hay que añadirle un cero al principio, porque en nuestra tabla ocupa los bytes del 0 al 7, que son 8.


Por un tema practico, recomiendo copiar todos los bytes del editor binario a un editor de testo tipo bloc de notas, porque así podemos marcar donde está una casilla, y que valor hay en ella a un lado.
En el editor binario (o el de texto, en mi caso) buscamos este numero binario. En mi caso, 01110000. Lo he encontrado, así que lo marco.
Ahora haremos lo mismo con la Y. Cogemos el valor del OAM viewer, lo pasamos a binario y lo buscamos. Si todo ha ido bien, tiene que estar 2 bytes antes que la X (la Y, un byte y la X).
Siendo aquí: --- 00111000 10000000 01110000 10000000 00000000 00001000 ---
Lo marcado en rojo la X y lo marcado en azul la Y

A partir de estas 2 referencias, podemos encontrar el resto de datos mirando esta guía:




Y al final me ha quedado así:

--- [OBJ Attribute 0] [OBJ Attribute 1] [OBJ Attribute 2]
--- 00111000 10000000 01110000 10000000 00000000 00001000 ---

Y con estos datos:


Espero que lo que explico aquí sea correcto y se entienda mejor que el tutorial de editar un ROM en python xD

Dew!



Nota [MENTION=12479]eing[/MENTION]: