Registrarse

GBA | La OAM

cosarara97

Dejad de cambiar de nick
Miembro de honor
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 (?)
https://problemkaputt.de/gbatek.htm

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).
https://problemkaputt.de/gbatek.htm#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
OBJ Attribute 0 (R/W)

Bit Expl.
0-7 Y-Coordinate (0-255)
8 Rotation/Scaling Flag (0=Off, 1=On)
When Rotation/Scaling used (Attribute 0, bit 8 set):
9 Double-Size Flag (0=Normal, 1=Double)
When Rotation/Scaling not used (Attribute 0, bit 8 cleared):
9 OBJ Disable (0=Normal, 1=Not displayed)
10-11 OBJ Mode (0=Normal, 1=Semi-Transparent, 2=OBJ Window, 3=Prohibited)
12 OBJ Mosaic (0=Off, 1=On)
13 Colors/Palettes (0=16/16, 1=256/1)
14-15 OBJ Shape (0=Square,1=Horizontal,2=Vertical,3=Prohibited)

Caution: A very large OBJ (of 128 pixels vertically, ie. a 64 pixels OBJ in a Double Size area) located at Y>128 will be treated as at Y>-128, the OBJ is then displayed parts offscreen at the TOP of the display, it is then NOT displayed at the bottom.

OBJ Attribute 1 (R/W)

Bit Expl.
0-8 X-Coordinate (0-511)
When Rotation/Scaling used (Attribute 0, bit 8 set):
9-13 Rotation/Scaling Parameter Selection (0-31)
(Selects one of the 32 Rotation/Scaling Parameters that
can be defined in OAM, for details read next chapter.)
When Rotation/Scaling not used (Attribute 0, bit 8 cleared):
9-11 Not used
12 Horizontal Flip (0=Normal, 1=Mirrored)
13 Vertical Flip (0=Normal, 1=Mirrored)
14-15 OBJ Size (0..3, depends on OBJ Shape, see Attr 0)
Size Square Horizontal Vertical
0 8x8 16x8 8x16
1 16x16 32x8 8x32
2 32x32 32x16 16x32
3 64x64 64x32 32x64

OBJ Attribute 2 (R/W)

Bit Expl.
0-9 Character Name (0-1023=Tile Number)
10-11 Priority relative to BG (0-3; 0=Highest)
12-15 Palette Number (0-15) (Not used in 256 color/1 palette mode)
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.
Ya se que en esa pagina pone que la Y son del 0 al 7 y la X del 0 al 8, pero creo que hay un error, y que la Rotation/Scaling Flag está en los dos sitios, lo que hace que los 2 sean de 8 bits.

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:

OBJ Attribute 0
Bit Nº - Explicación
0 -7 (8 bits) - Y-Coordinate (0-255)
8 (1 bit) - Rotation/Scaling Flag
Si el anterior es un 1 (True):
9 Double-Size Flag (0=Normal, 1=Double)
Si el anterior es un 0 (False):
9 OBJ Disable (0=Normal, 1=Not displayed)
10-11 (2 bits) - OBJ Mode (0=Normal, 1=Semi-Transparent, 2=OBJ Window, 3=Prohibited)
12 (1 bit) - OBJ Mosaic (0=Off, 1=On)
13 (1 bit) - Colors/Palettes (0=16/16, 1=256/1)
14-15 (2 bits) - OBJ Shape (0=Square,1=Horizontal,2=Vertical,3=Prohibited)


OBJ Attribute 1
0-87 (8 bits) - X-Coordinate (En esto creo que la info es errónea, la X también son 8 bits)
8 (1 bit) - Rotation/Scaling Flag
Si el anterior es un 1 (True):
______9-13 (5 bits) - Rotation/Scaling Parameter Selection (0-31)
____________(Selects one of the 32 Rotation/Scaling Parameters that
____________can be defined in OAM, for details read next chapter.)
Si es un 0 (False):
____9-11 (2 bits) Not used
____12 (1 bit) Horizontal Flip (0=Normal, 1=Mirrored)
____13 (1 bit) Vertical Flip (0=Normal, 1=Mirrored)
14-15 (2 bits) - OBJ Size (0..3, depends on OBJ Shape, see Attr 0)
____________Size Square Horizontal Vertical
____________0 8x8 16x8 8x16
____________1 16x16 32x8 8x32
____________2 32x32 32x16 16x32
____________3 64x64 64x32 32x64


OBJ Attribute 2
0-9 (10 bits) - Character Name (0-1023=Tile Number)
10-11 (2 bits) - Priority relative to BG (0-3; 0=Highest)
12-15 (4 bits) - Palette Number (0-15) (Not used in 256 color/1 palette mode)


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:
OBJ Attribute 0 - 00111000 10000000
00111000 - Y-Coordinate (0-255)
1 - Rotation/Scaling Flag
0 - Como el anterior es un 1, Double-Size Flag (0=Normal, 1=Double)
00 - OBJ Mode (0=Normal, 1=Semi-Transparent, 2=OBJ Window, 3=Prohibited)
0 - OBJ Mosaic (0=Off, 1=On)
0 - Colors/Palettes (0=16/16, 1=256/1)
00 - OBJ Shape (0=Square,1=Horizontal,2=Vertical,3=Prohibited)


OBJ Attribute 1 - 01110000 10000000
01110000 X-Coordinate (En esto la creo que info es erronea, la X tambien son 8 bits)
1 - Rotation/Scaling Flag
00000 - Rotation/Scaling Parameter Selection (0-31)
______(Selects one of the 32 Rotation/Scaling Parameters that
_______can be defined in OAM, for details read next chapter.)
00 - OBJ Size (0..3, depends on OBJ Shape, see Attr 0)
______Size Square Horizontal Vertical
______0 8x8 16x8 8x16
______1 16x16 32x8 8x32
______2 32x32 32x16 16x32
______3 64x64 64x32 32x64


OBJ Attribute 2 - 00000000 00001000
00000000 00 - Character Name (0-1023=Tile Number)
00 - Priority relative to BG (0-3; 0=Highest)
1000 - Palette Number (0-15) (Not used in 256 color/1 palette mode)

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

Dew!



Nota @eing:
Respondiendo a tus preguntas:
¿De donde has sacado esas "casillas", Del "ROM" o de la "RAM"?
Todo esto está en la RAM, y se actualiza constantemente

¿Cómo has logrado encontrar dichas casillas?
Esto lo he explicado tan bien como he podido arriba :)
 
Última edición:

Nacho

Nadando hasta la otra orilla
Ningún comentario, triste. Sería bueno que algún usuario avanzado pudiera explicarnos a nosotros los noobs cuales son las utilidades del conocimiento de la OAM y que maravillas podemos hacer con esta.
 

cosarara97

Dejad de cambiar de nick
Miembro de honor
Un tema de 2011, vaya tela. Sinceramente no me lo he releído entero, y pese a ser el autor, recomendaría un cierto escepticismo sobre lo que pueda poner (quizás haya errores, vaya). Eso sí, he arreglado los links que estaban caídos.
GBATEK (arriba enlazado) sigue siendo el documento más importante describiendo el funcionamiento de la GBA. Es un documento muy técnico, de modo que a veces puede costar de entender, pero por lo general es acurado, y muy completo. Algo un poco más ameno es la guía Tonc: https://www.coranac.com/tonc/text/regobj.htm.
Otra cosa que puede ayudar mucho es tocar las capas y ver los paneles de los menús de herramientas o debugging en un emulador. Recomiendo mGBA.
Respecto a las implicaciones que pueda tener para el RH a nivel práctico, no lo sé. Evidentemente entender mejor la plataforma es lo que te abre a posibilidades. Entender como funciona el sistema de sprites es una parte de ello.
 
Arriba