Adressierung

Aus C64-Wiki
Wechseln zu: Navigation, Suche

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

Inhaltsverzeichnis

[Bearbeiten] Absolute Adressierung

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

[Bearbeiten] Absolute X-indizierte Adressierung

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

[Bearbeiten] Beispiel: LDA $hhll, X

Ass befehl bd.gif

[Bearbeiten] Beispiel: Lesen mit Nebeneffekt

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.


[Bearbeiten] Absolute Y-indizierte Adressierung

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


[Bearbeiten] Akkumulator Adressierung

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

[Bearbeiten] Direkte Adressierung

Bei der direkten (unmittelbaren) 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

[Bearbeiten] Implizite Adressierung

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

[Bearbeiten] Indirekte Adressierung

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).

[Bearbeiten] Indirekte X-indizierte Zeropage-Adressierung

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 ein LDX #$2 und LDA ($FE,X) dazu, dass das niederwertige Adressbyte aus der Speicheradresse $01 geholt wird, das höherwertige Adressbyte aus $02.

[Bearbeiten] Indirekte Y-nachindizierte Zeropage-Adressierung

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 Adressbyte aus der Speicheradresse $FF, das höherwertige Adressbyte aus $00.

[Bearbeiten] Relative Adressierung

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 er Ausführung ein Extratakt an.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: BEQ $hhll

Ass befehl f0.gif

[Bearbeiten] Zeropage Adressierung

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

[Bearbeiten] Zeropage X-indizierte Adressierung

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.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDA $ll, X

Ass befehl b5.gif

[Bearbeiten] Zeropage Y-indizierte Adressierung

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.
Siehe Liste der Assembler-Befehle, die diese Adressierung verwenden.


Beispiel: LDX $ll, Y

Ass befehl b6.gif

In anderen Sprachen