DEC $ll

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Mnemonic: DEC $ll
Opcode: $C6
Operand(en): $ll
Anzahl der Bytes: 2
Befehlsgruppe: Arithmetik- und Logikbefehle
Adressierung: Zeropage
Beeinflusste Flags im Statusregister:
Negative-Flag
Zero-Flag
Taktzyklen: 5


Der Assembler-Befehl DEC $ll vermindert den Inhalt der Zeropage-Adresse $ll um 1.
Bei einer Verminderung des Wertes 0 wird der neue Wert wieder 255 ($ff).

Funktionsprinzip

Ass befehl c6.gif

Bedeutung der Buchstaben im Befehl

DEC DECrement Memory
Vermindere Speicherzelle

Beispiele

Hinweis: Diese Beispiele befinden sich derzeit noch nicht in der unter Weblinks angegebenen Beispielprogrammsammlung.

Einzelnes Byte

           dec $02      ; Vermindert den Inhalt von $0002 um eins.

16-Bit

Der 16-Bit-Wert befindet sich in den Speicherstellen COUNT (Low-Byte) und COUNT+1 (High-Byte).

           lda count     ; Low-Byte
           bne +         ; =0?
           dec count+1   ; ja, dann Unterlauf 0->255 und High-Byte auch vermindern
+          dec count     ; Low-Byte vermindern

Nachteil: eine Register (hier Akkumulator) wird benötigt und wird damit "zerstört" (auch anderes Register, falls frei, verwendbar, wie X-Register oder Y-Register). Außerdem ist es nicht symmetrisch zum Inkrementieren mit INC, weil zusätzlich das Low-Byte vorher auf Unterlauf überprüft werden muss. Aber es gibt eine verbesserte, schnellere Variante mit einem anderen Ansatz.

8/16-Bit-Subtraktion

Klassischer Fall, bei dem ein 8-Bit-Wert von einem 16-Bit-Wert subtrahiert werden soll:

           sec           ; ohne Übertrag
           lda adresse   ; Grafikadresse
           sbc #$08      ; Block nach links
           bcs +         ; Unterlauf?
           dec adresse+1 ; Unterlauf ins High-Byte
+

16-Bit verbessert

Wird der Zähler count anders organisiert, nämlich das High-Byte ist um +1 versetzt geführt und Low-Byte 0 entspricht 256, kann 'DEC ohne vorherige Unterlaufüberprüfung kaskadiert werden. Lediglich der Anfangswert muss dementsprechend (einmalig) vorbereitet werden:

init       lda count     ; Low-Byte
           beq +         ; wenn 0, High-Byte belassen
           inc count+1   ; sonst High-Byte korrigieren
+
...
schleife   ...           ; count mal durchlaufen
...
           dec count     ; Low-Byte
           bne schleife  ; Unterlauf bei 1->0 (statt 0->255)
           dec count+1   ; Unterlauf ins High-Byte
           bne schleife  ; fertig bei 0

Vergleich des Beispielprogramms mit BASIC

Für BASIC V2, zugehörig zum ersten Beispiel "Einzelnes Byte":

10 POKE 2, PEEK(2) - 1 AND 255: REM AUF BYTEWERT MASKIEREN 0-255

Weblinks