Hardware de la GBA
Escrito el Domingo 14 de Septiembre del 2008 por Ealdor
[A] Conoce la GBA
La Nintendo GameBoy Advance (GBA) es una consola de juegos portatiles. Por si no sabías ya. La CPU es un chip ARM7tdmi de 32-bit corriendo a 16.78 MHz. Tiene un número de distintas areas de memoria (como la memoria RAM, IO y memoria de video) las cuales veremos en detalle más adelante. Los juegos están almacenados en Game Paks (cartuchos), consistentes en una ROM para el código y los datos, y bastante cantidad de memoria RAM para guardar la información de los juegos. La GBA tiene una pantalla LCD de 240x160 capaz de mostrar 32768 colores (15 bits). Desafortunadamente, la pantalla no es back-lit, lo cual provoco que bastantes personas se molestaran y fue considerado como un mal movimiento. Así que, en 2003 Nintendo lanzó la GBA SP, una especie de GBA 2.0, que cuenta con una pantalla plegable recordando a los viejos juegos Game & Watch ((¿los recuerdas?, ¿en serio? chico, ¡tu eres viejo!) (para que conste en acta, yo aun conservo la mía también :) )). Luego vino la versión final de la GBA, la GB Micro (GBM), una muy, muy pequeña GBA que se adapta facilmente a todos los bolsillos. Las diferencias entre la GBA, GBA-SP y GBM son principalmente cosméticas, sin embargo, desde el punto de vista de la programación, son iguales.
La GameBoy original llego al mundo por sorpresa en 1989. Nada mal para una consola monocromo ¿verdad?. Despues llegó la GameBoy Color la cual al fín puso algo de color en la máquina, pero no era más que una simple GameBoy. La verdadera sucesora fué la GBA, lanzada en 2002. La GBA es compatible con la GameBoy, por lo que puedes jugar a los antiguos juegos de la GB también.
En términos de capacidad la GBA es bastante parecida a la Super NES (SNES): 15 bits de color, multiples capas de fondo (background layers) y rotación y escalado hardware. Y botones laterales, por supuesto. Un cínico podría mirar a la gran cantidad de puertos de la SNES y decir que la GBA es una SNES portable. Esto es verdad, pero no puedes decir que eso sea una cosa mala.
![]() Imagen de la GBA original. |
![]() Imagen de la GBA-SP. |
[B] Especificaciones y potencial de la GBA
Debajo tienes una lista de las especificaciones y potencial de la GBA, No es una lista completa, pero son las cosas más importantes que necesitas saber:
Video:
- Pantalla LCD de 240x160 pixeles, 15 bit de color. La pantalla de la GBA original no era backlit, pero la SP y la Micro si.
- 3 modos bitmap y 3 modos tilemap y sprites.
- 4 capas tilemap individuales (fondos/backgrounds) y 128 sprites (objetos).
- Transformaciones afines (rotación/escalado/shear) en 2 fondos y 32 objetos.
- Efectos gráficos especiales: mosaico, additive blend, fade a blanco/negro.
Sonido:
- 6 canales en total.
- 4 generadores de tono de la GameBoy original: 2 square wave, 1 wave general y un generador de ruido.
- 2 canales 'DirectSound' para reproducir muestras y música.
Miscelanea:
- 10 botones (o teclas): un pad direccional de 4 direcciones, Select/Start, botones de disparo A/B, botones laterales L/R.
- 14 interrupciones de hardware.
- Modo multijugador de 4 jugadores por un cable multiboot.
- Infrarrojo opcional, interfaces solar y gyroscopic. Otras interfaces creadas por algunas personas.
- Principales plataformas de programación: C/C++ y ensamblador, aunque hay herramientas para Pascal, Forth, LUA y otras. Facil de empezar con ellas, pero dificiles de dominar.
Desde el punto de vista de la programación, la GBA (o cualquier otra consola) es totalmente diferente de un PC. No hay sistema operativo, no hay problema con los drivers e incompatibilidades de hardware: son bits en la medida en el que el ojo los puede ver. Bien, los PCs son también simplemente bits, pero bastante capas mas abajo; en las consolas eres solo tu, la CPU y la memoria. Basicamente, es el sueño de los Verdaderos Programadores.
Para conseguir hacer cualquier cosa, usamos la IO memory-mapped. Areas específicas de memoria son mapeadas (mapped) directamente a las funciones hardware. En la primera demo, por ejemplo, escribiremos el número 0x0403 en la dirección de memoria 0400:0000h. Esto le dice a la GBA activar el fondo 2 y activar el modo gráfico a 3. Lo que esto significa, es para lo que este tutorial sirve :).
(1) La CPU
Como dije, la GBA corre en un chip ARM7tdmi RISC a 16.78 MHz (224 ciclos/segundo). Se trata de un chip de 32 bit que puede funcionar con diferentes conjuntos de instrucciones. Primero, está el código ARM, el cual es un conjunto de instrucciones de 32 bit. Luego esta el THUMB, que usa instrucciones de 16 bit. Las instrucciones THUMB son un subconjunto del conjunto de instrucciones del ARM; ya que las instrucciones son más cortas, el código puede ser más pequeño, pero su poder también es más reducido. Es recomendable que el código normal sea código THUMB en la ROM, y el código crítico sea código ARM en el IWRAM. Debido a que todas las demos tonc son bastante simples, la mayoría del código (pero no todo) es código THUMB.
[C] Secciones de memoria
Esta sección lista las varias areas de memoria. Es basicamente un resumen del sección de memoria de GBATek.
| area | comienzo | fin | longitud | port-size | descripción |
|---|---|---|---|---|---|
| System ROM | 0000:0000h | 0000:3FFF |
16kb | 32 bit | Memoria BIOS. Puedes ejecutarla, pero no leerla (en otras palabras: se toca, pero no se mira). |
| EWRAM | 0200:0000h | 0203:FFFF |
256kb | 16 bit | RAM funcional externa. Disponible para tu código y datos. Si estás usando un cable multiboot, aquí es donde el código descargado va y donde comienza la ejecución (normalmente la ejecución comienza en la ROM). Debido a que el puerto es de 16 bit, necesitas que la sección de código sea código THUMB. |
| IWRAM | 0300:0000h | 0300:7FFFF |
32kb | 32 bit | También disponible para código y datos. Debido a que el bus es de 32 bit y el hecho de que está embebido en la CPU, la hacen la sección de memoria más rápida. El bus de 32 bit significa que las instrucciones ARM pueden ser cargadas de una vez, así que pon código ARM aquí. |
| IO RAM | 0400:0000h | 0401:03FF |
1kb | 16 bit | Resgitros de memoria mapeada de E/S (IO). Estos no tienen nada que ver con los registros de la CPU que usas en ensamblador asi que el nombre puede resultar algo confuso. No me culpen por ello. En esta sección es donde controlas los gráficos, el sonido, los botones y otras características. |
| PAL RAM | 0500:0000h | 0500:03FFh |
1kb | 16 bit | Memoria para las dos paletas de colores, contiene 256 entradas de 15 bit cada una. La primera para los fondos, la segunda para los sprites. |
| VRAM | 0600:0000h | 0601:7FFFF |
96kb | 16 bit | RAM de video. Aquí es donde se almacenan los datos usados para fondos y sprites (objetos). La interpretación de estos datos depende de un cierto número de cosas, incluido el modo de video y la configuración de los fondos y sprites. |
| OAM | 0700:0000h | 0700:03FFh |
1kb | 32 bit | Memoria para los Atributos de los Objetos (Object Attribute Memory). Aquí es donde controlas los sprites. |
| PAK ROM | 0800:0000h | var | var | 16 bit | ROM del cartucho del juego. Aquí es donde se encuentra el juego y donde la ejecución empieza, excepto cuando estas corriendo el juego usando un cable multiboot. El tamaño varia, pero el límite es de 32 MB. Es un bus de 16 bit, así que el código THUMB es preferible sobre el código ARM. |
| Cart RAM | 0e00:0000h | var | var | 8 bit | Aquí es donde los se almacenan los datos guardados. La RAM del cartucho puede ser de la forma SRAM, Flash ROM o EEPROM. Programáticamente todos ellos hacen lo mismo: guardar información. El tamaño total es variable, pero 64 kb en una buena medida. |
Las diferentes secciones RAM (aparte del RAM del cartucho) están a cero al arranque de la BIOS. Las areas de las que te ocuparás más son IO, PAL, VRAM y OAM. Para juegos simples y demos probablemente será suficiente cargar los datos de tus gráficos en PAL y VRAM, al principio usa IO y OAM para controlar la interacción real. La presentación de estas dos secciones es bastante compleja y casi imposible de averiguar por ti mismo (casi, ya que los creadores de los emuladores obviamente han hecho justamente eso). Con esto en mente, como referencia las páginas de GBATek y el CowBite Spec son documentos imprescindibles. En teoría esto es todo lo que necesitas para empezar, pero en la práctica usando uno o más tutoriales (como este) con códigos de ejemplo te salvarán de bastantes dolores de cabeza.

