Mehr Details zur Funktionsweise von Game-Boy-Cartridges, als man eigentlich wissen wollte
(abc.decontextualize.com)- Um Game-Boy-Cartridges selbst zu bauen, waren jahrelange Forschung und Entwicklungsarbeit nötig
- Dieser Artikel fasst die wichtigsten technischen Informationen zum Bau eigener Game-Boy-Cartridges systematisch aus der Perspektive von Einsteiger:innen zusammen
- Der Game Boy ist dank seiner einfachen und zugleich erweiterbaren Hardware-Struktur eine attraktive Plattform für die Retro-Game-Development- und Hardware-Hacking-Community
- Cartridges können Spieldaten und zusätzliche Hardware (z. B. RTC, Sensoren usw.) integrieren und dem Game Boy dadurch neue Funktionen verleihen
- Über die Schaltung des Memory Bank Controller (MBC) sind Kapazitätserweiterung und selektiver Speicherzugriff möglich, wodurch Spiele auf unterschiedliche Weise ausgeführt werden können
Einführung und Zielsetzung
- Der Autor setzte sich persönlich das Ziel, ein Game-Boy-Cartridge vollständig neu zu entwickeln
- Er hat Wissen über den inneren Aufbau und die Funktionsweise von Game-Boy-Cartridges als Open Source aufbereitet und veröffentlicht
- Ziel des Artikels ist es, anspruchsvolle technische Informationen aus der Sicht von Anfänger:innen so neu zu strukturieren, dass sie für alle nachvollziehbar sind
- Er erklärt nicht die internen Funktionsprinzipien der Hardware, sondern konzentriert sich auf das von außen beobachtbare Verhalten (behavior)
- Die Erläuterungen basieren auf dem SoC des DMG (frühes Game-Boy-Modell), wobei die grundlegende Cartridge-Schnittstelle innerhalb der Game-Boy-Familie ähnlich ist
Was die Game-Boy-Plattform besonders macht
- Durch seine Einfachheit und intuitive Konstruktion lässt sich die Hardware- und Software-Struktur des Game Boy leicht im Kopf erfassen
- Dank Portabilität und geringem Stromverbrauch sowie einer Struktur ohne komplexe Schutzmechanismen oder Region Lock kann praktisch jede:r dafür entwickeln
- Es gibt eine Fülle an technischer Dokumentation, Hardware-Schaltplänen und communitybasierten Materialien
- Die offizielle und inoffizielle Spielebibliothek ist umfangreich, und Open-Source-Toolchains sowie visuelle Scripting-Tools werden aktiv gepflegt
- Es hat sich ein vielseitiges Ökosystem mit Hardware-Treibern ebenso wie präzisen Emulatoren und FPGA-Implementierungen entwickelt
Grundstruktur eines Game-Boy-Cartridges
- Bei älteren Konsolen war die Grenze zwischen Software und Hardware oft unscharf
- Der Game Boy besitzt weder ein Betriebssystem noch integrierten nichtflüchtigen Speicher. Sämtlicher ausführbarer Code und zusätzliche Hardware befinden sich im Cartridge
- Deshalb muss das Cartridge vollständig funktionsfähig sein, damit der Game Boy überhaupt booten und arbeiten kann
- Der 32-polige Edge Connector an der Unterseite des Cartridges ist die zentrale Schnittstelle für den Signalaustausch mit dem Hauptgerät
- Die Signale zwischen Cartridge und Hauptgerät sind in Stromversorgung, Steuerung (Lesen/Schreiben/Chip Select), Adressbus (16 Bit) und Datenbus (8 Bit) unterteilt
Busse und Funktionsprinzip
- Ein Bus ist eine Struktur, bei der mehrere Bauteile sich dieselben Signalleitungen teilen, um Daten darüber zu übertragen
- Die CPU des Game Boy legt die gewünschte Adresse auf den Adressbus und die Daten auf den Datenbus
- Weil die Bus-Struktur parallel ist, existieren für jedes Bit tatsächlich eigene Pins
- Das ist vorteilhaft für die Geschwindigkeit, birgt bei gemeinsam genutzten Bussen aber auch das Risiko von Konflikten/Contention (gleichzeitiges Schreiben)
- Wenn mehrere ICs gleichzeitig Daten ausgeben, kann ein Kurzschluss (mit Überhitzungs- und Ausfallrisiko) entstehen, daher darf immer nur ein IC aktiv sein
Die wichtigsten Speicherarten des Game Boy
- Der Game Boy kann bis zu vier Arten von Speicher-ICs nutzen: integriertes RAM, Video-RAM, Cartridge-ROM und Cartridge-RAM
- Tatsächlich verwendet das Video-RAM einen separaten Bus und wird in allgemeinen Erklärungen daher oft ausgeklammert
- Integriertes RAM, Cartridge-RAM und ROM teilen sich denselben Adress- und Datenbus
- Es darf immer nur ein Chip gleichzeitig Lese- oder Schreibzugriffe auf den Datenbus ausführen
- In der Praxis werden sie auch als internes RAM (WRAM), Cartridge-RAM (SRAM), Video-RAM (VRAM) und High RAM (HRAM) bezeichnet
Chip Select und Schaltungsaufbau
- Jeder Speicherchip besitzt einen Pin für das Chip-Select-Signal (CS/CE, Chip Select/Chip Enable)
- Je nach Zustand dieses Signals kann nur ein bestimmter Chip auf den Datenbus zugreifen
- Für die Chip-Auswahl verwendet der Game Boy die obersten 3 Bits des Adressbusses (A15, A14, A13) sowie den _CS-Pin der CPU erneut
- Diese Verschaltung garantiert, dass nie zwei oder mehr Chips gleichzeitig aktiv sind
- So wird zum Beispiel der ROM-Chip nur dann aktiviert, wenn A15 den Wert 0 hat, während RAM über eine separate Logik aktiviert wird
Memory Map aus Sicht von Programmierer:innen
- Die Hardware-Zustände von Adressen und Pins werden abstrahiert, sodass Programmierer:innen nur die logische Memory Map wahrnehmen
- Im 16-Bit-Adressraum ist der Bereich 0x0000–0x7FFF auf Cartridge-ROM, 0xA000–0xBFFF auf Cartridge-RAM und 0xC000–0xDFFF auf internes RAM abgebildet
- Beim Zugriff auf bestimmte Adressen wird automatisch der gewünschte Speicherbereich aktiviert, während die übrigen deaktiviert bleiben
- Materialien zur Memory Map sind in der Game-Boy-Dokumentation eine wichtige Referenz
Memory Bank Controller (MBC)
- Der MBC ist die zentrale Schaltung in Game-Boy-Cartridges, die mehr als 32 KB ROM sowie zusätzliches RAM und Peripherieanbindung ermöglicht
- Es gab verschiedene MBC-Typen im Handel, hier wird jedoch der vergleichsweise einfache und universell einsetzbare MBC5 als Grundlage verwendet
- MBC5 unterstützt per Bank Switching bis zu 8 MB ROM und 128 KB Cartridge-RAM
- Auch Zugriffskontrolle für RAM sowie die Steuerung zusätzlicher Hardware wie externer Sensoren oder RTC sind möglich
- Von den ROM-Adresspins des Cartridges werden die oberen Bits A22 bis A14 dynamisch vom MBC5 gesteuert, während nur die unteren Bits direkt mit dem Adressbus des Hauptgeräts verbunden sind
Prinzip des ROM-Bankings
- Die CPU des Game Boy hat einen Adressraum von maximal 64 KB, tatsächlich werden für ROM-Zugriffe jedoch nur 32 KB (16 KB + 16 KB) verwendet
- MBC5 steuert die oberen ROM-Adressen (Bankauswahl) direkt und mappt so den gewünschten Bereich in 16-KB-Einheiten in den Adressraum der CPU
- Hardwareseitig sind die unteren 14 Bits des CPU-Adressbusses A0 bis A13 direkt mit dem ROM-Chip verbunden, den Rest liefert der MBC5
- Wenn die Software während der Ausführung einen Wert an eine bestimmte Speicheradresse schreibt, erkennt der MBC dies und aktualisiert intern den ausgewählten Bankwert
MBC-Protokoll und Mechanismus
- MBC5 erkennt bestimmte Kombinationen aus Adressen und Steuersignalen und führt daraufhin Aktionen wie ROM-Bank-Auswahl, RAM-Bank-Auswahl oder das Aktivieren/Deaktivieren weiterer Funktionen aus
- Beispielsweise wird bei einem Schreibzugriff in den Bereich 0x2000–0x3FFF mit A15=0, A13=1, A14=0 der auf dem Datenbus anliegende Wert als ROM-Banknummer gespeichert
- Aus Sicht von Programmierer:innen wird der Bankwechsel nicht als Low-Level-Schaltungssteuerung programmiert, sondern einfach so, als würde man Daten an eine bestimmte Adresse schreiben
- Die Nutzung von Cartridge-RAM, Sensoren, RTC usw. wird nach einem ähnlichen Muster gesteuert
- Diese Art der Bus-Wiederverwendung reduziert die Anzahl der Bauteile und senkt die Kosten
Fazit und Nutzen für die Community
- Die Besonderheit der Game-Boy-Cartridge-Struktur liegt in geringen Kosten, hoher Zuverlässigkeit und Erweiterbarkeit
- Wer selbst ein Cartridge entwickelt, braucht ein präzises Verständnis dieser Struktur und Protokolle
- Mit aktiver Nutzung der Community und der umfangreichen Dokumentation lässt sich die Einstiegshürde für die integrierte Hardware-Software-Entwicklung deutlich senken
Referenzen und weiterführende Lernpfade
- Rodrigo Copettis Artikel Game Boy/Game Boy Color Architecture
- Technische Dokumentation auf gbdev.io und in den Pan Docs
- Verschiedene Open-Source-Cartridge-Designs und Toolchains (z. B. GBDK, RGBDS usw.)
- Beispiel für ein DIY-Projekt: abc.decontextualize.com
(Im späteren Teil des Artikels werden zusätzlich komplexere Aspekte wie Varianten des MBC-Designs, EEPROM/Flash-Speicher, I/O-ICs und die Integration von Peripherie behandelt, doch die oben genannten Punkte bilden den Kern der Funktionsweise von Game-Boy-Cartridges.)
1 Kommentare
Hacker-News-Kommentare
Ich möchte meine Erfahrungen mit dem TI TXB0108 teilen. Dank der automatischen Richtungserkennung wirkt es zunächst so, als brauche man keine zusätzliche Richtungslogik, tatsächlich würde ich den Einsatz aber nicht empfehlen. Bei elektrischem Rauschen kann die Richtung umschalten, sodass ein Eingang zum Ausgang wird. In solchen Fällen hält das Gerät das entweder irgendwie aus, oder im schlimmsten Fall tritt der sogenannte „magische Rauch“ auf. Mit wirklich viel Pech kann das sogar zu Unfällen in industriellen Umgebungen führen. Solche Bauteile bergen für Profis viele versteckte Risiken und sollten meiner Meinung nach nicht übermäßig beworben werden. Man sollte sie nur verwenden, wenn man die Fehlermodi genau kennt oder es keine andere Alternative gibt.
Diese Bauteile sind wirklich völlig unvorhersehbar. Schon ein oder zwei Zoll Leiterbahn oder nur ein Stecker am Ausgang können durch Output-Ringing häufig automatische Richtungsumschaltungen auslösen. Für Nicht-Profis sind sie praktisch unbenutzbar, und gerade in den Situationen, in denen man sie gern einsetzen würde, sind sie besonders schwer sinnvoll zu verwenden.
Ich habe tatsächlich erlebt, dass die Richtung mit extrem hoher Geschwindigkeit ständig hin- und herwechselte und dabei starkes Rauschen und Schwingungen entstanden. Es gibt auch einige Einschränkungen bei Pulldowns, aber wenn beide Seiten in dieselbe Richtung gezogen wurden, war es immerhin halbwegs in Ordnung.
Während ich andere Dinge aufschiebe, hier ein paar erste Anmerkungen zum abc-pcb.pdf-Design
Ich denke, ich hätte mir sehr gewünscht, dass es diesen Artikel schon gegeben hätte, als ich meine eigenen Custom-Cartridges gebaut habe.
In meinem Spiel Cubeat habe ich am Audio-In-Pin des GB einen OPL3-L-Chip angebracht, um FM-Musik zu realisieren, und für die MBC-Logik nur einzelne Logikchips der 7400-Serie verwendet.
Irgendwann möchte ich das unbedingt fertigstellen und veröffentlichen. Solche verrückten Tricks auf dem GB umzusetzen, ist wirklich eine großartige Erfahrung.
Infos zu Cubeat
Genau in dieser Detailtiefe wollte ich schon immer verstehen, wie Game-Boy-Cartridges aufgebaut sind.
Die Idee, dass Game-Boy-Cartridges zusammen mit der App auch RAM und Speicherplatz mitbringen, ist erfrischend. Wenn man darüber nachdenkt, ergibt das auch logisch Sinn.
Wenn Handys auf diese Weise funktioniert hätten, hätte man sich vielleicht alle paar Jahre neue Cartridges kaufen können, sobald sich die Chiptechnologie verbessert, um leistungsstärkere Apps auszuführen oder sogar neue Antennen einzustecken.
Modulare Handys wurden zwar schon lange vorgeschlagen, waren aber nie praktikabel oder besonders nützlich. Wenn alle Komponenten über Sockel verbunden sind, steigen die Latenzen zwischen den Chips und die Zuverlässigkeit sinkt. Bei einem Gerät, das den ganzen Tag in der Hosentasche herumgeschüttelt wird, ist das umso problematischer.
In der Praxis veraltet bei einem Handy selten nur eine einzige Komponente. Meist möchte man Kamera, Display, CPU, RAM, Akku und fast alles andere gleichzeitig aufrüsten. Dann ist es sinnvoller, einfach ein neues Telefon zu kaufen, statt einzelne Teile zu ersetzen. Der eigentliche Vorteil des modularen Austauschs wäre dann fast nur die Ersparnis beim Gehäuse.
Ich diskutiere gerade über ein ROM-Hotpatch-System für Mikrocontroller, und aus genau diesem Grund sieht man den Vorteil einer Struktur klar, bei der die App vollständig auf dem Chip sitzt und direkt läuft. Allerdings ändern sich die Anforderungen der Nutzer ständig, deshalb wird alles wohl immer komplexer.
Es ist definitiv eine gute Idee, aber ich frage mich, ob nicht die Hardwareleistung des Geräts, in das man es steckt, zum limitierenden Faktor wird.
Man könnte zwar schnelleres RAM in ein Cartridge packen, aber ob das vorhandene Board das überhaupt sinnvoll nutzen kann, ist fraglich.
Selbst wenn sich schnellerer Speicher anschließen ließe, ist unklar, wie groß der praktische Effekt wäre, solange die restliche Hardware unverändert bleibt.
Ich habe mir sogar vorgestellt, auch eine Kamera einzustecken.
Zu der Aussage, dass man bei der Entwicklung eigener Game-Boy-Software keinen Kopierschutz oder Region-Lock-Hardware umgehen müsse, kam die Frage auf, ob man in der Praxis nicht trotzdem den Logo-Check bestehen müsse.
RGBFIX) kann das automatisch eingefügt werden.Und seit dem Urteil Sega v. Accolade ist diese Art von Titelprüfung rechtlich faktisch nicht mehr durchsetzbar, sodass es praktisch keine echte Umgehungshürde mehr gibt.
Schade, dass die früher oft genutzte GB-Entwicklungsseite devrs.com nicht mehr betrieben wird. Die meisten Links sind inzwischen tot, aber dort gab es viele inspirierende Projekte.
Auch das Video zum Ultimate Game Boy Talk (33c3-Vortrag) ist sehenswert.
Ultimate Game Boy Talk - 33c3
Meine Ausgabe von Pokemon Blue ist vor 20 Jahren durch Waschmaschine und sogar Trockner gegangen und funktioniert immer noch einwandfrei. Wirklich robuste Hardware. Ich frage mich, ob eine SD-Karte so etwas auch aushalten würde.
Ich bin diesen Monat zum Spaß in KiCad und PCB-Design eingestiegen und frage mich, ob es Beispiele gibt, bei denen jemand die komplette Original-Game-Boy-PCB selbst nachgebaut und dann Open Source veröffentlicht hat.
Eine Firma namens FunnyPlaying fertigt eigene GBC- und GBA-PCBs und verkauft sie, aber eine Open-Source-Version ist schwer zu finden.
Auf GitHub von nataliethenerd gibt es das CGB-Reverse-Engineering-Projekt, allerdings mit nicht-kommerzieller Lizenz.
Dort wird es so beschrieben: „Mit dem CGB-CPU-04-Board gescannt, abgeschliffen und neu gezeichnet, um den CGB-Schaltplan zu dokumentieren; Werte usw. wurden dem Originalschaltplan entnommen.“
Ich würde auch gern Empfehlungen für gute Referenzmaterialien zum PCB-Design hören.