Un jeu Game Boy Advance écrit en Zig
(jonot.me)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 fonctionbuilddu fichierbuild.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 avecmemcpy, mais cela peut entrer en conflit avec cette « mémoire atypique » de la GBA.
1 commentaires
Avis Hacker News
volatiledans la documentation Zig ne règle pas le problème, il est recommandé de signaler un bug au compilateur.memcpy. On s’attendait à ce que cette optimisation ne soit effectuée qu’en espace utilisateur, et on pensait que l’option-nostdlibpermettrait de gérer cela automatiquement.