2 points par GN⁺ 2025-01-01 | 1 commentaires | Partager sur WhatsApp

Pourquoi écrire un jeu Game Boy Advance en Zig

  • Le charme de la Game Boy Advance
    La Game Boy Advance dispose d’un CPU moderne (ARM 32 bits, avec de nombreux registres), mais utilise un ancien moteur de rendu basé sur des tuiles. C’est similaire à la manière dont la NES fonctionnait dans les années 80. C’est aussi l’un des derniers systèmes de Nintendo fondés sur les tuiles, avec diverses fonctionnalités comme les transformations affines, la transparence et les effets de sprites.

  • Pourquoi avoir choisi le langage Zig
    Au départ, le projet Game Boy Advance avait commencé en C++, mais le premier jeu complet a été écrit en Zig. Zig est encore en bêta, et bien qu’il soit apparu 15 ans après la sortie de la Game Boy Advance, il offre des fonctionnalités adaptées à la programmation embarquée.

Toolchain

  • Linux et devKitPro
    En utilisant Linux, l’auteur a rencontré des difficultés liées à la gestion des paquets et a dû utiliser devKitPro pour créer des scènes 3D sur Nintendo DS. Celui-ci comprend une toolchain GCC, des bibliothèques et des outils de développement. Son installation via le gestionnaire de paquets d’ArchLinux ajoute une contrainte supplémentaire.

  • Les avantages de Zig
    Zig facilite la compilation croisée et évite d’avoir à configurer un gestionnaire de paquets complexe. Le système de build de Zig lance la compilation en exécutant la fonction build du fichier build.zig. Cela simplifie le processus de build et réduit les erreurs.

Packed Structs

  • L’importance des packed structs
    La Game Boy Advance contrôle le matériel via des registres, sans appels à une API de haut niveau. Les packed structs de Zig optimisent la disposition mémoire et facilitent ce contrôle matériel. C’est une fonctionnalité très utile pour programmer sur Game Boy Advance.

Comptime

  • Exécution de code à la compilation
    Zig permet d’exécuter du code au moment de la compilation. Cela permet par exemple de compresser des données à la compilation plutôt qu’au runtime. Cette fonctionnalité de Zig facilite la compression des données.

Bibliothèque standard

  • La bibliothèque standard flexible de Zig
    La bibliothèque standard de Zig prend en charge les génériques et permet de passer un allocateur en argument aux fonctions d’allocation mémoire. Cela rend possible l’utilisation de stratégies d’allocation personnalisées. La bibliothèque standard de Zig reste ainsi flexible, même dans des environnements soumis à des contraintes matérielles.

Problèmes

  • Assembleur inline
    Zig prend en charge l’assembleur inline, mais avec une seule valeur de sortie possible. Cela pose problème lorsque les fonctions BIOS de la GBA doivent renvoyer plusieurs valeurs.

  • Code Thumb / code ARM
    Le CPU de la Game Boy Advance prend en charge les modes ARM et Thumb. Dans Zig, il n’est pas possible de spécifier explicitement le mode ARM ou Thumb.

  • Mémoire atypique
    La mémoire vidéo de la Game Boy Advance ne peut pas être écrite par unités de 8 bits, ce qui peut provoquer des graphismes corrompus. Zig optimise les copies mémoire avec memcpy, mais cela peut entrer en conflit avec cette « mémoire atypique » de la GBA.

1 commentaires

 
GN⁺ 2025-01-01
Avis Hacker News
  • Il faut un moyen de spécifier la manière d’accéder à la mémoire pour certaines plages d’adresses. Si l’utilisation de volatile dans la documentation Zig ne règle pas le problème, il est recommandé de signaler un bug au compilateur.
  • La raison pour laquelle quelqu’un a commencé à utiliser Linux il y a 5 ans était qu’il ne savait pas comment configurer Python sur Windows. Entre 1997 et 2015, Windows était le système d’exploitation dominant, ce qui a aggravé le manque de connaissances chez les plus jeunes. Au début, l’accès à Internet n’était pas généralisé, et un système d’exploitation sans environnement de programmation faisait manquer des occasions d’apprendre à programmer.
  • Sur Game Boy Advance, on ne peut pas écrire dans la mémoire vidéo en unités de 8 bits, sinon les graphismes deviennent inutilisables. Cela fonctionnait dans l’émulateur, mais il a fallu découvrir et corriger le problème sur le vrai matériel. Une toolchain GBA a été développée pour le langage Nim.
  • Il arrive que le compilateur applique une optimisation qui remplace une fonction de copie mémoire par memcpy. On s’attendait à ce que cette optimisation ne soit effectuée qu’en espace utilisateur, et on pensait que l’option -nostdlib permettrait de gérer cela automatiquement.
  • Comme méthode pour utiliser des packed structs en C, l’emploi de champs de bits est proposé. Un exemple de code C valide est fourni.
  • Il faut une méthode pour résoudre le problème de mémoire de la Game Boy Advance. On se demande si LLVM prend en charge cette fonctionnalité, et on pense qu’il ne serait pas difficile de l’intégrer à Zig.