Im Folgenden finden Sie eine grundlegende Übersicht über das NES (und meistens auch das SNES). Ich habe keine NES-Spiele geschrieben, aber einen NES-Emulator (Graybox) geschrieben und einiges an Rev-Engineering für alte Karren durchgeführt.
Was die Programmiersprache angeht: Ja, es war alles Assembler. Das Programmieren des NES bedeutete, direkt mit Hardware-Interrupts, DMA-Ports, Bank-Switching usw. zu arbeiten. Glücklicherweise ist das Programmieren des 6502 (oder besser gesagt des 2A03) recht einfach [1]:
- Es gibt nur wenige Register: A, X und Y, wobei die beiden letzteren nur zum Indizieren und Iterieren verwendet werden können
- Der Befehlssatz ist klein und meist unkompliziert
- Nicht viel Speicher: Der Hauptspeicher ist 2 KB groß, mit einer optionalen batteriegepufferten 8-KB-Erweiterung. Von diesen 2 KB sind 256 Byte für den Stack reserviert und Seite 0 (die ersten 256 Byte) war der Ort, an dem Sie Ihre am häufigsten verwendeten Zeiger und Werte aufgrund einiger spezieller Adressierungsmodi speichern möchten
Diese drei Dinge zusammen ergeben eine Umgebung, die leicht zu merken ist, während man damit arbeitet. Ja, Sie verwalten den gesamten Speicher selbst, aber das bedeutete im Wesentlichen, dass Sie eine vollständige Karte erstellen, auf der alles vor sich geht, und diese Karte nicht sehr groß ist, da Sie sich nur um 2 KB kümmern müssen, sodass Sie dies auf einem Stück auszeichnen können Millimeterpapier. Sie mussten etwas mehr planen und Variablen und Konstanten statisch RAM- und ROM-Positionen (auf Kassetten) zuweisen.
Sobald Ihre Cartridge-Daten die adressierbaren Grenzen der CPU überschreiten, wird es etwas schwieriger. Das sind 64 KB, von denen die unteren 32 KB in Stein gemeißelt und auf alle Arten von Hardware-Ports und RAM abgebildet sind. Hier kommt das Bank-Switching ins Spiel, dh das Zuordnen eines Abschnitts des ROM zum (Teil des) höheren 32-KB-Adressraums.
Dies kann nach Belieben des Programmierers verwendet werden. Als Beispiel kann jedoch ein Spiel mit 3 Ebenen verwendet werden, bei dem alle Ebenendaten, Metadaten und der Code für jede Ebene in separaten 8-KB-Speicherbereichen auf der Kassette gespeichert sind. Die Ebene könnte Rückrufe für z. B. Initialisierung, Aktualisierung pro Frame usw. enthalten. "Laden" der Ebene würde bedeuten, dass 8 KB Speicherblock auf z. B. 0xC000 abgebildet werden. Sie können dann festlegen, dass die Init-Routine immer bei 0xC000 ist, die Frame-Update-Routine bei 0xC200 ist und die Level-Daten bei 0xC800 beginnen. Der Hauptcode des Spiels, der sich in einem anderen Speicherblock befindet, steuert dann Pegeländerungen, indem er einfach den rechten Block eintauscht und zu den entsprechenden Zeiten zu den absoluten Adressen 0xC000 und 0xC200 springt.
Für grafische Daten: Die Kacheldaten des NES sind 2-Bit-Karten mit 8 x 8 Pixeln. Für den Hintergrund werden sie mit einer 2-Bit-Ebene mit einer Auflösung von 1/4 kombiniert. Diese 4-Bit-Werte wurden dann in einer Palette mit 16 Einträgen indiziert, wobei meines Erachtens 53 effektive, eindeutige Farben zur Verfügung stehen. Sprites verwendeten auch die 2-Bit-Pixeldaten und jedes Sprite spezifizierte seinen eigenen 2-Bit-Gruppenindex, der wiederum einen 4-Bit-Pal-Index bildete. Das Hintergrundbild auf dem Bildschirm ist ein 32x30-Array von Kachelindexnummern.
Im Wesentlichen können Sie durch eine Menge Wiederholungen und Indizes in Indizes Daten sehr klein halten. Level-Daten wurden häufig als vertikale Balken in Kachelindizes gespeichert. Da diese vertikalen Balken auch wiederverwendet wurden, wurden diese ebenfalls indiziert und nur einmal auf der Kassette gespeichert. Einfache Datenkomprimierungstechniken funktionieren ähnlich. Dies ermöglichte es Mario 1, 32 KB Daten (mit genügend Platz) und 8 KB Bitmap-Daten zu speichern.
In Bezug auf Entwicklungsumgebungen habe ich einige Fotos gesehen, auf denen Menschen an einigen nachweislich alten Computern arbeiteten, die für ihre Arbeit an EEPROM-Brenner angeschlossen waren. Das toolgestützte Debuggen war erst nach dem SNES-Alter möglich [2]. Dies ist der Hauptgrund, warum so viele alte Spiele "offensichtliche" Fehler aufweisen und warum Dinge wie Gameshark tun können, was sie tun. Die Gesundheit des Spielers befindet sich immer an Speicherort X, sodass Sie jederzeit 100 erzwingen können.
Wenn Sie diese Dinge interessant finden, empfehle ich Ihnen, zB http://wiki.nesdev.com/w/index.php/Nesdev_Wiki zu
besuchen. Es gibt einige Programmierkurse für NES, die auch online verfügbar sind.
Ich hoffe, dieser vereinfachte Überblick gab einen Einblick in die Spieleentwicklung der 80er Jahre.
[1] Relativ gesehen. Außerdem bin ich voreingenommen, da ich Graybox selbst in einer 85% PowerPC-Assembly geschrieben habe. [2] Siehe den Making-of-FF6-Artikel: http://www.edge-online.com/features/the-making-of-final-fantasy-vi/