Arquitectura de Game Boy / Color
(copetti.org)- La familia Game Boy combina, dentro de un bajo presupuesto de energía, el SoC DMG-CPU, la PPU, la APU, la ROM de arranque y el Game Pak para integrar CPU, gráficos, audio, compatibilidad y protección contra copias de una consola portátil en un solo sistema
- La CPU se basa en el núcleo SM83 de Sharp y funciona a unos 4.19 MHz; la CPU CGB de Game Boy Color mantiene la misma familia, pero en modo de doble velocidad sube hasta unos 8.38 MHz
- Los gráficos combinan tiles, fondos, sprites y ventana mediante una LCD de 160×144 y una PPU basada en VRAM; el modelo Color amplía la expresividad con 16 KB de VRAM, una paleta de 32,768 colores y DMA adicional
- El audio corre a cargo de una APU de 4 canales; el Game Pak usa Memory Bank Controller para superar el espacio de direcciones base de 32 KB, y admite comunicación externa mediante el cable Link y el infrarrojo de Color
- La ROM de arranque ejecuta el juego después de verificar el logotipo de Nintendo y el checksum del encabezado de la ROM; este requisito del logotipo funcionaba como un mecanismo de control de distribución basado en derechos de autor y marcas registradas
Alcance y dirección de diseño de la familia Game Boy
- La serie Game Boy puede verse como una versión portátil de la NES, pero no es una simple reducción, sino una arquitectura con funciones propias y una dirección de expansión propia
- La marca Game Boy se extendió a lo largo de dos generaciones
- La cuarta generación incluye la Game Boy monocromática y revisiones como Game Boy Pocket y Light
- La generación siguiente incluye la Game Boy Color, lanzada después de Virtual Boy
- El análisis se centra en la estructura básica de la Game Boy monocromática y en cómo esa estructura se expandió en el modelo Color
CPU y estructura de memoria
- En vez de colocar varios chips de propósito general en la placa principal, Nintendo eligió un diseño de chip único que incluía la CPU y los componentes principales
- Este SoC se conoce como DMG-CPU o Sharp LR35902
- Fue fabricado por Sharp Corporation y resultaba ventajoso para implementar eficiencia energética, protección contra copias e I/O adicional según los requisitos de Nintendo
- Al no ser un chip disponible en catálogos minoristas, era difícil que la competencia lo copiara tal cual
-
Núcleo de CPU SM83
- El procesador principal dentro del DMG-CPU es el Sharp SM83
- Es una mezcla de Zilog Z80 e Intel 8080, y funciona a unos 4.19 MHz
- El SM83 conserva solo algunas funciones del Z80 y del 8080
- No tiene los registros
IXeIYdel Z80 ni las instruccionesINyOUTdel 8080 - Como no puede usar puertos de I/O, los componentes deben estar mapeados en memoria
- Solo tiene el conjunto de registros del Intel 8080, por lo que cuenta con 7 registros de propósito general
- De las instrucciones extendidas del Z80, solo implementa algunas de manipulación de bits
- No tiene los registros
- Sharp también agregó instrucciones nuevas que no existen en el Z80 ni en el 8080
LDHse diseñó para acceder a los últimos 256 bytes del mapa de memoria, que empiezan en$FF00- Al reducir el tamaño de la instrucción en 1 byte, puede ejecutarse un poco más rápido
-
Cambios de CPU en Game Boy Color
- Game Boy Color incorpora un nuevo SoC, CPU CGB, pero en general mantiene el núcleo de CPU SM83
- La mayor excepción es la frecuencia de reloj, que se duplica hasta unos 8.38 MHz
- Mantener el mismo núcleo de CPU permite a los desarrolladores reutilizar sus conocimientos de programación existentes, y también reduce el costo de rediseñar una nueva arquitectura y la carga de implementar retrocompatibilidad
- CPU CGB ofrece dos modos de operación
- Normal mode: el SM83 funciona a unos 4.19 MHz
- Dual-speed mode: el SM83 funciona a unos 8.38 MHz
- Esta elección también dejó el costo de seguir usando tecnología antigua para los estándares de fines de la década de 1990
-
Espacio de direcciones y RAM
- El SM83 mantiene un bus de datos de 8 bits y un bus de direcciones de 16 bits, por lo que puede direccionar hasta 64 KB de memoria
- El mapa de memoria está compuesto por el espacio del Game Pak, WRAM, HRAM, VRAM, I/O como joypad, audio, gráficos y LCD, y áreas de control de interrupciones
- La placa principal de la Game Boy original incluía 8 KB de WRAM como memoria de propósito general, cuatro veces la capacidad de la NES
- Dentro del SoC también hay 127 B de HRAM
- Es un espacio pequeño al que se puede acceder más rápido con la instrucción
LDH - El bus de HRAM en sí no es técnicamente más rápido que el de WRAM, pero la CPU tiene prioridad
- Es importante cuando la CPU no puede acceder a memoria externa durante una operación DMA
- Es un espacio pequeño al que se puede acceder más rápido con la instrucción
- Game Boy Color aumenta la WRAM a 32 KB
- La capacidad de direccionamiento de la CPU sigue igual, así que no puede conectar toda la memoria de una vez
- Para acceder a los 24 KB adicionales de WRAM usa bank switching
- Los últimos 4 KB del espacio existente de 8 KB se intercambian entre 7 bancos
- El registro
SVBKse usa para seleccionar el banco de WRAM
Gráficos: PPU, LCD y composición de capas
- Los gráficos de Game Boy tienen una estructura en la que la CPU realiza cálculos y una PPU separada dentro del SoC DMG-CPU renderiza la pantalla
- La LCD integrada ofrece una resolución de 160×144 píxeles
- La LCD de la Game Boy monocromática solo refleja 4 niveles de gris: blanco, gris claro, gris oscuro y negro
- Por la LCD de tono verde, la pantalla se ve ligeramente verdosa
- A diferencia de las consolas de sobremesa, que dependen de la frecuencia eléctrica de cada región, todas las Game Boy funcionan con 4 baterías AA
- La frecuencia de la CPU y la tasa de refresco no cambian según la región
- La tasa de refresco es de 59.7 Hz
-
VRAM y renderizado basado en tiles
- La PPU está conectada de forma exclusiva a 8 KB de VRAM y lee de allí la mayor parte de los datos necesarios para renderizar
- Algunos datos que requieren acceso más rápido se almacenan dentro de la PPU
- El acceso de la CPU a la VRAM es arbitrado por la PPU, y el juego debe llenar la zona de VRAM con los datos correctos
- La unidad básica de renderizado es el tile
- Un tile es un bitmap de 8×8 píxeles
- Cada tile ocupa 16 bytes
- Se almacena en el área Tile set o Tile pattern table de la VRAM
- El color se elige entre 4 niveles de gris mediante paletas
- La Game Boy monocromática puede definir hasta 3 paletas, pero su uso está limitado según el tipo de capa que se renderice
-
Fondo, sprites y ventana
- El cuadro final se compone de tres capas superpuestas
- La capa de fondo es de 256×256 píxeles, es decir, un mapa de 32×32 tiles
- En la pantalla real solo se ven 160×144 píxeles
- El juego selecciona el área de fondo que se mostrará y la mueve para implementar un efecto de desplazamiento
- La capa de fondo solo usa 1 paleta
- Los sprites son tiles que pueden moverse de forma independiente
- Pueden superponerse entre sí o ubicarse detrás del fondo
- La prioridad de visualización se decide con el atributo priority
- Se agrega un color transparente, por lo que los grises realmente visibles son 3 niveles
- Se puede elegir una de 2 paletas dedicadas
- Las definiciones de sprites se almacenan en la OAM (Object Attribute Memory) interna de la PPU
- Normalmente, el juego llama a OAM DMA para copiar datos desde RAM o ROM hacia OAM
- Mientras DMA está activa, la CPU no puede acceder a memoria externa
- Cada entrada de OAM incluye índice de tile, posición X-Y, paleta, prioridad y flags de inversión vertical y horizontal
- El renderizado de sprites de la PPU tiene límites
- Máximo 10 por scanline
- Máximo 40 por cuadro
- Si se supera el límite, algunos sprites no se dibujan
- La capa de ventana es un mapa de 160×144 píxeles que puede cubrir toda la pantalla
- Se renderiza encima del fondo y los sprites
- No se desplaza
- Solo uno de los mapas de tiles restantes puede asignarse a la capa de ventana
- Comparte la misma paleta que el fondo
- Como no es transparente, tapa por completo las capas inferiores, pero puede usarse parcialmente junto con efectos raster basados en timing
- Los juegos suelen usar la capa de ventana para contadores de vida, puntaje e información persistente en pantalla
-
Actualización de cuadros y efectos raster
- La CPU no puede modificar tablas mientras la PPU está leyendo la VRAM
- El sistema ofrece interrupciones que ocurren cuando la PPU está inactiva
- Horizontal Blank comienza después de que termina una scanline y permite ajustar la parte del cuadro que aún no se ha dibujado
- Vertical Blank comienza después de que terminan todas las scanlines y permite actualizar los gráficos del siguiente cuadro
- OAM search ocurre al inicio de una scanline y permite actualizar áreas excepto la OAM mientras la PPU decide los sprites de esa línea
- Gracias a la capa de ventana y a interrupciones adicionales, es posible cambiar partes del cuadro antes de que se haya dibujado toda la pantalla
- Aplicar valores de scroll distintos en cada scanline permite crear un wobble effect, en el que cada fila se mueve a distinta velocidad
Expansiones gráficas de Game Boy Color
- La PPU de Game Boy Color funciona como un superconjunto de la PPU original y ofrece dos modos de operación por compatibilidad
- CGB mode: ofrece mejoras visuales para títulos de Game Boy Color
- DMG mode: es el modo tradicional con las funciones extendidas desactivadas
- La placa principal de Game Boy Color tiene 16 KB de VRAM
- Es el doble de capacidad que antes
- Por las limitaciones de direccionamiento de la CPU, se compone de 2 bancos de 8 KB
- El registro
VBKse usa para cambiar de banco de VRAM
- La PPU puede acceder a los dos bancos de VRAM al mismo tiempo
- El desarrollador llena el banco de VRAM con
VBK - Si en el mapa de tiles se especifica en qué banco está cada tile, la PPU se encarga de procesarlo
- El desarrollador llena el banco de VRAM con
- La VRAM adicional se usa para almacenar el doble de tiles, guardar más paletas, ampliar metadatos de tiles y hacer referencia a paletas y efectos adicionales
-
Color y DMA adicional
- La nueva PPU de Game Boy Color puede definir paletas a partir de 32,768 colores
- El desarrollador almacena hasta 16 paletas de color en Palette Memory
- Son 8 para fondo/ventana y 8 para sprites
- Cada paleta codifica 4 colores
- Cada entrada es un valor de 16 bits, aunque en realidad solo se usan 15 bits
- Palette Memory no puede ser direccionada directamente por la CPU; un registro nuevo actúa como buffer de escritura
- Los tiles de fondo y ventana pueden hacer referencia a una de 8 paletas
- Los tiles de sprite también pueden hacer referencia a una de 8 paletas, pero una entrada sigue reservada como color transparente, por lo que se mantiene la restricción de paletas de 3 colores
- El conjunto de tiles crece al doble, permitiendo almacenar el doble de tiles en VRAM
- Los mapas de tiles de fondo y ventana también se amplían para contener más metadatos
- Los tiles de fondo y ventana pueden invertirse vertical u horizontalmente, reduciendo la necesidad de guardar gráficos duplicados en VRAM
- CPU CGB incluye una unidad DMA adicional para copiar datos hacia VRAM
- Puede copiar desde Game Pak o WRAM hacia VRAM
- General-purpose DMA puede transferir en cualquier momento, pero durante la transferencia toma prioridad sobre los accesos a memoria y puede causar tearing en pantalla
- H-Blank DMA transfiere solo durante H-Blank y evita artefactos visuales, pero está limitada a bloques de 16 bytes y se detiene durante el escaneo de la LCD
Audio: APU de 4 canales
- El audio lo maneja la APU (Audio Processing Unit), que ofrece un total de 4 canales mediante un Programmable Sound Generator
- La APU es uno de los componentes que se mantiene sin cambios en las revisiones de Game Boy
- No puede acelerarse como la CPU
- Cambiar la velocidad del oscilador no mejora la calidad de sonido, sino que cambia el tono
- Para aumentar sus funciones habría que agregar circuitos, lo que también incrementaría el costo
-
Configuración de canales
- Hay 2 canales de onda de pulso, usados principalmente para melodías y efectos de sonido
- Ofrecen 4 tonos cambiando el ancho de pulso
- El primer canal tiene sweep control dedicado
- Como la cantidad de canales es limitada, la melodía puede interrumpirse cuando se reproducen efectos durante el juego
- El tercer canal admite forma de onda definida por el usuario
- La forma de onda, compuesta por 32 muestras de 4 bits, se almacena en una wavetable
- Se puede controlar el volumen y la frecuencia
- Hay 1 canal de ruido
- Es un conjunto de formas de onda aleatorias que suena como ruido blanco
- En los juegos se usa principalmente para percusión o efectos ambientales
- Ofrece dos tonos, clean static y robotic static, y también permite ajustar la frecuencia
- Hay 2 canales de onda de pulso, usados principalmente para melodías y efectos de sonido
-
Mezclador y pines de audio extendido
- El mezclador ofrece salida estéreo para ubicar canales a la izquierda o a la derecha
- Como la bocina integrada es mono, el panning solo se percibe por la salida de audífonos
- El hardware del mezclador también está conectado a pines dedicados del cartucho
- Si el cartucho emite sonido analógico con hardware adicional, puede transmitir canales adicionales
- Ningún juego comercializado usó esta función
- Esta función se eliminó en la época de Game Boy Advance
ROM de arranque y modo de operación
- Game Boy no arranca directamente en el juego como NES/Famicom, sino primero desde una ROM interna de 256 bytes
- El procedimiento básico de arranque es el siguiente
- Al encenderse, la CPU empieza a leer desde la dirección
0x0000 - Se inicializan la RAM y la APU
- Se copian los gráficos del logotipo de Nintendo desde la ROM del cartucho hacia Display RAM y se dibujan en la parte superior de la pantalla
- Si no hay cartucho o no está bien insertado, el logotipo puede verse como tiles corruptos
- El logotipo se desplaza hacia abajo y se reproduce el sonido icónico
- Se compara el logotipo de Nintendo del juego con el logotipo dentro de la ROM de la consola
- Se realiza un checksum rápido sobre el encabezado de la ROM del cartucho
- Si la verificación falla, la consola se detiene
- La ROM de la consola se elimina del mapa de memoria
- La CPU empieza a ejecutar el juego
- Al encenderse, la CPU empieza a leer desde la dirección
- El logotipo de Nintendo mostrado en pantalla no se borra de la VRAM, por lo que el juego puede aplicarle animaciones o efectos de transición
-
Cambios de arranque en Game Boy Color
- El tamaño de la ROM de Game Boy Color aumenta a 2 KB
- La secuencia de arranque verifica si el juego insertado es exclusivo de Game Boy o un juego de Game Boy Color
- Examina metadatos específicos de la ROM del cartucho y, según el resultado, configura los registros de activación de modo DMG o CGB
- Si se inserta un juego DMG, el programa de arranque llena Palette RAM con una paleta calculada
- Usa un algoritmo simple que depende de los metadatos del juego
- Este es el principio por el que los juegos monocromáticos se ven coloreados en Game Boy Color
- El usuario puede cambiar la paleta seleccionada mediante combinaciones de botones durante el arranque
- El logotipo de Nintendo también se copia a HRAM
- La etapa de checksum solo verifica la primera mitad del logotipo en HRAM
Game Pak, desarrollo de juegos y comunicación externa
- En esa época, los juegos donde el rendimiento era importante se escribían principalmente en lenguaje ensamblador, ya que la madurez de los compiladores de lenguajes de alto nivel no era suficiente
- Los juegos comerciales se distribuían en Game Pak, el cartucho de Nintendo para Game Boy
- El espacio de almacenamiento básico es de hasta 32 KB por la limitación del espacio de direcciones
- Con un Memory Bank Controller, es decir, un mapper, se pueden crear juegos más grandes
- Los Game Pak más grandes comercializados incorporaron 1 MB de ROM en la Game Boy original y 8 MB de ROM en Game Boy Color
- Algunos Game Pak incluyen reloj en tiempo real, SRAM adicional y una batería externa para conservar partidas guardadas
-
Tipos de cartucho en la era Color
- Con la incorporación del modo de operación de Game Boy Color, los juegos se dividen en tres tipos
- Game Boy: totalmente compatibles con todos los modelos de Game Boy y siempre se ejecutan en modo DMG
- Game Boy Color enhanced: compatibles con los modelos monocromáticos, pero con mejoras visuales en modo CGB al usarse en Game Boy Color
- Game Boy Color exclusive: compatibles solo con Game Boy Color y optimizados para aprovechar ese hardware
- Los tres tipos tenían colores oficiales para facilitar su diferenciación
- Algunos juegos, como Pokémon y Donkey Kong, usaron diseños distintos
- Con la incorporación del modo de operación de Game Boy Color, los juegos se dividen en tres tipos
-
Cable Link e infrarrojo
- Por primera vez, los juegos de Game Boy podían comunicarse con hardware externo mediante el cable Game Boy Link, habilitando multijugador y uso de accesorios
- El cable Link se conecta al subconector de 6 pines de la consola, y la interfaz usa el protocolo SPI (Serial Peripheral Interface)
- Una Game Boy opera como master y maneja la señal de reloj, mientras que la otra actúa como slave
- En cada transferencia, master y slave intercambian un paquete de 8 bits
- La velocidad de transferencia de la Game Boy original es de 8 Kbit/s, es decir, 1 KB/s
- Game Boy Color puede alcanzar hasta 512 Kbit/s, es decir, 64 KB/s, en high speed mode
- Nintendo también lanzó un 4-Player Adapter para que hasta 4 Game Boy intercambiaran datos simultáneamente
- Se mantiene el SPI básico
- El adaptador opera como master e implementa una capa de comunicación adicional que el juego debe seguir
- Game Boy Color incluye un transceptor infrarrojo
- Está compuesto por un LED y un fototransistor
- Se usa para intercambio inalámbrico de datos en títulos como Pokémon Gold
- El sistema en sí no implementa el protocolo de comunicación
- Un único registro
RPcodifica la operación del sensor IR, el bit de transmisión y el último bit recibido - Nintendo ofrecía una implementación de referencia en el Game Boy Developer Manual oficial
Estructura de protección contra copias
- La consola no ejecuta el juego de inmediato, sino que primero realiza varias verificaciones para impedir la ejecución de cartuchos no autorizados y comprobar que el cartucho esté bien insertado
- Para pasar la verificación, el juego debía incluir en el encabezado de la ROM una copia del logotipo de Nintendo en forma de tiles
- Con esto, Nintendo podía aprovechar las leyes de derechos de autor y marcas registradas para controlar la distribución
- Más tarde, el caso Sega v. Accolade determinó que usar un logotipo protegido por derechos de autor para cumplir estos requisitos constituía uso justo, otorgando derechos a las empresas
- Los juegos también podían implementar medidas adicionales de protección contra copias internamente
- En bootlegs, normalmente verificaban tamaños de SRAM más grandes
- Durante el juego, realizaban checksums de la ROM en momentos aleatorios para detectar cambios en el código
1 comentarios
Opiniones en Hacker News
Lo que realmente destacó en el desarrollo original de Game Boy fue que en ese momento el equipo de Gunpei Yokoi enfrentaba mucho escepticismo.
Era algo como: “¿Por qué alguien jugaría en el autobús o en el baño? Sería incómodo. Mejor jugar en casa, sentado en el sofá frente a la TV con la familia o amigos, o ir a las maquinitas para la experiencia más nueva. ¿Quién querría cambiar pilas y ver solo unos pocos tonos de gris?”.
Su visión era tomar tecnología marchita y empaquetarla en un dispositivo fácil de usar con juegos simples y cortos, y creo que ese equipo prácticamente inició los juegos móviles.
Los niños de los años 70 ya jugaban con los juegos LED portátiles de Mattel en el autobús y en el baño; yo tenía al menos 6, quizá unas 8. El ejemplo más temprano es https://en.m.wikipedia.org/wiki/Mattel_Auto_Race, de 1976.
Los más populares eran juegos deportivos como futbol americano, béisbol y básquetbol, y sus reglas eran mucho más complejas que las de Auto Race: https://www.ebay.com/p/2255363696
A principios de los 80 también salieron muchos juegos LCD portátiles como Dungeons and Dragons: https://en.m.wikipedia.org/wiki/Dungeons_%26_Dragons_Compute... (1981)
“Mattel stated that the game immediately sold out.” No usaban cartuchos, pero en especial los juegos LCD eran baratos y pequeños, así que no era problema tener varios.
Hoy, para distinguirlos de los dispositivos portátiles de la generación Game Boy, se les llama “handhelds”, pero recuerdo que en esa época no se les decía así. El punto es que en los años 70 y principios de los 80 ya existía un mercado exitoso, y Nintendo no lo creó, sino que lo desarrolló combinando las ya exitosas consolas basadas en cartuchos con el mercado de juegos portátiles.
Vi que agregaron Game Boy Color, pero parece que no corrigieron la parte de que el tamaño de los cartuchos era de solo 1 MB. Algunos juegos de GBC llegaron hasta 4 MB.
Además, hay un juego de trenes de 8 MB que incluía videos cortos e imágenes en high color.
https://www.youtube.com/watch?v=S62dSVmLPU0
El tamaño de la ventana del cartucho era básicamente el mismo en ambos casos, 32 KB, y el cambio de bancos lo manejaba el cartucho, fuera de 4 MB o de 1 MB.
Game Boy es, por mucho, mi consola favorita de todas las que han salido. Ahora estoy haciendo un juego para Game Boy en lenguaje ensamblador; es un dungeon crawler de pinball.
El hardware es fácil de entender, y sus limitaciones te obligan a ser creativo.
Florent Gorges publicó un libro dedicado solo a Game Boy, aunque lamentablemente parece que no hay traducción al inglés. Lo compré en la edición en español, e incluye entrevistas exclusivas con sus creadores.
https://www.amazon.es/Historia-Nintendo-Vol-4-1989-1999-INCR...
Con el nivel actual de hardware democratizado, ¿sería posible comprar los componentes adecuados y una PCB cableada para recrear una Game Boy?
FunnyPlaying lanzó recientemente una versión basada en FPGA a un precio razonable: https://funnyplaying.com/products/fpgbc-kit?variant=40858870...
También hay motherboards nuevas para Game Boy Advance con componentes ya montados, pero hay que trasplantarles la CPU y la RAM.
Si quieres fidelidad de hardware, el costo de hacer un dispositivo único de tamaño portátil probablemente no caiga dentro de lo que se consideraría un rango de precios “democratizado”.
¿Para qué aprender la arquitectura de Game Boy, vas a hackear el planeta?