Author Id: 12296 Author Name: cosarara97 Post Content: 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 (?) [url]http://www.daftcode.net/gbatek/gba[/url] 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). [url]http://www.daftcode.net/gbatek/gba#lcdobjoamattributes[/url] 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: [quote]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.[/quote] 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 [SPOILER=La info en inglés] 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) [/SPOILER] 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. [spoiler=NOTA:]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.[/spoiler] 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: [spoiler= guia] 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-[s]8[/s]7 (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) [/spoiler] 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: [spoiler=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) [/spoiler] 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]: [spoiler=Pulsa para desplegar este spoiler]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 :)[/spoiler]