!!!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