!!!6502 Programmieren - Teil 3
!von R. Wilde
In der letzten Ausgabe des Magazins hatten wir die Maschinenbefehle des 6502 besprochen. Diesmal sehen wir uns deren Adressierungsarten an.
Hexadezimalzahlen werden wie üblich mit einem vorangestellten "$" gekennzeichnet.
Adressierungsarten :
Relativ\\
Accumulator\\
Implied\\
Immediate\\
Zeropage\\
Zeropage,X\\
Zeropage,Y\\
Absolut\\
Absolut,X\\
Absolut,Y\\
(Indirekt)\\
(Indirekt,X)\\
(Indirekt),Y\\
!Relativ
Diese Adressierungsart finden wir nur in Verzweigungsbefehlen (Branch). Die Adressierung bezieht sich hier auf die Adresse im Programmzähler (PC). Der Wert hinter dem BRANCH-Befehl gibt den Abstand von der augenblicklichen Adresse im Programmzähler (PC) an. Ist der Wert positiv (0 bis 127), wird nach vorne verzweigt. Ist der Wert negativ (128-255), wird rückwärts, vor den BRANCH-Befehl verzweigt.
Zwei Beispiele
{{{
1) Adresse Befehl
==> $4000 : F0 01 BPL $4003
$4002 : 60 RTS
$4003 : A9 40 LDA #$40
}}}
{{{
2) Adresse Befehl
$5010 : A2 00 LDX #0
$5012 : A0 10 LDY #$10
$5014 : 60 RTS
$5015 : AD 00 10 LDA $1000
==> $5018 : 30 F6 BMI $5010
}}}
1) Wert im PC nachdem der Prozessor den BRANCH-Befehl erkannt hat =$4002. Der Wert hinter dem Befehl = 1. Das Programm wird ab der Adresse $4002 + 1 = $4003 fortgeführt.
2) Wert im PC = $501A, Wert hinter dem BRANCH-Befehl = $F6 (246). Ergibt : $501A - ($100-$F6) = $5010
!Accumulator
Hier bezieht sich die Adressierung nur auf ein Register innerhalb des Prozessors, den ACCU. Diese Adressierungsart finden wir nur bei den Schiebebefehlen wie ASL, LSR, ROL und ROR.
!Implied
Implied steht hier für innerhalb. Auch hier bezieht sich die Adressierung nur auf
Register innerhalb des Prozessors wie Status-Register (P) und Stackpointer (S).
Beispiele
{{{
CLC Clear Carry-Flag
SED Set Dezimal-Flag
PHA Push ACCU on Stack
}}}
!Immediate
Direkte, unmittelbare Adressierung. Hier wird nicht auf Werte in Speicherstellen, sondern auf Werte, die direkt hinter dem entsprechenden Maschinenbefehl stehen, zugegriffen.
Beispiele
{{{
LDA #4 Lade ACCU mit dem Wert 4
ADC #1 Addiere zum ACCU den Wert 1
EOR #$80 Exklusiv ODER (ACCU mit dem Wert $80)
LDY #127 Lade Y-Register mit Wert 127
}}}
!Zeropage
Diese Adressierung bezieht sich auf die erste Speicherseite im Computer (Speicherstellen $0 bis $FF).
Beispiele
{{{
LDA $0 Lade ACCU mit dem Inhalt der Speicherstelle 0
LDX $80 Lade X-Register mit dem In- halt der Speicherstelle $80
STY $E0 Speichere Wert im Y-Register in die Speicherstelle $E0
}}}
!Zeropage,X
Hier wird zur Zeropage-Adresse der Wert im X-Register dazugezählt. Erst das Ergebnis bezeichnet die effektive Speicherstelle.
Beispiele
{{{
LDA $40,X Ist im X-Register der Wert 6, so wird der ACCU mit dem Inhalt der
Speicherstelle $40 + 6 = $46 geladen.
STY $90,X Ist im X-Register der Wert $3E (62), so wird der Wert im Y-Register
in die Speicherstelle $90 + $3E = $CE abgelegt.
}}}
!Zeropage,Y
Das ist die gleiche Adressierungsart wie zuvor. Nur dass an Stelle des Indexregisters X das Indexregister Y steht.
!Absolut
Das ist sicherlich die am meisten gebrauchte Art der Adressierung. Wie die Bezeichnung bereits sagt, wird hier die Adresse, die angesprochen werden soll, direkt angegeben.
Beispiele
{{{
LDA $89AB Lade ACCU mit dem Inhalt der Speicherstelle $89AB
AND $2000 Führe eine UND-Verknüpfung des ACCU mit dem Inhalt der Speicherstelle $2000 durch
JMP $7000 Springe zur Adresse $7000
}}}
!Absolut,X
Hier wird wieder zur angegebenen Adresse der Inhalt des Indexregisters X zugezählt. Das Ergebnis bezeichnet die effektive Adresse.
Beispiele
{{{
STA $43F0,X Ist der Inhalt des Index-Registers X = $20, wird der Wert im
ACCU in der Speicherstelle $43F0+$20 = $4410 abgelegt
LDY $1000,X Ist der Inhalt des X-Registers = $B3, wird der Inhalt der
Speicherstelle $1000 + $B3 = $10B3 in das Y-Register geladen
}}}
!Absolut,Y
Auch hier gilt das gleiche wie zuvor bei der Adressierungsart "Absolut,X". Nur dass auch hier statt dem Register X das Register Y steht.
!(Indirekt)
Diese Adressierungsart finden wir nur bei dem JMP-Befehl. Die Adresse hinter dem Befehl gibt die Speicherstelle an, ab welcher die Adresse steht, zu der gesprungen werden soll. Deshalb heißt diese Adressierungsart auch "Indirekt".
Beispiel
{{{
JMP ($BFFE) Steht in Adresse $BFFE und $BFFF
(Die Adressangabe besteht hier immer aus 2 Bytes)
$30 und $A5, dann wird zur Adresse $A530 gesprungen.
}}}
!(Indirekt,X)
Die Adresse, auf die zugegriffen werden soll, steht in den Speicherstellen, die folgendermaßen errechnet werden: Die hinter dem Befehl angegebene Adresse + Inhalt des X-Registers. Die Adresse darf sich nur auf die Zeropage ($00 bis $FF) beziehen.
Beispiel
{{{
LDA ($10,X) Wenn im X-Register der Wert $50 steht, ergibt sich die Adresse $10+$50=$60.
Ab $60 steht die Adresse (2 Bytes) der Speicherstelle, deren Inhalt in den ACCU geladen wird.
}}}
!(Indirekt),Y
Das ist die komplexeste Art der Adressierung. Hier steht hinter dem Befehl eine Zeropage-Adresse (1 Byte) ab der die Adresse steht, zu der noch der Wert des Y-Registers gezählt werden muss. Dann hat man die effektive Adresse.
Beispiel
{{{
LDA ($E0),Y In den Speicherstellen $E0/$E1 steht die absolute Adresse (2 Bytes),
zu der noch der Inhalt des Indexregisters Y zugezählt wird.
Das ergibt die Adresse der Speicherstelle, deren Inhalt in den ACCU geladen wird.
}}}
Bis zur nächsten Ausgabe Euer R.Wilde\\
CSM / 8.1988
----
Der Artikel entstammt der Kursreihe „6502 Programmieren“ des Compy Shop Diskettenmagazins. Die Kursreihe besteht aus 14 Kursen, die im Laufe des Jahres 2011 in unregelmäßigen Abständen einzeln veröffentlicht werden, bzw. anschließend als Zusammenzug als ABBUC-Buch „6502 Programmieren“ erscheinen.\\
Koordination: Volkert Barr (volkert@nivoba.de)\\
Version 1.1 / 2011-01-15