Nachdem die Grundbeschaltung des Prozessors fertig ist und wir auch Programme schreiben, kompilieren und auf dem Prozessor ausführen können, fehlen noch ein paar Grundlagen über das Speichermanagement des Prozessors, damit die ersten größeren Programme geschrieben werden können.
Für die Adressierung der insgesamt 64 kB Speicher stehen dem Prozessor insgesamt 16 verschiedene Adressierungsmethoden zur Verfügung.
Einige Befehle nutzen die sogenannte Zero Page als Adressbereich. Unter der Zero Page versteht man die ersten 256 Byte des Hauptspeichers, die als Erweiterung zu den zwei vorhandenen Registern verstanden werden kann. Befehle, die die Zero Page verwenden sind um 1 Byte kürzer, da ein einzelnes Byte ausreicht, um den kompletten Speicherbereich adressieren zu können, wodurch der Prozessor die Operation schneller verarbeiten kann.
Im Anschluss an die Zero Page befindet sich der 8-Bit große Adressraum für den Stack, dessen aktuelle Adresse in dem Stack Pointer-Register gespeichert wird:
Jedes mal wenn Daten auf den Stack abgelegt (gepusht) werden, wird die Adresse des Stacks um 1 reduziert. Sobald die Daten vom Stack gelesen (gepullt) werden, wird die Adresse des Stacks um 1 erhöht. Der Stack wächst dabei von oben nach unten, sprich die niedrigste Adresse ist der Wert, der in das Stack Pointer-Register geschrieben wird.
Das Stack Pointer-Register kann über die TXS-Instruktion mit einem Wert geladen werden, um die Startadresse des Stacks zu setzen.
ldx #$F0 txs
Achtung:
Bei der Verwendung des Stacks muss darauf geachtet werden, dass die Größe des Stacks niemals 256 Bytes überschreitet, da ansonsten Einträge überschrieben werden!
Wenn der Prozessor durch einen jsr
Befehl in ein Unterprogramm springen soll, wird automatisch die Rücksprungadresse auf den Stack gepusht.
Adressbus OpCode Datenbus R/W 0xfffc : 0x00 R 0xfffd : 0xa0 R 0xa000 : LDX 0xa2 R 0xa001 : 0xf0 R 0xa002 : TXS 0x9a R 0xa003 : 0x20 R 0xa003 : JSR 0x20 R 0xa004 : 0x06 R 0x01f0 : 0xa0 R 0x01f0 : 0xa0 W 0x01ef : 0x05 W 0xa005 : 0xa0 R 0xa006 : PHA 0x48 R 0xa007 : 0x68 R 0x01ee : 0x00 W 0xa007 : PLA 0x68 R 0xa008 : 0x60 R 0x01ed : 0xa4 R 0x01ee : 0x00 R 0xa008 : RTS 0x60 R 0xa009 : 0x00 R 0x01ee : 0x00 R 0x01ef : 0x05 R 0x01f0 : 0xa0 R 0xa005 : 0xa0 R
Bei diesem Beispiel wird das Stack Pointer-Register mit dem Wert 0xF0 initialisiert und anschließend springt der Mikroprozessor in ein Unterprogramm. Während des Wechsels in das Unterprogramm werden zwei Schreiboperationen ausgeführt und die Rücksprungadresse, also die Adresse nach dem jsr
Kommando, in die Speicherzellen 0x01F0 und 0x01EF geschrieben.
Über das pha
und das pla
Kommando wird der Akkumulator auf den Stack gepusht und wieder gepullt. Anschließend verlässt der Mikroprozessor das Unterprogramm über das jsr
Kommando und ließt dabei die Rücksprungadresse vom Stack, indem er die Speicherzellen 0x01EF und 0x01F0 ausließt.
→ Zurück
Schreibe einen Kommentar