Executando verificação de segurança...
18

Me aventurando no desenvolvimento Homebrew de jogos para GameBoy Advance — Parte 1

Imagem ilustrativa do GameBoy Advance.

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.

Captura de tela da documentação de instalação do DevkitPro.

Estou utilizando o MacOS e ao clicar no link do pkg installer eu fui redirecionado para a seguinte página do Github:

Captura de tela de uma página do Github que ensina como instalar o PacMan.

Então rodei o comando demonstrado para meu sistema operacional:

Captura de tela do terminal rodando os comandos de instalação do PacMan para MacOs.

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:

Captura de tela do terminal rodando os comandos para instalação do grupo gba-dev.

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:

Captura de tela do terminal selecionando todas as ferramentas do gba-dev.

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.

Captura de tela do Visual Studio Code mostrando a página da extensão C/C++ Extension Pack.

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:

Captura de tela do Visual Studio Code mostrando as mensagens de erro por não encontrar as bibliotecas utilizadas no projeto.

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".

Captura de tela do Visual Studio Code mostrando onde está a lâmpada para alterar o includePath.

Você verá uma tela semelhante a essa:

Captura de tela do Visual Studio Code mostrando a página de configuração do includePath.

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:

Captura de tela do Visual Studio Code mostrando a página de configuração do includePath com o diretório que deve ser adicionado.

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:

Captura de Tela do mGBA mostrando nossa primeira rom em execução.

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:

Rom do Projeto rodando em um Nintendo DS ML.

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)!!!

Carregando publicação patrocinada...
2

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

1

Cara, que sensacional, uma engine em Lua é uma ideia incrível por ser uma linguagem mais simples. Ainda estou no começo do meu aprendizado de GBA, por hora, lendo o guia Tonc eu já consegui setar algum vídeo mode (no caso o vídeo mode 3) na MEM_IO e setar algumas cores na VRAM, confesso que fiquei feliz de mais.

Saberia me tirar uma dúvida? Na segunda parte desse serie eu gostaria de trazer algumas informações sobre o hardware do GBA e acabei me deparando com uma informação que eu fiquei perdido, nessa documentação diz que a IO RAM é uma porta dupla de 32 bits, já no guia tonc diz ser apenas de 16 bits, confesso que não entendi.

1

É dificil saber o correto nesses casos, teria que encontrar uma terceira especificação que corrige, mas também não importante tanto para usos mais basicos, inclusive se pode gravar em 32bits nas variaveis que o compilador da um jeito para você isso.

1

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

1

Fico feliz que tenha gostado, eu também achava que teria que aprender Assembly, o fato de poder fazer em C vai facilitar muito. Assim que eu aprender um pouco mais, trarei mais artigos. De uma olhada na documentação Tonc também, ela é muito completa.