Jogo de Game Boy Advance feito em Zig
(jonot.me)Por que escrever um jogo de Game Boy Advance em Zig
-
O charme do Game Boy Advance
O Game Boy Advance tem uma CPU moderna (ARM de 32 bits, muitos registradores), mas usa um renderizador antigo baseado em tiles. Isso é semelhante à forma como o NES fazia nos anos 80. Como um dos últimos sistemas da Nintendo baseados em tiles, ele oferece vários recursos, como transformações afins, transparência e efeitos de sprite. -
Por que escolher a linguagem Zig
No início, o projeto de Game Boy Advance começou em C++, mas o primeiro jogo completo foi escrito em Zig. Zig ainda está em beta e, embora seja uma linguagem criada 15 anos depois do lançamento do Game Boy Advance, oferece recursos adequados para programação embarcada.
Toolchain
-
Linux e devKitPro
Ao usar Linux, houve dificuldades com gerenciamento de pacotes, e foi necessário usar o devKitPro ao criar cenas 3D para Nintendo DS. Ele inclui a toolchain GCC, bibliotecas e ferramentas de desenvolvimento. Há o inconveniente de precisar instalá-lo pelo gerenciador de pacotes do ArchLinux. -
Vantagens do Zig
Zig facilita a compilação cruzada, sem a necessidade de configurar um gerenciador de pacotes complexo. O sistema de build do Zig executa a funçãobuilddo arquivobuild.zigpara realizar a compilação. Isso simplifica o processo de build e reduz erros.
Packed Structs
- A importância de Packed Structs
O Game Boy Advance controla o hardware por meio de registradores, sem chamadas de API de alto nível. As packed structs do Zig otimizam o layout de memória, facilitando o controle do hardware. Esse é um recurso muito útil para programar no Game Boy Advance.
Comptime
- Execução de código em tempo de compilação
Zig oferece um recurso que permite executar código em tempo de compilação. Isso possibilita comprimir dados em tempo de compilação, sem precisar compactá-los em tempo de execução. Esse recurso do Zig facilita bastante a compressão de dados.
Biblioteca padrão
- A biblioteca padrão flexível do Zig
A biblioteca padrão do Zig oferece suporte a genéricos, e suas funções de alocação de memória podem receber um alocador como argumento. Isso permite usar estratégias personalizadas de alocação de memória. A biblioteca padrão do Zig também pode ser usada com flexibilidade em ambientes com restrições de hardware.
Problemas
-
Assembly inline
Zig oferece suporte a assembly inline, mas permite apenas uma saída. Isso se torna um problema quando é preciso retornar vários valores a partir de funções da BIOS do GBA. -
Código Thumb / código ARM
A CPU do Game Boy Advance oferece suporte aos modos ARM e Thumb. No Zig, não é possível especificar explicitamente os modos ARM e Thumb. -
Memória estranha
A memória de vídeo do Game Boy Advance não pode ser escrita em unidades de 8 bits, o que pode acabar bagunçando os gráficos. O Zig otimiza cópias de memória usandomemcpy, mas isso pode entrar em conflito com a "memória estranha" do GBA.
1 comentários
Comentários do Hacker News
volatilena documentação do Zig não resolver, recomendam reportar um bug ao compiladormemcpy. Esperava-se que essa otimização acontecesse apenas em espaço de usuário, e havia a expectativa de que a opção-nostdlibpudesse lidar com isso automaticamentepacked structsem C, foi sugerido o uso de bitfields. Foi fornecido um exemplo de código C válido