Skip to main content

Command Palette

Search for a command to run...

Criando Um Game Para Nintendo 64

Updated
4 min read
Criando Um Game Para Nintendo 64

Aprendi hoje com go que, é possivel escrever código embarcado em Go, isso nem é algo super novo, existe um projeto chamado TinyGo que permite compilar código Go para microcontroladores, porém o que é novo é que podemos escrever código embarcado para arquitetura de 64 bits, o que significa que entre outras coisas, podemos escrever código go que roda em um Nintendo 64, então porque não criar uma rom de 64 em Go?

Final de semana passado eu achei uma excelente newsletter chamada Golang Weekly, e nela tinha um excelente artigo de Timur Celik sobre o embeded Go e uma feature recem mergeada que ele desenvolveu em um projeto chamado Embeded Go adicionando o suporte ao Nintendo 64. No artigo ele explica como criar sua própria rom, então decidi tentar. Acabei passando o final de semana todo criando uma pequena rom de demonstração. O processo foi relativamente complexo dado o ambiente que estou, o Embeded Go aparentemente não gosta da arquitetura arm do mac, ao menos pra ser usado como base pra compilar para outras arquiteturas, então enfrentei alguns obstaculos.

O Ambiente de Build

Comecei a seguir o tutorial e nada de conseguir instalar o toolchain necessário pra compilar a rom, muito chat GPT e pesquisa depois, decidi usar o docker pra isso, tentei começar com uma imagem leve, porém acabou dando mais dor de cabeça que alegria, então decidi usar a imagem do ubuntu mesmo, afinal, uma vez que vamos usa-la somente para compilar a rom, não seria tão complexo assim ter uma imagem um pouco inchada.

Criei então um Dockerfile que instala todas as dependências e deixa o ambiente prontinho para compilar a rom e também para converter os arquivos desprites e audio que podemos usar na rom.

Tentando facilitar ainda mais, criei um Makefile com todos os comando pra compilar a rom e converter arquivos de sprite, assim fica mais simples e teria um ambiente de build mais rapido e fácil de usar.

O Ambiente de Dev

Eu estava decidido a ter o auxilio incondicional do meu LSP, e dado que algumas das dependências não funcionaram corretamente no mac, ao menos eu não consegui faze-las funcionar, eu precisava tomar uma decisão, ou instalar meu setup de nvim dentro do container e codar lá dentro, o que eu queria evitar pois parece uma solução muito rustica, ou ir pela segunda opção, usar o LSP remotamente, ele rodaria no container e o meu neovim seria o cliente, porém, mais uma vez, não queria alterar a config do meu nvim inteiro, queria que o LSP só fosse remoto no diretório do projeto, e realmente, se alguem conseguir fazer isso funcionar de forma simples algum dia, eu seria grato de saber como.

No final das contas, pro tamanho do projeto decidi abrir mão de ter o LSP funcionando 100% e decidi apenas ignorar o erro da dependência que não funcionava no mac, afinal o LSP ainda me ajudaria com o código go em si, porém se alguém for desenvolver mais do que uma rom de demo, acho que seria pertinente ter um ambiente mais robusto pra desenvolver.

O Desenvolvimento

Foi minha primeira experiência escrevendo código Go embarcado e achei bem interessante, o código é bem simples e o projeto de exemplo é bem explicativo, no final tentei dar uma limpada no código de exemplo tentando deixa-lo mais simples e claro pra que eu mesmo pudesse entender o que estava acontecendo, pra finalizar decidi adicionar minha própria sprite pra deixar as coisas mais divertidas.

Um dos maiores percalsos que tive foi entender que o sistema de arquivos no Embeded Go precisa de comentários especiais que são flags para o compilador, no caso o seguinte comentário comentário

var (
    //go:embed gopher-anim.CI8
    _storageFiles embed.FS
    storageFiles  cartfs.FS = cartfs.Embed(_storageFiles)
)

Me fez perder ao menos um dia de trabalho, sem ele, o compilador não insere o arquivo de sprite no sistema de arquivos do projeto, o que é bem frustrante e difícil de debugar, então fica a dica pra quem for fazer algo parecido, ache uma forma mais simples de debugar as coisas.

Resumo da Opera

Foi bem divertido experimentar com Go embarcado, e apesar de ter sido um processo um tanto quanto trabalhoso, o resultado final valeu a pena, consegui criar uma rom simples que roda em um emulador de Nintendo 64, e o código está disponível no meu repositório do github, é um projeto simples mais que ajuda a ter um ponto de partida, espero criar mais roms no futuro, quem sabe recriando algum jogo clássico em Go.

Além do conhecimento adquirido é sempre bom lembrar que é muito importante se divertir com programação e tecnologia em geral, e projetos como esse são uma ótima forma de nos relembrar o porque amamos isso.

J

Muito bom! Se divertir com programação é importante mesmo pra gente não se esquecer do pq gosta desse universo de 'codigagens'!

Aprendi Hoje

Part 1 of 2

Um universo de pequenas coisas que aprendo no dia a dia, em estudos e desenvolvendo código das mais diversas formas

Up next

Overflow silencioso em Go

Short