Der Speicher
Neben den Prozessorbefehlen ist es wichtig, den Aufbau des Adressraums zu kennen. Der Prozessor arbeitet mit 8-Bit-Werten, nutzt aber einen 16 Bit breiten Adressbus und kann so auf 64 KByte Speicher zugreifen. Im Adressraum finden sich neben Arbeits- und Grafikspeicher auch der ROM des Spielemoduls sowie eventuell auf diesem vorhandener RAM. Auch auf die Register der anderen Hardwarekomponenten kann hierüber zugegriffen werden.
Daneben gibt es noch zwei kleinere Speicher, die im Chip integriert sind. Dabei handelt es sich zum einen um einen ROM, in dem sich eine Firmware befindet. Sie überprüft nach dem Start des Gameboys, ob ein autorisiertes Spielemodul eingesetzt ist und initialisiert die Register. Damit kann ein Spiel beispielsweise prüfen, ob es auf einem klassischen Gameboy oder dem Gameboy Color läuft. Zum anderen sind 127 Byte RAM integriert, die für den Programmstack und spezielle Warteroutinen genutzt werden.
Den größten Teil des Adressraums nimmt der ROM des Spielemoduls ein. Er belegt die untere Hälfte (0x0000 bis 0x7fff) und ist in zwei Segmente mit je 16 KByte aufgeteilt. Am unteren Ende wird nach dem Start des Gameboys der Firmware-ROM eingeblendet. Erkennt er ein legitimes Spiel, startet er es und blendet sich aus.
Speicher mit besonderer Bedeutung
Einige Speicherbereiche haben eine spezielle Funktion und werden von bestimmten Hardwarekomponenten genutzt. Der Grafikhardware stehen gleich zwei spezielle Speicher zur Verfügung: der Grafikspeicher, der als SRAM-Modul auf der Platine sitzt, und der Object Attribute Memory (OAM). Auf beide geht der nächste Abschnitt genauer ein.
Darüber hinaus existiert eine Menge von Hardware-Registern. Über sie kontrolliert das Programm, was beispielsweise Grafik- und Sound-Hardware tun. Auch für die entgegengesetzte Richtung gibt es Register, über die die Hardware mitteilt, was sie gerade macht. Manche der Hardware-Register lösen direkt eine Aktion aus. Das sollte ein Emulator beachten, um das Verhalten des Systems korrekt nachzubilden.
Eine besondere Bedeutung hat auch der Beginn des Adressbereichs. Nach dem Einschalten befindet sich an Adresse 0x0000 der Firmware-ROM. Er erwartet im ROM von Adresse 0x0100 bis 0x014f Informationen über das Spielemodul, unter anderem das Nintendo-Logo, das er nutzt, um zu prüfen, ob das Modul authorisiert ist. Einige der weiteren Informationen werden später noch nützlich sein. Nachdem sich die Firmware ausgeblendet hat, wird der Bereich von 0x0000 bis 0x0067 als Einsprungpunkte zur Interrupt-Behandlung genutzt. Für jeden der dreizehn existierenden Interrupts stehen acht Byte zur Verfügung.
Wie emuliert man Speicher?
Speicher zu emulieren, klingt zunächst einmal nicht schwer. Einfach ein ausreichend großes Array anlegen, eventuell Daten hineinschreiben, fertig. Praktisch klappt das allerdings aus zwei Gründen nicht. Der erste ist, dass Schreiben in ein Register einer Hardwarekomponente in dieser eine Aktion auslösen kann. Auch liest man bei Hardware-Registern oft nicht das zurück, was hineingeschrieben wurde. Der zweite Grund, weshalb die Emulation der Speicher etwas komplexer ist, liegt im ROM-Bereich. Er wird nämlich nicht nur gelesen, oft wird hier auch geschrieben, den Grund dafür sehen wir später noch.
Um das komplexe Verhalten der verschiedenen Speicher nachzubilden, habe ich eine Klasse geschrieben, die den Zugriff regelt. Sie verfügt über Methoden, um Werte zu lesen und zu schreiben. Besonders elegant ginge das mit C++, indem der Operator für Arrayzugriffe (eckige Klammern) überladen wird; in meiner Java-Implementierung erledigen das zwei Funktionen. Die Klasse an sich delegiert Zugriffe nur an andere Klassen, die den verschiedenen Adressbereichen zugeordnet sind. Sie tun dann, was auch immer die jeweilige Hardware täte - im Fall der RAM-Bereiche bilden sie tatsächlich nur auf ein Array ab.
Nach dem Prozessor ist die Grafikeinheit die zweitwichtigste Komponente. Denn ohne Bild macht kein Spiel Spaß. Also schauen wir uns an, wie die Bilder auf das Display kommen.
Oder nutzen Sie das Golem-pur-Angebot
und lesen Golem.de
- ohne Werbung
- mit ausgeschaltetem Javascript
- mit RSS-Volltext-Feed
Einen Prozessor mit Software nachbauen | Die Grafikeinheit |
+1 Bin schon auf den Folgeartikel zur Umsetzung der parallel stattfindenden HW-Abläufe...
Sheep It Up ist für mich ein Musterbeispiel eines Homebrewspiels für den GB. Simpel...
Ich finde es daher umso erstaunlicher, wie die Leute Cores für den Mister erstellen. Ich...
Zuerst noch einmal vielen Dank für den Artikel. Bei aller Abkürzung hätte ich mir aber...