Como criar um emulador de NES - Arquitetura do NES
Antes de começar a programar um emulador, precisamos entender como o NES funciona internamente.
Quando comecei a estudar emulação, percebi que um emulador não é apenas um programa que abre uma ROM e executa um jogo. Na verdade, ele precisa reproduzir o comportamento do hardware original da forma mais fiel possível.
Por isso, antes de escrever qualquer linha de código, precisamos conhecer os principais componentes do console e entender como eles se comunicam.
https://miro.medium.com/v2/resize:fit:720/format:webp/0*jSXmYdQThpXwSwaW.png
Uma forma simples de visualizar o console é a seguinte:
CPU → RAM → PPU → Tela
Mas na prática existem vários componentes trabalhando juntos.
O NES possui:
- CPU (processador)
- RAM (memória)
- PPU (processador gráfico)
- APU (processador de áudio)
- Controles
- Cartucho (ROM)
Todos eles trocam informações constantemente para que o jogo funcione corretamente.
Como os componentes se comunicam
O cartucho contém o jogo. A CPU lê instruções armazenadas nele e executa o código.
Durante a execução, a CPU utiliza a RAM para armazenar dados temporários, como posição dos personagens, pontuação, vidas e outras informações necessárias naquele momento.
Quando precisa atualizar a tela, a CPU envia dados para a PPU, que é responsável por gerar os gráficos.
Da mesma forma, quando um som precisa ser reproduzido, a CPU se comunica com a APU.
Tudo isso acontece dezenas de vezes por segundo.
CPU: o cérebro do console
https://miro.medium.com/v2/resize:fit:720/format:webp/0*Uc1kPwPCHJipZa6Y.jpg
A CPU do NES é uma versão modificada do MOS 6502 chamada Ricoh 2A03.
Ela é responsável por executar todas as instruções do jogo.
Imagine que a CPU seja o gerente de uma empresa.
Ela não desenha gráficos, não produz sons e não armazena grandes quantidades de dados, mas coordena todos os componentes para que trabalhem juntos.
Enquanto o jogo está rodando, a CPU executa continuamente o seguinte ciclo:
- Busca uma instrução.
- Interpreta a instrução.
- Executa a ação.
- Busca a próxima instrução.
Esse processo acontece milhares de vezes por segundo.
RAM: memória temporária
https://miro.medium.com/v2/resize:fit:720/format:webp/0*SYuo0InSFeiEMGuV.png
A RAM funciona como uma área de trabalho temporária.
Ela armazena informações que podem mudar durante a execução do jogo.
Por exemplo:
Posição do jogador.
Posição dos inimigos.
Pontuação.
Estado atual do jogo.
Quando o console é desligado, essas informações são perdidas.
Por isso a RAM é chamada de memória volátil.
PPU: responsável pelos gráficos
https://miro.medium.com/v2/resize:fit:720/format:webp/0*D59HJSOj3XOeQZR3.png
A PPU (Picture Processing Unit) é o chip responsável pelos gráficos.
Muitas pessoas imaginam que a CPU desenha tudo na tela, mas isso não acontece.
A CPU apenas envia informações.
Quem realmente monta a imagem exibida na televisão é a PPU.
Ela trabalha com conceitos como:
- Tiles
- Sprites
- Paletas de cores
- Backgrounds
Esses elementos são combinados para formar cada quadro exibido na tela.
Cartucho e ROM
https://miro.medium.com/v2/resize:fit:640/format:webp/1*MnBiitm5KvxNXnMEnE4AVw.png
O cartucho contém a ROM do jogo.
A ROM é uma memória somente leitura que armazena:
Código do jogo.
Gráficos.
Sons.
Mapas.
Dados diversos.
Quando carregamos uma ROM em um emulador, estamos carregando uma cópia digital desses dados.
Como tudo funciona junto
Imagine que o jogador aperte o botão para mover o personagem para a direita.
O processo acontece mais ou menos assim:
1 - O controle envia o comando.
2 - A CPU lê o estado do controle.
3 - A CPU atualiza a posição do personagem na RAM.
4 - A CPU informa à PPU que a tela precisa ser atualizada.
5 - A PPU gera um novo quadro.
6 - A imagem aparece na televisão.
Todo esse processo acontece aproximadamente 60 vezes por segundo.
Conclusão
Agora que entendemos a arquitetura básica do NES, já temos uma visão geral de como o console funciona internamente.
Nos próximos capítulos vamos explorar cada componente individualmente e entender como reproduzir seu comportamento dentro de um emulador.