Me aventurando no desenvolvimento Homebrew de jogos para GameBoy Advance — Parte 1
Em 2004 eu vislumbrei o GameBoy Advance (GBA) pela primeira vez, meu tio possuía um e vez ou outra ele me deixava jogar. Passou-se um tempo e meu primo ganhou um GameBoy Advance SP e sempre que eu tinha oportunidade, jogava por horas. Desde então, sempre tive um sonho tímido e acanhando de desenvolver jogos para esse console.
Um dia eu me deparei com um artigo do Bruno Macabeus sobre um projeto onde ele estava fazendo engenharia reversa de um jogo de GBA e lá eu fui apresentado a documentação TONC, então iniciei meus estudos, a quantidade de coisas que tenho que aprender é absurdamente grande, todavia, estou muito empolgado com o projeto e por isso resolvi começar essa sequência de artigos.
O primeiro grande desafio que superei e quero compartilhar com vocês é a instalação do DevkitPro (conjunto de ferramentas para desenvolvimento e compilação de rom's GBA) e a configuração do ambiente para compilação do primeiro Olá, mundo.
1. Instalando as ferramentas
Já de início, quero fazer uma ressalva, infelizmente não tenho nenhuma máquina com Windows, então não poderei mostrar como instalar as ferramentas do DevkitPro nele, mas creio ser até mais simples que os passos a seguir para outros sistemas. Dito isso, a instalação que irei demonstrar funciona para sistemas baseados em Unix (Distribuições Linux e MacOS).
Acesse a documentação do DevkitPro por esse link e localize o arquivo de instalação do PacMan disponível para seu sistema operacional.
Estou utilizando o MacOS e ao clicar no link do pkg installer eu fui redirecionado para a seguinte página do Github:
Então rodei o comando demonstrado para meu sistema operacional:
Agora que o PacMan está instalando, nós precisamos executá-lo para baixar o Devkit que iremos usar em nossos projetos. Isso acontece porque o DevkitPro fornece uma ampla gama de ferramentas, que inclui SDK’s para PSP, GBA, DS, 3DS, Wii, entre outros. No nosso caso, vamos baixar apenas um grupo predefinido de ferramentas chamado gba-dev. Rode o seguinte comando no terminal para instalar:
sudo dkp-pacman -S gba-dev
Se tudo estiver certo, você verá a seguinte tela:
Você pode optar por quais ferramentas instalar, basta selecionar uma das opções. Eu escolhi baixar tudo, incluindo a documentação de exemplo, para isso apenas teclei enter, deixando a predefinição all selecionada:
Se você usa o Visual Studio Code, recomendo você instalar a seguinte extensão: C/C++ Extension Pack. Essa extensão trás uma gama de ferramentas para trabalhar com a linguagem C que vamos usar para desenvolver nossas rom's.
Com todas as ferramentas instaladas, podemos finalmente configurar o ambiente para rodarmos nosso primeiro "olá, mundo".
2. Configurando o ambiente
A configuração do ambiente é relativamente simples, tudo que temos que fazer é configurar algumas variáveis de ambiente no arquivo .bashrc ou .zshrc, dependendo de qual você usa, adicione essas linhas no final:
export DEVKITPRO=/opt/devkitpro
export DEVKITARM=$DEVKITPRO/devkitARM
Feito isso, podemos começar a estruturar nosso projeto.
3. Estruturando o projeto
Confesso que fiquei perdido por um bom tempo nessa parte, eu não fazia ideia de quais arquivos eram necessários para criação do projeto, mas a solução estava na minha cara o tempo todo.
No terminal, ou em um gestor de arquivos, acesse o seguinte diretório:
cd /opt/devkitpro/examples/gba/template/
Basta copiar os arquivos desse diretório para a pasta onde você vai desenvolver seu jogo. Esse template possui um arquivo MakeFile para compilação de códigos C que devem estar em uma pasta chamada source. Na pasta source há um arquivo chamado template.c, temos que renomear esse arquivo para main.c que é o arquivo de entrada que o MakeFile busca para compilar.
Abrindo nosso projeto recém criado em uma IDE, teremos a seguinte visão:
No canto superior esquerdo há uma serie de mensagens de erro informando que não conseguiu localizar as bibliotecas. Isso acontece porque o VSCode está buscando pelas bibliotecas do compilador C padrão instalado em minha máquina, e não no compilador do DevkitPro.
Na própria mensagem de erro das bibliotecas não encontradas, vamos passar o mouse por cima e clicar em uma lâmpada para selecionarmos a opção editar configuração de "includePath".
Você verá uma tela semelhante a essa:
Descendo um pouco, vamos chegar na seção incluir caminho. Por fim, adicione o seguinte diretório: "/opt/devkitpro/**", sem as aspas, ficando parecido com a imagem abaixo:
Com isso, nossa IDE agora sabe localizar as bibliotecas fornecidas pelo DevkitPro e os erros somem.
Agora, eu vou apenas alterar o Hello World no código C fornecido no template para um "Ola, mundo!!!" sem acento, deixando nosso código assim:
#include <gba_console.h>
#include <gba_video.h>
#include <gba_interrupt.h>
#include <gba_systemcalls.h>
#include <gba_input.h>
#include <stdio.h>
#include <stdlib.h>
//---------------------------------------------------------------------------------
// Program entry point
//---------------------------------------------------------------------------------
int main(void) {
//---------------------------------------------------------------------------------
// the vblank interrupt must be enabled for VBlankIntrWait() to work
// since the default dispatcher handles the bios flags no vblank handler
// is required
irqInit();
irqEnable(IRQ_VBLANK);
consoleDemoInit();
// ansi escape sequence to set print co-ordinates
// /x1b[line;columnH
iprintf("\x1b[10;10HOla, mundo!!!\n");
while (1) {
VBlankIntrWait();
}
}
Finalmente, agora é só compilar e testar.
4. Enfim, compilando
Para compilar, tudo que temos que fazer é abrir um terminal na raiz de nosso projeto e rodar o seguinte comando:
make
A parte mais simples do projeto, isso graças ao MakeFile disponibilizado no template. Agora você já deve ter notado que foi gerado 2 arquivos no seu projeto, um com a extensão .elf e outro .gba, vamos finalmente testar.
5. Rodando em um emulador
Você pode optar por abrir em um emulador de sua escolha (vou usar o mGBA) o arquivo .elf ou .gba e teremos o seguinte resultado:
Mal posso expressar a felicidade ao ver essa tela azul com esse texto.
6. Rodando em um console (Satisfação)
Infelizmente eu não tenho um GameBoy para poder testar, mas eu comprei um Nintendo DS ML (DS Fat com nova carcaça) e ele é retrocompatível com o GBA, ainda sim, lamentavelmente, o jogo vai acabar sendo emulado e não executado nativamente, pelo fato de eu não possuir no momento um everdrive para poder rodar os jogos de GameBoy diretamente pela entrada de cartucho dedicada a ele e que faz conexão com a CPU nativa do GBA. De qualquer forma, ainda foi o mais próximo que eu consegui de rodar nossa primeira rom em um console:
Devo dizer, fiquei muito contente por ter chegado na tela acima, pode não parecer, mas foi muitos dias quebrando a cabeça para instalar essas ferramentas e chegar nesse resultado.
O próximo passo
Pode parecer loucura, mas eu particularmente gosto muito de ver um "olá, mundo!!!" na tela, mesmo que eu não esteja entendo nada, isso me motiva a continuar em frente para de fato entender o que está acontecendo e, agora que rodei algo, o próxima passo é aprender sobre cada componente do GBA para trazer na parte 2 desse projeto.
Então, obrigado por ter lido até aqui, até mais (por hora)!!!
Acabei caindo aqui de paraquedas, eu tava justamente procurando por VBlankIntrWait que não funciona direito para mim, estou fazendo sicronização vertical atravez do endereço 0x04000006
só queria testar com interrupção se fica mais estavél, estou fazendo uma game engine em Lua pro GBA hehe
Muito daora, sempre tive curiosidade em desenvolver algo para gba. Mas pensava eu que seria em Assembly os códigos, interessante isso dos códigos serem em C. Vou dar uma olhada depois na documentação desse gba-dev. E vai atualizando sobre seu projeto, achei muito