PLA

Aus C64-Wiki
(Weitergeleitet von pla)
Zur Navigation springenZur Suche springen
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen finden sich unter PLA (Begriffsklärung).


Mnemonic: PLA
Opcode: $68
Anzahl der Bytes: 1
Befehlsgruppe: Datentransferbefehl
Adressierung: implizit
Beeinflusste Flags im Statusregister:
Negative-Flag
Zero-Flag
Taktzyklen: 4



Der Assembler-Befehl PLA erhöht den Stapelzeiger (Stackpointer) um 1 und danach wird der Akkumulator mit dem Inhalt der Speicherzelle, auf die der Stapelzeiger (Stackpointer) zeigt, geladen.
Der Programmierer muss darauf achten, dass alle Bytes, die mit PHA während eines Unterprogramms auf den Stapel gelangen, wieder mit dem Befehl PLA, PLP oder durch direkte Manipulation des Stackpointer-Registers entfernt werden, bevor der Rücksprung mittels RTS erfolgt.

Im Gegensatz zum PHA benötigt dieser Befehl einen Taktzyklus mehr, da für den Zugriff auf den Wert vorher zuerst der Stapelzeiger erhöht werden muss, was aufeinanderfolgend abzuarbeiten ist und damit eine etwaige Parallelisierung im Ablauf zunichte macht.

Funktionsprinzip

Ass befehl 68.gif

Bedeutung der Buchstaben im Befehl

PLA PulL Accumulator from Stack
Hole Akkumulator vom Stapel

Beispiel

; Dieses Programm wartet auf einen Tastendruck.
; Die Register Akku, X und Y werden am Beginn gesichert und am Ende wieder herstellt.
; Programmstart mit SYS 49152

*=$c000   ; Startadresse des Programms

GETIN = $ffe4

start     pha            ; Akku am Stapel sichern.
          txa
          pha            ; X-Register am Stapel sichern.
          tya
          pha            ; Y-Register am Stapel sichern.

eingabe   jsr GETIN      ; Zeichen einlesen (veränderte Register A, X, Y)
          beq eingabe    ; warte auf Tastendruck

          pla
          tay            ; Y-Register wiederherstellen
          pla
          tax            ; X-Register wiederherstellen
          pla            ; Akku wiederherstellen

          rts            ; Rücksprung ins BASIC


.c000 48        pha
.c001 8a        txa
.c002 48        pha
.c003 98        tya
.c004 48        pha
.c005 20 e4 ff  jsr $ffe4
.c008 f0 fb     beq $c005
.c00a 68        pla
.c00b a8        tay
.c00c 68        pla
.c00d aa        tax
.c00e 68        pla
.c00f 60        rts

Vergleich des Beispielprogramms mit BASIC

Für BASIC V2:

10 S$=A$                     : REM A$ in der Variable S$ zwischenspeichern
20 GET A$
30 IF A$="" THEN 20          : REM warte auf Tastendruck
...
...
40 A$=S$                     : REM A$ wiederherstellen

Es wird hier vereinfacht die Zwischenspeicherung im Gegensatz zum Assembler-Beispiel nicht wirklich auf einem variablen Stack, sondern mit einer fest vorgegebenen Variable realisiert.

Beispielprogramme