2 pontos por GN⁺ 2025-01-01 | 1 comentários | Compartilhar no WhatsApp

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ção build do arquivo build.zig para 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 usando memcpy, mas isso pode entrar em conflito com a "memória estranha" do GBA.

1 comentários

 
GN⁺ 2025-01-01
Comentários do Hacker News
  • É necessário um jeito de especificar o modo de acesso à memória para determinados intervalos de endereço. Se usar volatile na documentação do Zig não resolver, recomendam reportar um bug ao compilador
  • A razão para começar a usar Linux há 5 anos foi não saber como configurar Python no Windows. Entre 1997 e 2015, o Windows foi o sistema operacional dominante, e isso agravou a falta de conhecimento entre os mais jovens. No começo, o acesso à internet não era algo comum, e um sistema operacional sem ambiente de programação fazia as pessoas perderem oportunidades de programar
  • No Game Boy Advance, não é possível escrever na memória de vídeo em unidades de 8 bits, e fazer isso bagunça os gráficos. Funcionava no emulador, mas no hardware real foi preciso encontrar e corrigir o problema. Foi desenvolvido um toolchain de GBA para a linguagem Nim
  • Às vezes o compilador faz uma otimização substituindo a função de cópia de memória por memcpy. Esperava-se que essa otimização acontecesse apenas em espaço de usuário, e havia a expectativa de que a opção -nostdlib pudesse lidar com isso automaticamente
  • Como forma de usar packed structs em C, foi sugerido o uso de bitfields. Foi fornecido um exemplo de código C válido
  • É necessário um método para resolver o problema de memória no Game Boy Advance. Há curiosidade sobre se o LLVM oferece suporte a essa funcionalidade, e acredita-se que integrá-la ao Zig não seria difícil