Arquitetura do Game Boy / Color
(copetti.org)- A família Game Boy reúne CPU·gráficos·áudio·compatibilidade·proteção contra cópia em um único sistema portátil, combinando DMG-CPU SoC, PPU, APU, ROM de boot e Game Pak dentro de um orçamento de energia baixo
- A CPU é baseada no núcleo SM83 da Sharp e opera em cerca de 4,19 MHz; no Game Boy Color, a CPU CGB mantém a mesma linhagem, mas sobe para cerca de 8,38 MHz no modo de velocidade dupla
- Os gráficos usam uma LCD de 160×144 e uma PPU baseada em VRAM que combina tiles·plano de fundo·sprites·janela; o modelo Color amplia a expressividade com 16 KB de VRAM, paleta de 32.768 cores e DMA adicional
- O áudio fica a cargo de uma APU de 4 canais, e o Game Pak usa Memory Bank Controller para ultrapassar o espaço básico de endereçamento de 32 KB; também há suporte a comunicação externa via cabo Link e infravermelho no Color
- A ROM de boot verifica o logotipo da Nintendo e o checksum do cabeçalho da ROM antes de iniciar o jogo, e essa exigência do logotipo funciona como um mecanismo de controle de distribuição baseado em direitos autorais·marca registrada
Escopo da família Game Boy e direção de projeto
- A série Game Boy pode ser vista como uma versão portátil do NES, mas não é apenas uma miniaturização: trata-se de uma arquitetura com recursos próprios e um caminho próprio de expansão
- A marca Game Boy se estendeu por duas gerações
- Na 4ª geração, inclui o Game Boy monocromático e revisões como Game Boy Pocket e Light
- Na geração seguinte, inclui o Game Boy Color, lançado após o Virtual Boy
- O foco da análise está na estrutura básica do Game Boy monocromático e em como essa estrutura foi expandida no modelo Color
CPU e estrutura de memória
- Em vez de colocar vários chips genéricos na placa-mãe, a Nintendo escolheu um projeto de chip único com a CPU e os principais componentes integrados
- Esse SoC é chamado de DMG-CPU ou Sharp LR35902
- Foi fabricado pela Sharp Corporation e era vantajoso para atender às exigências da Nintendo em eficiência energética, proteção contra cópia e implementação de I/O adicional
- Como não era um chip disponível em catálogos de varejo, concorrentes tinham mais dificuldade para cloná-lo diretamente
-
Núcleo de CPU SM83
- O processador principal dentro do DMG-CPU é o Sharp SM83
- É uma mistura de Zilog Z80 com Intel 8080 e opera em cerca de 4,19 MHz
- O SM83 mantém apenas parte dos recursos do Z80 e do 8080
- Não há registradores
IXeIYdo Z80, nem instruçõesINeOUTdo 8080 - Como não é possível usar portas de I/O, os componentes precisam ser mapeados em memória
- Ele possui apenas o conjunto de registradores do Intel 8080, então há 7 registradores de uso geral
- Das instruções estendidas do Z80, apenas parte das instruções de manipulação de bits foi implementada
- Não há registradores
- A Sharp também adicionou novas instruções inexistentes no Z80 e no 8080
LDHfoi projetada para acessar os últimos 256 bytes do mapa de memória, a partir de$FF00- O tamanho da instrução diminui em 1 byte, o que pode torná-la ligeiramente mais rápida
-
Mudanças de CPU no Game Boy Color
- O Game Boy Color usa um novo SoC, a CPU CGB, mas o núcleo de CPU SM83 foi em grande parte mantido
- A maior exceção é a frequência de clock, que dobra para cerca de 8,38 MHz
- Manter o mesmo núcleo permite aos desenvolvedores reaproveitar conhecimento prévio de programação e também reduz o custo de redesenhar uma nova arquitetura e de implementar compatibilidade retroativa
- A CPU CGB oferece dois modos de operação
- Normal mode: o SM83 roda a cerca de 4,19 MHz
- Dual-speed mode: o SM83 roda a cerca de 8,38 MHz
- Essa escolha também deixou o custo de continuar usando uma tecnologia já envelhecida para o fim dos anos 1990
-
Espaço de endereçamento e RAM
- O SM83 mantém um barramento de dados de 8 bits e um barramento de endereços de 16 bits, podendo endereçar até 64 KB de memória
- O mapa de memória é composto por espaço do Game Pak, WRAM, HRAM, VRAM, I/O de joypad·áudio·gráficos·LCD e área de controle de interrupções
- A placa-mãe do Game Boy original trazia 8 KB de WRAM de uso geral, quatro vezes a capacidade do NES
- Dentro do SoC também há 127 B de HRAM
- É um pequeno espaço acessível mais rapidamente com a instrução
LDH - O barramento da HRAM em si não é tecnicamente mais rápido que o da WRAM, mas a CPU tem prioridade de acesso
- Isso é importante quando a CPU não consegue acessar memória externa durante operações de DMA
- É um pequeno espaço acessível mais rapidamente com a instrução
- O Game Boy Color aumenta a WRAM para 32 KB
- A capacidade de endereçamento da CPU permanece igual, então não é possível conectar toda a memória de uma vez
- O acesso aos 24 KB extras de WRAM usa bank switching
- Os últimos 4 KB do espaço original de 8 KB são trocados entre 7 bancos
- O registrador
SVBKé usado para selecionar o banco de WRAM
Gráficos: PPU, LCD e composição em camadas
- Os gráficos do Game Boy seguem uma estrutura em que a CPU realiza os cálculos e uma PPU separada dentro do SoC DMG-CPU renderiza a tela
- A LCD integrada oferece resolução de 160×144 pixels
- A LCD do Game Boy monocromático reflete apenas 4 níveis de cinza: branco, cinza-claro, cinza-escuro e preto
- Por causa do tom esverdeado da LCD, a imagem parece levemente verde
- Todos os Game Boy funcionam com 4 pilhas AA, ao contrário de consoles domésticos dependentes da frequência elétrica de cada região
- O clock da CPU e a taxa de atualização não mudam por região
- A taxa de atualização é de 59,7 Hz
-
VRAM e renderização baseada em tiles
- A PPU está conectada de forma exclusiva à 8 KB de VRAM e lê dali a maior parte dos dados necessários para renderizar
- Alguns dados que exigem acesso mais rápido ficam armazenados dentro da própria PPU
- O acesso da CPU à VRAM é arbitrado pela PPU, então o jogo precisa preencher corretamente essa região com os dados certos
- A unidade básica de renderização é o tile
- Um tile é um bitmap de 8×8 pixels
- Cada tile ocupa 16 bytes
- Eles ficam armazenados na área Tile set ou Tile pattern table da VRAM
- As cores são escolhidas por paleta entre os 4 níveis de cinza
- O Game Boy monocromático pode definir até 3 paletas, mas o uso delas é limitado conforme o tipo de camada renderizada
-
Plano de fundo, sprites e janela
- O quadro final é composto por três camadas sobrepostas
- A camada de plano de fundo tem 256×256 pixels, ou seja, um mapa de 32×32 tiles
- Na tela real, apenas 160×144 pixels ficam visíveis
- O jogo escolhe qual área do fundo mostrar e a desloca para criar o efeito de rolagem
- Apenas 1 paleta é usada na camada de fundo
- Sprites são tiles que podem se mover de forma independente
- Eles podem se sobrepor entre si ou ficar atrás do plano de fundo
- A prioridade de exibição é definida pelo atributo priority
- Há uma cor transparente adicional, então na prática só 3 níveis de cinza ficam visíveis
- É possível escolher uma entre 2 paletas dedicadas
- As definições de sprites são armazenadas na OAM (Object Attribute Memory) dentro da PPU
- O jogo normalmente chama OAM DMA para copiar dados da RAM ou da ROM para a OAM
- Enquanto o DMA está ativo, a CPU não consegue acessar memória externa
- Cada entrada da OAM inclui índice do tile, posição X-Y, paleta, prioridade e flags de espelhamento vertical·horizontal
- A renderização de sprites pela PPU tem limites
- Máximo de 10 por scanline
- Máximo de 40 por frame
- Se o limite for ultrapassado, alguns sprites deixam de ser desenhados
- A camada de janela é um mapa de 160×144 pixels que pode cobrir toda a tela
- É renderizada sobre o plano de fundo e os sprites
- Não faz rolagem
- Apenas o tile map restante pode ser atribuído à camada de janela
- Ela compartilha a mesma paleta do plano de fundo
- Não é transparente, então encobre completamente as camadas abaixo, mas pode ser usada parcialmente com efeitos raster baseados em temporização
- Os jogos costumam usar a camada de janela para contador de vidas, pontuação e informações persistentes na tela
-
Atualização de frames e efeitos raster
- A CPU não pode modificar tabelas enquanto a PPU está lendo a VRAM
- O sistema fornece interrupções que ocorrem quando a PPU está ociosa
- Horizontal Blank começa após o fim de uma scanline e permite ajustar a parte do frame que ainda não foi desenhada
- Vertical Blank começa depois que todas as scanlines terminam e permite atualizar os gráficos do próximo frame
- OAM search ocorre no início da scanline e, enquanto a PPU decide os sprites daquela linha, é possível atualizar áreas fora da OAM
- Graças à camada de janela e a interrupções adicionais, é possível alterar parte do frame antes que a tela inteira tenha sido desenhada
- Aplicando valores de rolagem diferentes a cada scanline, dá para criar um wobble effect em que cada linha se move em velocidade diferente
Expansões gráficas do Game Boy Color
- A PPU do Game Boy Color funciona como um superconjunto da PPU original e oferece dois modos de operação por compatibilidade
- CGB mode: fornece melhorias visuais para títulos de Game Boy Color
- DMG mode: é o modo tradicional com os recursos extras desativados
- A placa-mãe do Game Boy Color tem 16 KB de VRAM
- É o dobro da capacidade anterior
- Por causa dos limites de endereço da CPU, ela é organizada em 2 bancos de 8 KB
- O registrador
VBKé usado para alternar o banco de VRAM
- A PPU pode acessar os dois bancos de VRAM ao mesmo tempo
- O desenvolvedor preenche os bancos de VRAM com
VBK - Quando o tile map especifica em qual banco está o tile, a PPU cuida do resto
- O desenvolvedor preenche os bancos de VRAM com
- A VRAM adicional serve para armazenar o dobro de tiles, mais paletas, metadados expandidos de tiles e referências extras de paletas e efeitos
-
Cor e DMA adicional
- A nova PPU do Game Boy Color pode definir paletas dentro de um universo de 32.768 cores
- O desenvolvedor armazena até 16 paletas de cores na Palette Memory
- 8 para plano de fundo·janela e 8 para sprites
- Cada paleta codifica 4 cores
- Cada entrada é um valor de 16 bits, mas na prática só 15 bits são usados
- A Palette Memory não pode ser endereçada diretamente pela CPU; novos registradores atuam como buffer de escrita
- Tiles de fundo e de janela podem referenciar uma entre 8 paletas
- Tiles de sprite também podem referenciar 8 paletas, mas uma entrada continua reservada para a cor transparente, mantendo a restrição prática de 3 cores
- O tile set dobra de tamanho, permitindo armazenar o dobro de tiles na VRAM
- Os tile maps de plano de fundo·janela também foram expandidos para carregar mais metadados
- Tiles de fundo e janela podem ser invertidos verticalmente e horizontalmente, reduzindo a necessidade de armazenar gráficos redundantes na VRAM
- A CPU CGB inclui uma unidade DMA adicional para copiar dados para a VRAM
- É possível copiar do Game Pak ou da WRAM para a VRAM
- O General-purpose DMA pode transferir a qualquer momento, mas toma prioridade de acesso à memória durante a transferência e pode causar screen tearing
- O H-Blank DMA transfere apenas durante o H-Blank para evitar artefatos visuais, mas fica limitado a blocos de 16 bytes e para durante o scan da LCD
Áudio: APU de 4 canais
- O áudio é responsabilidade da APU (Audio Processing Unit), que segue o modelo de Programmable Sound Generator e oferece 4 canais no total
- A APU é um dos componentes que praticamente não mudou nas revisões do Game Boy
- Não pode ser acelerada como a CPU
- Alterar a velocidade do oscilador não melhora a qualidade do som; apenas muda a afinação
- Para ampliar recursos, seria necessário adicionar mais circuito, o que aumenta o custo
-
Configuração dos canais
- Há 2 canais de onda de pulso, usados principalmente para melodias e efeitos sonoros
- A largura do pulso pode ser alterada para oferecer 4 timbres
- O primeiro canal tem um sweep control dedicado
- Como o número de canais é limitado, a melodia pode ser interrompida quando efeitos sonoros tocam durante o jogo
- O terceiro canal suporta forma de onda personalizada
- Uma forma de onda composta por 32 amostras de 4 bits é armazenada numa wavetable
- É possível controlar volume e frequência
- Há 1 canal de ruído
- Ele é composto por formas de onda aleatórias que soam como ruído branco
- Em jogos, costuma ser usado para percussão ou efeitos de ambiente
- Oferece dois timbres, clean static e robotic static, além de ajuste de frequência
- Há 2 canais de onda de pulso, usados principalmente para melodias e efeitos sonoros
-
Mixer e pinos de áudio expandidos
- O mixer oferece saída estéreo, permitindo posicionar canais à esquerda e à direita
- O alto-falante embutido é mono, então o panning só é perceptível na saída para fones de ouvido
- O hardware do mixer também está ligado a pinos dedicados do cartucho
- Se o cartucho gerar som analógico com hardware adicional, pode fazer streaming de canais extras
- Jogos comerciais lançados no mercado não usaram esse recurso
- Esse recurso foi removido na era do Game Boy Advance
ROM de boot e modo de operação
- O Game Boy não inicia diretamente no jogo como o NES/Famicom; ele primeiro dá boot a partir de uma ROM interna de 256 bytes
- O procedimento básico de boot é o seguinte
- Ao ligar, a CPU começa a ler no endereço
0x0000 - A RAM e a APU são inicializadas
- O gráfico do logotipo da Nintendo presente na ROM do cartucho é copiado para a Display RAM e desenhado na parte superior da tela
- Se não houver cartucho ou ele estiver mal encaixado, o logotipo pode aparecer como tiles corrompidos
- O logotipo rola para baixo e o som icônico é reproduzido
- O logotipo da Nintendo do jogo é comparado com o logotipo armazenado na ROM do console
- É executado um checksum rápido no cabeçalho da ROM do cartucho
- Se a verificação falhar, o console trava
- A ROM do console é removida do mapa de memória
- A CPU inicia a execução do jogo
- Ao ligar, a CPU começa a ler no endereço
- O logotipo da Nintendo mostrado na tela não é apagado da VRAM, então o jogo pode aplicar animações ou efeitos de transição sobre ele
-
Mudanças de boot no Game Boy Color
- O tamanho da ROM do Game Boy Color aumenta para 2 KB
- A sequência de boot verifica se o jogo inserido é exclusivo de Game Boy ou de Game Boy Color
- Ela examina metadados específicos da ROM do cartucho e, com base nisso, configura os registradores que ativam o modo DMG ou CGB
- Se um jogo DMG estiver inserido, o programa de boot preenche a Palette RAM com uma paleta calculada
- Ele usa um algoritmo simples que depende dos metadados do jogo
- É assim que jogos monocromáticos aparecem colorizados no Game Boy Color
- O usuário pode mudar a paleta selecionada com combinações de botões durante o boot
- O logotipo da Nintendo também é copiado para a HRAM
- A etapa de checksum verifica apenas a metade frontal do logotipo na HRAM
Game Pak, desenvolvimento de jogos e comunicação externa
- Na época, jogos sensíveis a desempenho eram escritos principalmente em linguagem assembly, porque os compiladores de linguagens de alto nível ainda não tinham maturidade suficiente
- Jogos comerciais eram distribuídos em Game Pak, os cartuchos do Game Boy da Nintendo
- O espaço básico de armazenamento é de no máximo 32 KB por causa das limitações do espaço de endereçamento
- Com um Memory Bank Controller, isto é, um mapper, é possível criar jogos maiores
- Os maiores Game Pak lançados no mercado traziam 1 MB de ROM no Game Boy original e 8 MB de ROM no Game Boy Color
- Alguns Game Pak incluíam relógio em tempo real, SRAM adicional e bateria externa para retenção de save
-
Tipos de cartucho na era Color
- Com a adição dos modos de operação do Game Boy Color, os jogos passaram a se dividir em três tipos
- Game Boy: totalmente compatível com todos os modelos de Game Boy e sempre roda em modo DMG
- Game Boy Color enhanced: compatível com os modelos monocromáticos, mas com melhorias visuais em modo CGB no Game Boy Color
- Game Boy Color exclusive: compatível apenas com o Game Boy Color e otimizado para aproveitar esse hardware
- Os três tipos tinham cores oficiais para facilitar a distinção
- Alguns jogos, como Pokémon e Donkey Kong, usavam designs diferentes
- Com a adição dos modos de operação do Game Boy Color, os jogos passaram a se dividir em três tipos
-
Cabo Link e infravermelho
- Os jogos de Game Boy puderam, pela primeira vez, se comunicar com hardware externo por meio do cabo Game Boy Link, permitindo multiplayer e uso de acessórios
- O cabo Link se conecta ao subconector de 6 pinos do console, e a interface usa o protocolo SPI (Serial Peripheral Interface)
- Um Game Boy atua como master gerando o sinal de clock, e o outro vira slave
- Em cada transmissão, master e slave trocam 1 pacote de 8 bits
- A velocidade de transmissão do Game Boy original é de 8 Kbit/s, ou seja, 1 KB/s
- O Game Boy Color pode chegar a 512 Kbit/s, ou 64 KB/s, em modo high speed
- A Nintendo também lançou o 4-Player Adapter para que até 4 Game Boy trocassem dados ao mesmo tempo
- O SPI básico é mantido
- O adaptador atua como master e implementa uma camada extra de comunicação que o jogo precisa seguir
- O Game Boy Color inclui um transceptor infravermelho
- Ele é composto por LED e fototransistor
- Foi usado para troca sem fio de dados em títulos como Pokémon Gold
- O sistema em si não implementa um protocolo de comunicação
- Um único registrador,
RP, codifica o funcionamento do sensor IR, o bit transmitido e o último bit recebido - A Nintendo forneceu uma implementação de referência no Game Boy Developer Manual oficial
Estrutura de proteção contra cópia
- O console não executa o jogo imediatamente: primeiro realiza várias verificações para impedir a execução de cartuchos não autorizados e também confirmar se o cartucho foi inserido corretamente
- Para passar na verificação, o jogo precisava incluir no cabeçalho da ROM uma cópia em tiles do logotipo da Nintendo
- Com isso, a Nintendo podia usar leis de direitos autorais e marca registrada como mecanismo de controle de distribuição
- Mais tarde, o caso Sega v. Accolade entendeu que usar um logotipo protegido por copyright para satisfazer esse tipo de exigência constituía uso justo, concedendo esse direito às empresas
- O próprio jogo também podia implementar medidas adicionais de proteção contra cópia
- Em bootlegs, era comum verificar tamanhos maiores de SRAM
- Checksums da ROM podiam ser executados em momentos aleatórios durante a jogabilidade para detectar alterações no código
1 comentários
Comentários do Hacker News
O que foi realmente extraordinário no desenvolvimento original do Game Boy é que a equipe de Gunpei Yokoi enfrentava uma enorme desconfiança na época
Era algo na linha de: “por que alguém jogaria no ônibus ou no banheiro, isso seria desconfortável. Em casa, basta sentar no sofá em frente à TV com a família ou amigos, ou então ter a experiência mais avançada no fliperama. Quem vai querer ficar trocando pilhas e olhando só para alguns tons de cinza?”
A visão deles era pegar tecnologia madura e empacotá-la em um aparelho fácil de usar com jogos simples e curtos, e dá para dizer que essa equipe praticamente deu início aos jogos mobile
As crianças dos anos 1970 já jogavam os portáteis de LED da Mattel no ônibus e no banheiro, e eu tinha pelo menos 6, talvez até uns 8. Um dos exemplos mais antigos é de 1976: https://en.m.wikipedia.org/wiki/Mattel_Auto_Race
Mais populares ainda eram os jogos de esporte, como futebol americano, beisebol e basquete, e as regras eram bem mais complexas do que as de Auto Race: https://www.ebay.com/p/2255363696
No começo dos anos 1980, também saíram muitos jogos portáteis de LCD como Dungeons and Dragons: https://en.m.wikipedia.org/wiki/Dungeons_%26_Dragons_Compute... (1981)
“Mattel stated that the game immediately sold out.” Não usavam cartuchos, mas os jogos de LCD em especial eram baratos e pequenos, então não era pesado ter vários
Hoje em dia, para diferenciar essas coisas dos portáteis da geração Game Boy, chamam isso de “handhelds”, mas não lembro de isso ser chamado assim na época. O ponto é que já existia um mercado bem-sucedido nos anos 1970 e no começo dos anos 1980, e a Nintendo não o criou; ela evoluiu a ideia ao combinar o já bem-sucedido mercado de consoles baseados em cartucho com o de jogos portáteis
Vi que adicionaram o Game Boy Color, mas parece que não corrigiram a parte que diz que o tamanho do cartucho era de apenas 1MB. Alguns jogos de GBC chegavam a 4MB
Além disso, existe um jogo de trem com vídeos curtos e imagens high color que usa 8MB
https://www.youtube.com/watch?v=S62dSVmLPU0
O tamanho da janela no cartucho é basicamente o mesmo nos dois casos, 32KB, e tanto em 4MB quanto em 1MB a troca de bancos é feita no lado do cartucho
O Game Boy é, de longe, meu console favorito de todos os tempos. Estou fazendo um jogo de Game Boy em assembly agora, um dungeon crawler de pinball
É fácil entender o hardware, e as limitações obrigam você a ser criativo
Florent Gorges lançou um livro só sobre o Game Boy, mas infelizmente não parece haver tradução para o inglês. Comprei a edição em espanhol, e ela traz entrevistas exclusivas com os criadores
https://www.amazon.es/Historia-Nintendo-Vol-4-1989-1999-INCR...
Com o nível atual de democratização do hardware, daria para recriar um Game Boy comprando componentes adequados e uma PCB já roteada?
A FunnyPlaying lançou recentemente uma versão baseada em FPGA com preço razoável: https://funnyplaying.com/products/fpgbc-kit?variant=40858870...
Também existe uma placa-mãe nova para Game Boy Advance com os componentes montados, mas nela você precisa transplantar a CPU e a RAM
Se você quer fidelidade de hardware, o custo para fazer um único aparelho do tamanho de algo portátil provavelmente já não entra mais na faixa de preço “democratizada”
Para que aprender a arquitetura do Game Boy, vai hackear a Terra?