Kampis Elektroecke

Speichermanagement des Prozessors

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. 

Modus Beispiel Beschreibung
Absolut lda #10 Der Kommandocode enthält zusätzlich eine 16-Bit Adresse.
Absolute Indexed Indirect jmp ($40, X) Addiert einen 16-Bit Offset aus dem Kommandocode zu einem Wert aus dem X-Register um einen Adresszeiger für die Operation zu erhalten. Wird üblicherweise mit jmp Befehlen verwendet.
Absolute Indexed with X lda $40, X Addiert einen Offset aus dem Kommandocode zu einem Adressbyte aus dem X-Register um eine Adresse für die Operation zu erhalten.
Absolute Indexed with Y lda $40, Y Addiert einen Offset aus dem Kommandocode zu einem Adressbyte aus dem Y-Register um eine Adresse für die Operation zu erhalten.
Absolute Indirect jmp ($FFFC) Der Kommandocode enthält einen Zeiger auf eine Adresse für die Operation. Wird üblicherweise mit jmp Befehlen verwendet.
Accumulator lsr A Die Operation wird auf den Inhalt des Akkumulators angewendet.
Immediate Addressing
lda #10 Die Adresse wird als konstanter Wert mit im Kommandocode gespeichert.
Implied inx Die Adresse ist im Kommandocode hinterlegt.
Program Counter Relative beq 0x05 Das zweite Byte des Kommandocodes wird zum Programmzähler addiert. Wird üblicherweise mit Branch-Befehlen verwendet.
Stack phx Wird von Befehlen verwendet, die den Stack nutzen um Daten zu speichern oder zu laden.
Zero Page ldx $10, Y Der Kommandocode enthält eine 8-Bit Adresse für die Zero Page.
Zero Page Indexed Indirect
lda ($10, X) Addiert einen 8-Bit Offset aus dem Kommandocode mit dem X-Register um einen Adresszeiger auf die Zero Page zu erhalten.
Zero Page Indexed with X lda $10, X Addiert einen Offset aus dem Kommandocode zu dem Adressbyte aus dem X-Register um eine Adresse aus der Zero Page für die Operation zu erhalten.
Zero Page Indexed with Y lda $10, Y Addiert einen Offset aus dem Kommandocode zu dem Adressbyte aus dem Y-Register um eine Adresse aus der Zero Page für die Operation zu erhalten.
Zero Page Indirect jmp ($05) Der Kommandocode enthält einen Zeiger auf eine Adresse für die Operation, der auf einen Speicherbereich in der Zero Page zeigt. 
Zero Page Indirect Indexed with Y jmp ($05, X) Addiert eine Zero Page Adresse aus dem Kommandocode zu einem Adressbyte aus dem X-Register um eine Adresse für die Operation zu erhalten.

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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert