DEC $ll
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
Bedeutung der Buchstaben im Befehl
DEC | DECrement Memory |
Vermindere Speicherzelle |
Beispiele
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