Dieser Livestream dokumentiert die Portierung und Ausführung des minimalistischen eingebetteten Betriebssystems Funbox auf einem selbstgeschriebenen MIPS-Emulator (BiddyMips) innerhalb der WebGL-Plattform Shader Toy. Der Entwickler – bekannt für den minimalistischen RISC-V-Emulator mini-rv32ima – implementiert die CPU-Ausführungslogik und den Zustandsspeicher vollständig über GLSL-Shader-Multipass-Puffer. Behandelt werden die Überwindung von Plattformrestriktionen (fehlender externer Datenupload, Zustandsspeicherung in Texturpuffern), die Implementierung von Memory-Mapped I/O (MMIO) für Bildschirmtext und Tastaturabfragen, die Konvertierung von JavaScript-Scancodes in ASCII innerhalb von GLSL sowie das Debugging von Instruktionstraps und Kernel-Fehlern. Nach erfolgreichem Booten einer interaktiven Shell in Shader Toy wird eine rudimentäre ANSI-Terminal-Unterstützung implementiert und ein natives Breakout-Spiel zur Demonstration der Echtzeitinteraktion entwickelt.
Wichtigste Punkte & Zeitstempel
0:04:43 Architekturkonzept und MIPS-Wahl: Der Entwickler erklärt den Wechsel von RISC-V zu MIPS für den Shader-Toy-Emulator (BiddyMips), begründet durch die einfachere Instruktionssatzarchitektur (ISA) und Restriktionen der Plattform, die Binärdaten ausschließlich als kompilierten Shader-Code erlaubt.
0:06:14 Architektur des Funbox-Betriebssystems: Vorstellung von Funbox, einem kombinierten Kernel- und Userland-System (18 Kilobyte Footprint nach dem Vorbild von BusyBox/Toybox), das Kernkomponenten wie Shell, free, dd, hexdump und Base64-Applikationslader umfasst.
0:07:46 Puffer-Synchronisationsprobleme in Shader Toy: Analyse eines Fehlers aus einem früheren Stream, bei dem Mausklicks und Resets zwischen Multipass-Puffer A und Puffer B zu asynchronem RAM-Löschen während des Bildaufbaus führten.
0:09:40 MMIO-Textrendering und Register-Visualisierung: Einrichtung eines als Textpuffer gemappten RAM-Bereichs (40 Zeichen Breite, uint16_t-Array). Die physischen Register (v0, a0, Stack-Pointer) und Speicherzugriffe werden live als Farb-Overlays im Shader-Hintergrund dargestellt.
0:13:11 CPU-Zyklenskalierung pro Frame: Anhebung der Ausführungsgeschwindigkeit von einem einzelnen Befehl pro Grafik-Frame auf 1.024 Zyklen pro Frame zur flüssigen Darstellung von Textausgaben.
0:15:35 Terminal-Treiber und Scrolling-Algorithmus: Implementierung der Funktion write_term in C mit Zeilenumbruch-, Tabulator- und Bildlauf-Logik (Kopieren von Bildschirmspeicherzeilen bei Überschreiten von Zeile 20) sowie Integration eines visuellen Cursors (Zeichen 17).
0:31:16 Fixed-Point Mandelbrot-Implementierung: Berechnung einer Mandelbrot-Menge ohne Gleitkomma-Hardware mittels 8.8- bzw. 10-Bit-Festkommaarithmetik. Umgehung nicht unterstützter Instruktionen wie madd durch Beschränkung auf MIPS-R3000-kompatiblen Code.
0:48:30 Tastatur- und Mauseingabe per MMIO: Adressierung eines Peripheriebereichs im Speicher zur Übergabe von Tastatur- und Mausdaten aus der Shader-Toy-Umgebung an den MIPS-Core.
1:06:14 Scancode-Decoding in GLSL: Analyse der Shader-Toy-Tastatureingaben über Texturzeilen. Entwicklung eines GLSL-basierten Konverters zur Abbildung von JavaScript-Keycodes und Modifier-Zuständen (Shift) auf standardisierte ASCII-Werte.
1:14:33 Browser-spezifische Scancode-Probleme: Identifikation von Fehlern bei der Weitergabe von Shift-Scancodes unter bestimmten Browsern (Firefox/LibreWolf) und Behebung im Shader-Code.
1:53:17 Integration von Plattform-Hooks für Funbox: Anpassung der hardwarenahen Schicht (biddy_platform) mit Low-Level-Funktionen für Zeitgeber (get_time_ticks), Terminalausgabe (write_term) und nicht-blockierende Eingabe (kbhit, getchar).
2:06:41 Kernel-Debugging eines Null-Pointer-Traps: Funbox stürzt beim ersten Bootversuch an Adresse 0x8010120 ab. Die Ursache wird auf einen ungeprüften null-Rückgabewert in funbox_get_dictionary_value zurückgeführt, der an atoi übergeben wurde.
2:15:14 Erfolgreicher Boot der interaktiven Shell: Nach dem Beheben des Dictionary-Bugs bootet die Funbox-Shell innerhalb von Shader Toy mit funktionsfähigen Befehlen wie ps, free und heap.
2:25:02 ANSI-Escape-Sequenzen und Spielimplementierung: Implementierung eines Parsers für ANSI-Steuerzeichen zur gezielten Cursorpositionierung und Bildschirmbereinigung als Grundlage für ein textbasiertes Breakout-Spiel.
3:38:39 Debugging der Breakout-Physik: Korrektur von Ballbewegungsvektoren, Schlägerkollisionen und Begrenzungsprüfungen innerhalb des MIPS-C-Codes.
3:56:57 Verifikation im nativen Terminal: Das für den Shader-Toy-Emulator geschriebene Breakout-Kompilat wird außerhalb des Shaders direkt im Linux-Hostterminal ausgeführt, was die Plattformkompatibilität der ANSI-Implementierung bestätigt.
Glossar
ANSI-Escape-Sequenzen: Standardisierte Byte-Abfolgen (beginnend mit dem Escape-Zeichen 0x1B), die von Terminal-Emulatoren interpretiert werden, um Cursorpositionen zu steuern, Farben zu setzen oder den Bildschirm zu leeren.
Fixed-Point Arithmetic (Festkommaarithmetik): Methode zur Darstellung gebrochener Zahlen ohne dedizierte Gleitkommaeinheit (FPU), bei der eine feste Anzahl von Bits für den ganzzahligen Teil und den Nachkommateil reserviert wird (z. B. Skalierung um $2^{10}$).
GLSL (OpenGL Shading Language): Eine C-ähnliche Programmiersprache zur direkten Ausführung von Shader-Programmen auf dem Grafikprozessor (GPU).
Instruction Trap / Exception: Ein vom Prozessor ausgelöster Kontrollflusswechsel bei Auftreten nicht definierter Instruktionen, ungültiger Speicheradressen oder Privilegienverletzungen.
MIPS: Eine Reduced-Instruction-Set-Computer-(RISC)-Architektur, die für ihren einfachen, orthogonalen Befehlssatz bekannt ist und vor allem in Embedded-Systemen und klassischen Workstations/Konsolen eingesetzt wurde.
MMIO (Memory-Mapped Input/Output): Ein Verfahren zur Hardware-Kommunikation, bei dem Peripheriegeräte und Ein-/Ausgaberegister in denselben Adressraum wie der reguläre Arbeitsspeicher gemappt werden.
Multipass-Puffer (Shader Toy Buffer A/B): Framebuffer-Texturen innerhalb von Shader Toy, deren Inhalte über mehrere Render-Durchläufe hinweg persistiert und als Rechen- bzw. Zustandsspeicher zweckentfremdet werden können.
RISC-V: Eine moderne, lizenzkostenfreie Open-Source-Befehlssatzarchitektur, die auf etablierten RISC-Prinzipien aufbaut.
Scancode: Der von einer Tastatur hardwarenah gesendete numerische Identifikator für eine gedrückte oder losgelassene physische Taste, unabhängig vom finalen Textzeichen.
Shader Toy: Eine webbasierte Plattform zur Erstellung und Demonstration von computergrafischen Effekten und Prozeduren mittels fragmentbasierter GLSL-Shader im WebGL-Kontext.