2 Punkte von GN⁺ 2025-01-01 | 1 Kommentare | Auf WhatsApp teilen

Warum ein Game-Boy-Advance-Spiel in Zig schreiben?

  • Der Reiz des Game Boy Advance
    Der Game Boy Advance besitzt eine moderne CPU (32-Bit-ARM, viele Register), verwendet aber einen alten tile-basierten Renderer. Das ähnelt der Methode, die das NES in den 80er-Jahren nutzte. Als eines der letzten tile-basierten Systeme von Nintendo bietet er verschiedene Funktionen wie affine Transformationen, Transparenz, Sprite-Effekte und mehr.

  • Warum die Sprache Zig gewählt wurde
    Anfangs begann das Game-Boy-Advance-Projekt in C++, doch das erste vollständige Spiel wurde in Zig geschrieben. Zig ist noch in der Beta und wurde erst 15 Jahre nach dem Erscheinen des Game Boy Advance entwickelt, bietet aber dennoch Funktionen, die sich gut für Embedded-Programmierung eignen.

Toolchain

  • Linux und devKitPro
    Bei der Nutzung von Linux gab es Schwierigkeiten mit der Paketverwaltung, und beim Erstellen von 3D-Szenen für den Nintendo DS musste devKitPro verwendet werden. Es enthält die GCC-Toolchain, Bibliotheken und Entwicklungswerkzeuge. Umständlich ist, dass es über den Paketmanager von ArchLinux installiert werden muss.

  • Vorteile von Zig
    Zig erleichtert Cross-Compilation, ohne dass ein komplexer Paketmanager eingerichtet werden muss. Das Build-System von Zig führt die Funktion build in der Datei build.zig aus, um den Build durchzuführen. Das vereinfacht den Build-Prozess und reduziert Fehler.

Packed Structs

  • Warum Packed Structs wichtig sind
    Der Game Boy Advance steuert die Hardware über Register statt über High-Level-API-Aufrufe. Die packed struct von Zig optimieren das Speicherlayout und erleichtern dadurch die Hardwaresteuerung. Das ist für die Game-Boy-Advance-Programmierung eine sehr nützliche Funktion.

Comptime

  • Codeausführung zur Compile-Zeit
    Zig bietet die Möglichkeit, Code zur Compile-Zeit auszuführen. Dadurch lassen sich Daten bereits beim Kompilieren komprimieren, statt dies erst zur Laufzeit zu tun. Diese Funktion von Zig macht es einfach, Daten zu komprimieren.

Standardbibliothek

  • Zigs flexible Standardbibliothek
    Die Standardbibliothek von Zig unterstützt Generics, und Funktionen zur Speicherallokation können einen Allocator als Argument erhalten. Dadurch lassen sich benutzerdefinierte Strategien für die Speicherallokation verwenden. Zigs Standardbibliothek bleibt auch in Umgebungen mit Hardware-Beschränkungen flexibel einsetzbar.

Probleme

  • Inline-Assembler
    Zig unterstützt Inline-Assembler, aber es ist nur eine Ausgabe möglich. Das wird problematisch, wenn BIOS-Funktionen des GBA mehrere Werte ausgeben müssen.

  • Thumb-Code / ARM-Code
    Die CPU des Game Boy Advance unterstützt den ARM-Modus und den Thumb-Modus. In Zig lassen sich ARM- und Thumb-Modus nicht explizit festlegen.

  • Seltsamer Speicher
    Der Videospeicher des Game Boy Advance kann nicht in 8-Bit-Einheiten beschrieben werden, was dazu führen kann, dass die Grafik durcheinandergerät. Zig optimiert beim Kopieren von Speicher mit memcpy, doch das kann mit dem „seltsamen Speicher“ des GBA kollidieren.

1 Kommentare

 
GN⁺ 2025-01-01
Hacker-News-Kommentare
  • Es wird eine Möglichkeit benötigt, die Art des Speicherzugriffs für bestimmte Adressbereiche festzulegen. Wenn sich das Problem auch mit volatile in der Zig-Dokumentation nicht lösen lässt, wird empfohlen, einen Compiler-Bug zu melden.
  • Der Grund, vor fünf Jahren mit Linux anzufangen, war, dass unklar war, wie man Python unter Windows einrichtet. Von 1997 bis 2015 war Windows das dominante Betriebssystem, was den Wissensmangel bei jungen Menschen verschärfte. Früher war der Internetzugang nicht allgemein verbreitet, und ein Betriebssystem ohne Programmierumgebung ließ Programmierchancen ungenutzt.
  • Auf dem Game Boy Advance kann Videospeicher nicht in 8-Bit-Einheiten beschrieben werden; tut man es doch, wird die Grafik zerstört. Im Emulator funktionierte es, auf echter Hardware musste das Problem jedoch gefunden und behoben werden. Für die Sprache Nim wurde eine GBA-Toolchain entwickelt.
  • Manchmal führt der Compiler eine Optimierung durch, bei der eine Speicherkopierfunktion durch memcpy ersetzt wird. Es wurde erwartet, dass diese Optimierung nur im Userspace erfolgt, und man hoffte, dass sich dies mit der Option -nostdlib automatisch handhaben ließe.
  • Als Möglichkeit für die Verwendung von packed structs in C werden Bitfelder vorgeschlagen. Es wird ein Beispiel für gültigen C-Code angegeben.
  • Es wird eine Methode benötigt, um das Speicherproblem des Game Boy Advance zu lösen. Es wird gefragt, ob LLVM diese Funktion unterstützt, und es wird vermutet, dass die Integration in Zig nicht schwierig wäre.