En el mundo gráfico de la Game Boy, todos los cálculos los realiza la CPU, y la Picture Processing Unit (PPU) se encarga de renderizarlos. Este es otro componente del SoC DMG-CPU que podría describirse como una versión mejorada del chip gráfico del predecesor (que, curiosamente, comparte el mismo nombre).

Frame mostrado en la pantalla LCD de la Game Boy original.
La imagen se muestra en una pantalla integrada de tipo Liquid-Crystal Display (LCD) con una resolución de 160×144 píxeles. En el caso de la Game Boy monocroma, la LCD solo puede mostrar 4 tonos de gris (blanco, gris claro, gris oscuro y negro). No obstante, al estar tintada de verde, la imagen presentará un tono ligeramente verdoso.
Un modelo familiar
Si has leído el análisis de la NES, puede que recuerdes que la PPU fue diseñada en torno al comportamiento de los monitores CRT (especialmente al funcionamiento de su haz). Esto puede parecer incompatible con una pantalla LCD, aunque esta también debe actualizarse periódicamente. Así pues, la nueva PPU aprovecha este requisito para ofrecer efectos basados en CRT, similares a los que permitieron a los desarrolladores de NES crear contenido imaginativo.
Además, a diferencia de su homólogo doméstico, la Game Boy no se alimenta de la corriente alterna que proporcionan los enchufes de pared —esa que varía según el país o la región—. En consecuencia, sus circuitos analógicos no están ligados a la red eléctrica local. Dicho de otro modo: mientras la NES debía adaptarse a configuraciones de 60 Hz y 50 Hz, la Game Boy funciona con las mismas cuatro pilas AA independientemente del lugar del mundo. Por lo tanto, todas las Game Boys comparten las mismas velocidades de reloj de CPU y una tasa de refresco de 59,7 Hz, lo cual facilita la vida a desarrolladores y usuarios por igual.
Organizando el contenido

Arquitectura de memoria de la PPU.
La PPU está conectada exclusivamente a 8 KB de Video RAM (también denominada 'VRAM' o 'Display RAM'). Esos 8 KB contienen la mayor parte de los datos que la PPU necesita para renderizar los gráficos. Los demás datos se almacenan dentro de la propia PPU, pues requieren tasas de acceso más rápidas.
La PPU también arbitra el acceso de la CPU a la VRAM, y es el juego quien se encarga de rellenar las distintas áreas con el tipo de datos correcto. Además, la PPU pone a disposición registros que permiten definir cómo se organiza la información gráfica. No obstante, hay muchas reglas que respetar (explicadas en las secciones siguientes).
Construyendo el frame
El frame final que se ve en la pantalla LCD está compuesto por tres capas superpuestas, cada una pensada para un tipo de uso diferente.
Veamos cómo la PPU logra dibujar píxeles en pantalla. Para la demostración se usará Super Mario Land 2.
Tiles

Una tabla de patrones con múltiples tiles.

Un único tile.
La PPU utiliza tiles como ingrediente básico para renderizar gráficos; en concreto, sprites y fondos .
Los tiles son sencillamente mapas de bits de 8×8 píxeles. Cada uno ocupa 16 bytes y se almacena en la VRAM, en una región denominada Tile set o 'Tile pattern table'. El color de cada píxel corresponde a uno de los cuatro tonos de gris disponibles, seleccionado mediante una paleta de 'color'. El uso de paletas también permite cambiar los colores sin necesidad de modificar el Tile set.
Las Game Boys monocromas disponen de registros suficientes para definir hasta tres paletas, aunque su uso está restringido según el tipo de capa que se renderiza (explicado en las secciones siguientes). Como ya se indicó, solo hay cuatro colores/tonos disponibles, por lo que un único registro de 8 bits puede albergar una paleta de cuatro tonos sin problema.
Además, los tiles se agrupan en dos tablas de patrones.
Para construir la imagen, los tiles se recogen en otro tipo de tabla denominada Tile map, que indica a la PPU dónde renderizar cada tile. Se almacenan dos mapas para construir distintas capas del frame.
Las secciones siguientes explican cómo se usan los Tile maps para ensamblar estas capas.
Capa de fondo

Mapa de fondo asignado en la VRAM.

Área seleccionada del mapa de fondo. La selección incluye una porción sin usar en la parte superior, que quedará cubierta por la capa Ventana.
La capa de fondo es un mapa de 256×256 píxeles (32×32 tiles) que contiene tiles estáticos. Sin embargo, recuerda que solo 160×144 píxeles son visibles en pantalla, por lo que el juego decide qué zona mostrar en cada momento. Los juegos también pueden desplazar el área visible durante el gameplay, que es como se consigue el efecto de desplazamiento.
Uno de los dos Tile maps puede emplearse para construir la capa de fondo. Además, solo hay una paleta disponible para esta capa.
Sprites
Los sprites, también conocidos como 'Objects', son tiles que pueden moverse de forma independiente por la pantalla. También pueden superponerse entre sí o aparecer detrás del fondo; lo que se muestra en pantalla viene determinado por su atributo de prioridad.
Esta capa dispone de un color extra: Transparente. Esto implica que los sprites solo pueden mostrar tres tonos de gris en lugar de cuatro, pero a cambio esta capa cuenta con dos paletas dedicadas.
La Object Attribute Memory (OAM) es un mapa almacenado dentro de la PPU que especifica qué tiles se usarán como sprites; su ubicación dentro de la PPU agiliza el acceso durante el renderizado. Por esta razón, todos los sprites se definen en la OAM (en lugar de en un Tile map de la VRAM). Los juegos suelen rellenar esta región llamando a la unidad OAM DMA del chip, que obtiene los datos de la RAM principal o de la ROM del juego y los transfiere a la OAM. Mientras la DMA está activa, la CPU no puede acceder a la memoria externa, de ahí la importancia de aprovechar la High RAM durante ese período.
Aparte del índice de tiles, cada entrada de la OAM contiene los siguientes atributos: posición X-Y, paleta elegida, prioridad y flip flags (que permiten reflejar el tile vertical y horizontalmente).
La PPU está limitada a renderizar hasta diez sprites por línea de escaneo y hasta 40 por frame; si se supera este límite, algunos sprites no se dibujarán.
Ventana

Mapa de Ventana mostrado. El juego la activa durante las últimas líneas de escaneo, por lo que solo se renderizan las primeras filas en la parte inferior de la pantalla.
La capa Ventana es un mapa de 160×144 píxeles (que cubre toda la pantalla) y renderiza tiles sobre el fondo y los sprites. Dicho esto, esta capa no se desplaza.
El Tile map restante puede asignarse a la capa Ventana, que además comparte la misma paleta.
En definitiva, puede parecer una característica un tanto limitada: dado que la Ventana carece de transparencia y por tanto oscurece completamente las capas inferiores, cabe preguntarse para qué sirve. La respuesta es que, combinada con efectos de trama temporizados, la Ventana puede emplearse parcialmente en distintas zonas de la pantalla. ¿Recuerdas las complejas rutinas sincronizadas que los juegos de NES necesitaban para mostrar las estadísticas del jugador? La Ventana resuelve ese problema, y la PPU de la Game Boy lo gestiona de forma automática.
Por consiguiente, los juegos suelen usar la capa Ventana para mostrar contadores de vida, puntuaciones y otra información persistente.
Resultado
Una vez finalizado el frame, es hora de pasar al siguiente. Sin embargo, la CPU no puede modificar las tablas mientras la PPU está leyendo la VRAM, por lo que el sistema dispone de interrupciones que se activan cuando la PPU está inactiva. Este comportamiento te resultará familiar de la era NES.
Cuando se completa una sola línea de escaneo, comienza el período de Horizontal Blank, que permite a los desarrolladores modificar la parte del frame que aún no se ha dibujado.
Cuando se completan todas las líneas de escaneo, comienza el período de Vertical Blank y se activa una interrupción dedicada. En ese momento, el juego puede actualizar los gráficos para el siguiente frame.
Hay un estado adicional denominado OAM search que se inicia al comienzo de cada línea de escaneo. En ese punto, la PPU determina qué sprites se mostrarán en esa línea, por lo que el juego puede actualizar cualquier región excepto la OAM.
El efecto de tambaleo

Super Mario Land 2: 6 Golden Coins (1992), jugando con los controles de desplazamiento X e Y a mitad de pantalla.
La inclusión de la capa Ventana y las interrupciones adicionales dieron pie a contenidos y efectos únicos. Por ejemplo, las interrupciones horizontales permitían modificar el frame antes de que terminara de completarse, de modo que podía aplicarse un valor de desplazamiento diferente a cada línea, haciendo que cada fila se desplazara a su propio ritmo .
El resultado es un interesante efecto de tambaleo (no estoy seguro de que ese sea su nombre oficial, pero me parece suficientemente descriptivo).
Las adiciones de color
Hasta aquí hemos analizado la Game Boy original. Veamos ahora las novedades del modelo denominado 'Color'.
Modos de operación

The Legend of Zelda: Link's Awakening DX (1998).
Un juego híbrido de Game Boy Color ejecutándose en modo CGB.

Super Mario Land 2, ejecutándose en una Game Boy Color. El juego corre en modo DMG, pero la consola aplica una paleta colorizada igualmente.
La PPU de la Game Boy Color se comporta en esencia como un superconjunto de la original. Con todo, Nintendo quería que los usuarios de Color percibieran mejoras incluso con juegos exclusivamente monocromáticos. Por ello, para mantener la compatibilidad, la nueva PPU ofrece dos modos de operación:
- Modo CGB: modo PPU extendido con todas las mejoras visuales de los juegos de Game Boy Color.
- Modo DMG: modo tradicional con todos los extras deshabilitados. Sin embargo, como verás en la sección 'Sistema operativo', los juegos monocromáticos igualmente se mejoran con paletas de color.
Organizando el (nuevo) contenido
La placa base del CGB alberga ahora 16 KB de VRAM, el doble de la cantidad original. Debido a las limitaciones de direccionamiento de la CPU, esta nueva configuración se implementa en forma de dos bancos de 8 KB, con un nuevo registro (VBK) que actúa como selector. Por su parte, la PPU puede acceder a los dos bancos simultáneamente. En la práctica, los programadores solo necesitan rellenar los bancos de VRAM con ayuda de VBK y luego indicar en el Tile map en qué banco reside cada tile, dejando el resto a la PPU.
Dicho esto, ¿qué se puede hacer con la VRAM extra? Muchas cosas:
- Almacenar el doble de tiles.
- Almacenar paletas adicionales, que también ofrecen una gama de colores más amplia.
- Ampliar el espacio de metadatos de los tiles para codificar más efectos y referenciar paletas adicionales.
Los visuales
Gracias a la nueva PPU, los programadores pueden diseñar paletas con una gama de 32.768 colores.
En primer lugar, los desarrolladores deben rellenar una nueva área denominada Palette Memory, que almacena hasta dieciséis paletas de colores (la mitad para el fondo y la ventana, y la otra mitad para los sprites), cada una con cuatro colores . Cada entrada ocupa 16 bits (2 bytes), aunque solo se usan 15. La Palette Memory no es directamente direccionable por la CPU; en su lugar, un nuevo registro actúa como búfer para escribir en esta memoria (metodología presente también en la Super Nintendo). Así es, en definitiva, como los juegos en color definen sus paletas.
Dicho esto, los tiles de fondo y ventana pueden usar cualquiera de las ocho paletas disponibles. Lo mismo se aplica a los tiles de sprite, con la diferencia de que están limitados a paletas de tres colores, pues una entrada sigue reservada para el color 'transparente'.
El espacio extra
Por otro lado, los tile sets doblan ahora su tamaño, lo que permite a los programadores almacenar el doble de tiles en la VRAM. Los Tile maps de fondo y ventana también se han ampliado, incorporando metadatos adicionales que expanden las capacidades de estas capas. Por ejemplo, los tiles de fondo y ventana ahora pueden invertirse horizontal y verticalmente, lo que evita tener que almacenar gráficos duplicados en la VRAM (y, a su vez, permite renderizar más contenido único).
Además, la CPU CGB incluye una unidad DMA adicional, capaz de copiar datos del Game Pak o de la WRAM a la VRAM. Opera en dos modos :
- DMA de propósito general: las transferencias pueden ocurrir en cualquier momento; el DMA toma prioridad sobre otros accesos a memoria. Los programadores deben por ello planificar cuándo usar este componente (durante o fuera del escaneo) y cuántos datos copiar, pues un uso incorrecto puede provocar desgarro de imagen (ya que el acceso a la VRAM quedará bloqueado durante la transferencia).
- DMA de Horizontal Blank (H-Blank): las transferencias solo se producen durante los períodos de H-Blank. Esto evita artefactos en pantalla, pero limita las transferencias a lotes de 16 bytes y las pausa durante el escaneo LCD.
Una vez más, esta unidad ofrece a los programadores nuevas posibilidades para crear contenido más rico, aprovechando períodos que de otro modo permanecerían inactivos.



