Adressierung

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Die CPU 6510 verfügt über eine Vielzahl von Adressierungsmöglichkeiten:

Absolute Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der absoluten Adressierung wird immer der Inhalt einer 16-Bit-Speicheradresse angesprochen.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA $hhll

Ass befehl ad.gif

Absolute X-indizierte Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der absoluten X-indizierten Adressierung wird immer der Inhalt der 16-Bit-Speicheradresse ($hhll+X) angesprochen.
Überschreitet bei Befehlen mit nur lesendem Zugriff auf den Speicher (LDA, EOR, ADC, ...) die Adressberechnung eine Page-Grenze fällt bei der Ausführung ein Extratakt an. Der Auslöser für den Extratakt ist die Korrektur der Adresse, wobei der jeweilige Befehl bereits auf die noch falsche Adresse lesend zugreift. Das kann zu Nebeneffekten führen, welche auch absichtlich genutzt werden können, siehe Beispiel. Befehle, die das Ergebnis wieder in die Speicherstelle schreiben (STA, LSR, ...), brauchen hingegen stets einen Takt länger.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.

Beispiel: LDA $hhll, X[Bearbeiten | Quelltext bearbeiten]

Ass befehl bd.gif

Beispiel: Lesen mit Nebeneffekt[Bearbeiten | Quelltext bearbeiten]

Die folgende Sequenz

LDX #$10
LDA $DCFD,X

kann genutzt werden, um die Interrupts von CIA1 und CIA2 mit nur einem Befehl zu bestätigen, weil zuerst auf $DC0D und dann einen Takt darauf $DD0D gelesen wird.

Absolute Y-indizierte Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der absoluten Y-indizierten Adressierung wird immer der Inhalt der 16-Bit-Speicheradresse ($hhll+Y) angesprochen.
Überschreitet bei Befehlen mit nur lesendem Zugriff auf den Speicher (LDA, EOR, ADC, ...) die Adressberechnung eine Page-Grenze fällt bei der Ausführung eine Extratakt an. Der Auslöser für den Extratakt ist die Korrektur der Adresse, wobei der jeweilige Befehl bereits auf die noch falsche Adresse lesend zugreift. Das kann zu Nebeneffekten führen, welche auch absichtlich genutzt werden können, siehe Beispiel. Der Befehl STA, der den Wert in die Speicherstelle schreibt, braucht hingegen stets einen Takt länger.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA $hhll, Y

Ass befehl b9.gif


Akkumulator Adressierung[Bearbeiten | Quelltext bearbeiten]

Diese Adressierungsart ist ähnlich der impliziten Adressierung.
Die Befehle dieser Adressierungsart benötigen, wie bei der impliziten Adressierung, nur 1 Byte.
Das "A" (Akkumulator) kann im Mnemonic angegeben werden, muss aber nicht.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: ASL oder ASL A

Ass befehl 0a.gif

Unmittelbare Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der unmittelbaren[1] Adressierung wird ein konstanter Wert angegeben.
Die Konstante wird immer durch ein Raute-Zeichen (#) eingeleitet.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA #$nn

Ass befehl a9.gif

Implizite Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der impliziten Adressierung wird kein Argument angegeben.
Die Information ergibt sich bereits aus dem Befehl.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: INX

Ass befehl e8.gif

Indirekte Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der indirekten Adressierung wird das Sprungziel über einen Zeiger (oder Vektor) wie folgt ermittelt:

$hhll ist das niederwertige Adress-Byte (LSB).
$hhll+1 ist das höherwertige Adress-Byte (MSB).

Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: JMP ($hhll)

Ass befehl 6c.gif

Bei der indirekten Adressierung ist zu beachten, dass das höherwertige Adress-Byte aus derselben Page geholt wird wie das niederwertige Byte. D.h. JMP ($01FF) holt beispielsweise das niederwertige Byte (PCL) von $01FF und das höherwertige Byte (PCH) von $0100 (statt wie zu erwarten wäre von $0200).

Indirekte X-indizierte Zeropage-Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der indirekten X-indizierten Zeropage-Adressierung wird die Adresse wie folgt ermittelt:

$ll+X ist das niederwertige Adress-Byte (LSB).
$ll+X+1 ist das höherwertige Adress-Byte (MSB).

Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA ($ll, X)

Ass befehl a1.gif

Wie bei der indirekten Adressierung, kann auch hier die Page-Grenze (in diesem Fall die Zeropage) nicht überschritten werden. So führt die Abfolge

LDX #$02
LDA ($FF,X)

dazu, dass das niederwertige Adress-Byte aus der Speicheradresse $01 geholt wird, das höherwertige Adress-Byte aus $02.

Indirekte Y-nachindizierte Zeropage-Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der indirekten Y-nachindizierten Zeropage-Adressierung wird die Adresse wie folgt ermittelt:
Die Zeigeradresse (LSB=$ll ; MSB=$ll+1) plus dem Y-Register. (z.B. STA ($ll), Y)
Der Auslöser für den Extratakt ist die Korrektur der Adresse, wobei der jeweilige Befehl bereits auf die noch falsche Adresse lesend zugreift. Das kann zu Nebeneffekten führen, welche auch absichtlich genutzt werden können, siehe Beispiel (allerdings mit anderer Adressierungsart). Der Befehl STA, der den Wert in die Speicherstelle schreibt, braucht hingegen stets einen Takt länger.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA ($ll), Y

Ass befehl b1.gif

Wie bei der indirekten Adressierung, kann auch hier die Page-Grenze (in diesem Fall die Zeropage) nicht überschritten werden. Ein LDA ($FF),Y holt das niederwertige Adress-Byte aus der Speicheradresse $FF, das höherwertige Adress-Byte aus $00.

Relative Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der relativen Adressierung stehen dem Benutzer 8 bedingte Sprungbefehle zur Verfügung.
Es ist damit möglich, in Abhängigkeit der Bits im Statusregister, relativ zur aktuellen Adresse zu verzweigen.
Das 2. Byte einer dieser bedingten Sprungbefehle ist eine vorzeichenbehaftete Zahl, die für die Werte im Bereich

  • $00-$7f als positiver Offset, also von 0 bis 127,
  • $80-$ff als negativer Offset, also von -128 bis -1

aufgefasst wird und zum Programmzähler (bezogen auf den folgenden Befehl) addiert wird. Überschreitet dabei die Berechnung eine Page-Grenze fällt bei der Ausführung ein Extratakt an.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: BEQ $hhll

Ass befehl f0.gif

Zeropage Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der Zeropage-Adressierung wird immer der Inhalt einer Speicheradresse im Bereich von $0000-$00ff angesprochen.
Da das High-Byte der Zeropage immer 0 ist, wird es weggelassen.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA $ll

Ass befehl a5.gif

Zeropage X-indizierte Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der X-indizierten Zeropage-Adressierung wird immer der Inhalt der Speicheradresse ($ll+X) angesprochen.
Da das High-Byte der Zeropage immer 0 ist, wird es weggelassen.
Auch hier − vergleiche Indirekte X-indizierte Zeropage-Adressierung − kann die Page-Grenze (in diesem Fall die Zeropage) nicht überschritten werden. So führt die Abfolge

LDX #$02
LDA $FF,X

dazu, dass das Byte aus der Speicheradresse $01 geholt wird, obgleich das Zwischenergebnis $0101 ergäbe.

Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA $ll, X

Ass befehl b5.gif

Zeropage Y-indizierte Adressierung[Bearbeiten | Quelltext bearbeiten]

Bei der Y-indizierten Zeropage-Adressierung wird immer der Inhalt der Speicheradresse ($ll+Y) angesprochen.
Da das High-Byte der Zeropage immer 0 ist, wird es weggelassen.
Auch hier − vergleiche Indirekte Y-indizierte Zeropage-Adressierung − kann die Page-Grenze (in diesem Fall die Zeropage) nicht überschritten werden. So führt die Abfolge

LDY #$02
LDX $FF,Y

dazu, dass das Byte aus der Speicheradresse $01 geholt wird, obgleich das Zwischenergebnis $0101 ergäbe.

Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDX $ll, Y

Ass befehl b6.gif

Fußnoten[Bearbeiten | Quelltext bearbeiten]

  1. Der Begriff direkte Adressierung könnte missverständlich sein, speziell nach dem Ableger er 65xx-Familie, wie z.B. 65816, die Zeropage-Adressierung in Direct Page Addressing Mode umgewandelt haben. Auch bei entfernteren Verwandten, wie beim 6809 bezeichnet Direct Addressing' die Zeropage-Adressierung.