Architektur des Super Nintendo Entertainment Systems (snes)




старонка6/10
Дата канвертавання24.04.2016
Памер387.65 Kb.
1   2   3   4   5   6   7   8   9   10

9Programmierung des Systems

9.1 Allgemeiner Aufbau der Instruktionen


Der SNES wird mit einer Variante des Assembler-Befehlscodes programmiert. Diese Variante verfügt über eine große Bandbreite von Befehlen und kann verwendet werden, um alle Bauteile des SNES zu programmieren. Auch die allermeisten SNES-Emulatoren verwenden diesen Befehlscode, allerdings gibt es auch eine Abwandlung von C, die zur Programmierung verwendet werden kann. Wir haben nur die Assembler-Variante verwendet.

Die große Bandbreite von Befehlen von unterschiedlicher Länge lässt vermuten, das es sich um einen CISC-Befehlssatz handelt, sicher lässt sich dies aber für den SNES nicht sagen, da das Produkt des Compilers nicht bekannt ist, sondern nur der geschriebene Code, und wir ausserdem nicht alle Befehle kennen. Der Assembler-Befehlscode verfügt über drei genutzte Register (Akkumulator, X, Y), für die jeweils Lade- und Speicher-Befehle existieren. Weiterhin gibt es Befehle, um Daten von einem ins andere Register zu verschieben. Ein eigener Speicherbefehl speichert den Wert null in einer Speicherzelle. Auch gibt es einer Reihe von Sprungbefehlen, vom einfachen Sprung bis zu Varianten wie ‚bpl „Wert“’ (Branch on Plus, Springe, wenn der Wert „Wert“ positiv ist). Daneben gibt es noch eine ganze Reihe weiterer Befehle, deren Beschreibung hier den Rahmen sprengen würde. Zumal es nicht sicher ist, dass uns alle Befehle bekannt sind, da es nicht möglich war, einen vollständigen Befehlssatz zu finden.

Jeder Befehl kann maximal einen angegebenen Parameter haben, der zweite Parameter ist grundsätzlich durch den Befehl vorgegeben, so überhaupt ein zweiter Parameter nötig ist. Als Beispiel soll hier der Befehl ‚lda’ dienen, der einen Wert in den Akkumulator lädt. Lda lässt sich verschiedentlich laden, so kann man einen Wert direkt angeben, der in den Akku geladen werden soll (lda #$00 , lade den Wert(#) 00 Hex($) in den Akku), oder eine Speicherstelle angeben, deren Wert in den Akku geladen werden soll (lda $2214 , lade den Wert der Speicherstelle 2214 Hex($) in den Akku). Auch kann Registerindirekt adressiert werden (lda $2214,x , lade den Wert in den Akku, der sich in der Speicherstelle befindet, die durch 2214 Hex($) plus den Inhalt des X-Registers(x) adressiert wird). Statt einer 16 Bit-Adresse kann auch eine 24 Bit-Adresse angegeben werden, oder es kann über das Direct-Register adressiert werden. (Quelle: 18 & 19)

9.2Initialisierungsparameter


Um einen SNES emulieren zu können, muss sich ein Emulator auch wie ein solcher verhalten. Daher muss er auch den Initialisierungsalgorithmus abbilden, der im SNES zum Zeitpunkt des Anschaltens abläuft. Hierzu gibt es im Netz zwei Init-Routinen, die einfach in jedes Emulator-Programm eingebunden werden können, und den Emulator auf den Stand setzen, dass er das eigentliche Programm genau so abarbeitet, wie ein echter SNES es tun würde. Die Routinen sind in den Anhängen A und B zu finden, die Inhalte seien hier noch mal kurz erläutert:

header.inc (Quelle: 20)

In der header.inc werden allgemeine Dinge definiert, die teilweise beim echten SNES durch die Hardware schon vorgegeben sind, teilweise von SNES zu SNES variieren können. Allen gemeinsam ist aber, dass sie bei einem SNES immer gleich sind. Am wichtigsten sind hier die Definitionen der ROM-Bänke und der ROM-Startadressen, so dass klar ist, über wie viel Speicher der simulierte ROM verfügt und wo dieser adressiert wird. Als Zusatz lässt sich hier der Name des zu schreibenden Programms definieren.

Snes_Init.asm (Quelle: 21)

Die Snes_Init.asm ist, entgegen der header.inc, keine Header-Datei, sondern beinhaltet ein Makro, welches ein Unterprogramm aufruft. Somit könnte sie auch im eigentlichen Programmcode stehen. Dass sie dennoch ausgegliedert ist, liegt einfach daran, dass der Code sich immer wieder verwenden lässt, und als eigene Datei einfacher einzubinden ist. Der SNES verfügt über nur wenige Register in der CPU, sondern lässt viele wichtige Werte im RAM an eigens dafür vorgesehenen Stellen ablegen. Die Snes_Init.asm schreibt an diese Stellen die benötigten Werte, so dass das Programm mit einem Minimum an Änderungen auskommt, ohne irgendwo undefinierte Werte stehen zu haben. Das wiederum heisst in den meisten Fällen, dass die entsprechenden Speicherstellen mit null initialisiert werden (stz = Store Zero), an einigen Stellen werden aber auch andere Werte geschrieben, so wird der Bildschirm mit „Ausgeschaltet, volle Helligkeit“ initialisiert, damit im Programm hier eine Ausgabe definiert werden kann, und er dann angeschaltet werden kann. (Quelle: 10 – Seite 11)

9.3Entwickeltes Testprogramm


Die Programme wurden in mehreren Zyklen entwickelt, mit dem festen Ziel, am Ende etwas „zum Zeigen“ zu haben. So wurde mit der Informationssuche begonnen, und als erstes ein einfaches Programm entwickelt, welches den Bildschirm einfärbt. Diese Funktion ist auch noch im Soundtest-Programm zu finden. Zu diesem Zeitpunkt lagen die beiden Init-Dateien schon vor, wodurch dieser Schritt sich recht einfach gestaltete. Das Programm tut nicht mehr, als den Bildschirm abzuschalten, die Farbe durch Ändern der entsprechenden Parameter zu wechseln, und den Bildschirm wieder einzuschalten. (Quelle: 22)

Da über den Soundchip und dessen Programmierung am meisten Informationen vorlagen, war das der logische nächste Schritt. Dies gestaltete sich etwas schwieriger, da mit einem anderen Chip, dem Soundchip, kommuniziert werden musste. Da aber der größte Teil der SNES-Programmierung auf diesem Wege abläuft, war das unumgänglich. Der Ablauf war aus en Inormationen ersichtlich: Daten zuerst auf dem ROM, dies sollte im Initialisierungsteil geschehen, da auf dem SNES die Daten auch schon von Anfang an auf dem ROM sind. Dann müssen die Daten auf den RAM der CPU und von da weiter in den RAM des Soundchips. Weiterhin müssen die Header-Informationen vom ROM auf den RAM, und dort in ein kleines Programm verpackt werden, welches das Abspielen der Datei startet. Dieses Programm muss ebenfalls an den Soundchip gesendet werden und dort gestartet werden. Mit entsprechender Initialisierung wird die Musik dann als Endlosschleife abgespielt. Der Quellcode ist in Anhang C zu finden. (Quelle: 23)



Der dritte Schritt war dann die Entwicklung eines kleinen Grafik-Programms. Hierzu lag ein rudimentäres Beispielprogramm vor, welches entsprechend modifiziert werden musste. Die Quelle des Beispielprogramms liegt uns leider nicht mehr vor. Ein Datensatz zum Anzeigen von Buchstaben war ebenfalls gefunden worden. Das Programm wurde in vier einzelnen schritten entwickelt: Anzeigen eines Buchstaben, eines Textes, eines fliessenden Textes, und als letztes, eines in einer Sinuskurve schwingenden Textes, als optisches „Highlight“. Der Aufbau ist immer ähnlich. Zunächst wird der SNES initialisiert, wobei hier noch zusätzliche unterprogramme hinzukommen, die den Grafik-RAM leeren und den Buchstaben-Datensatz hineinkopieren. Dann wird der anzuzeigende Text identifiziert und Zeilenweise angezeigt. Zuletzt wird noch der Bildschirm wieder angeschaltet, und je nach Programm das ganze auf dem Stand angehalten oder immer wieder neu gestartet. Bei einem einzelnen Buchstaben gestaltet sich das recht einfach: Der Buchstabe wird identifiziert und alle Pixel desselben angezeigt. Bei der Zeile ist das schon schwieriger, da jeder Buchstabe einzeln angezeigt werden muss. Bei dem Fliesstext wird nur ein Teil des Textes angezeigt, wobei der angezeigte Teil jeweils nach der Anzeige geändert wird, beim schwingenden Text muss die Anzeige noch mit der Sinuskurve verrechnet werden. Der Quelltext der letzten Variante, des schwingenden Textes, ist in Anhang D zu finden.
1   2   3   4   5   6   7   8   9   10


База данных защищена авторским правом ©shkola.of.by 2016
звярнуцца да адміністрацыі

    Галоўная старонка