LSR $ll

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: LSR $ll
Opcode: $46
Operand(en): $ll
Anzahl der Bytes: 2
Befehlsgruppe: Rotations- und Schiebebefehl
Adressierung: Zeropage
Beeinflusste Flags im Statusregister:
Carry-Flag
Negative-Flag
Zero-Flag
Taktzyklen: 5


Der Assembler-Befehl LSR $ll verschiebt die acht Bits des Zeropage-Speicherstelleninhalts $ll um eine Bit-Position nach rechts (von den höherwertigen zu den niederwertigen Bits). Das höchstwertige Bit wird 0 und das herausfallende Bit wird im Carry-Flag aufgefangen.
Damit teilt dieser Befehl den Inhalt der Speicherstelle durch 2. Der Divisionsrest wird im Carry-Flag abgebildet.

Das Negative-Flag wird dabei immer zurückgesetzt, da das Ergebnis stets einem positiven Wert entspricht.
Die zu dieser logischen Operation korrespondierende arithmetische Operation (ein hypothetischer ASR-Befehl) ist nicht implementiert und muss entsprechend ausprogrammiert werden (siehe ASL-Beispiel).

Funktionsprinzip

Ass befehl 46.gif

Bedeutung der Buchstaben im Befehl

LSR Logical Shift Right
Logisches Rechts-Schieben

16-Bit-Rechtsschieben

Dieses Programmfragment dividiert den vorzeichenlose 16-Bit-Wert an Speicherstelle $0022/$0023 durch 2 und zeigt dabei die Kaskadierung für über 8 Bit hinausgehende Werte.

*=$c000   ; Startadresse des Programms

              lsr $23          ; höherwertiges Byte in Zeropage, Bit 0 im Carry,
              ror $22          ; niederwertiges Byte, nimmt das Carry mit,
                               ; Carry-Flag enthält den Rest der Division

Speicherauszug:

.c000	 46 23		lsr $23
.c002	 66 22		ror $22

Speicherstellen-Flag löschen

Ein billige Variante ein Flag zu führen, ist dieses als Bit7 einer Speicherstelle auszulegen. Gelöscht kann es ohne ein Register zu verändern wie folgt:

*=$c000   ; Startadresse des Programms

              lsr $0d          ; Flag in Bit7 auf 0 setzen
              ...
              bit $0d          ; Flag prüfen
              bmi gesetzt      ; Flag gesetzt!
              ...
gesetzt:

Speicherauszug:

.c000	 46 0d		lsr $0d
...
.c0XX	 24 0d		bit $0d
.c0YY	 30 ZZ		bmi $c0ZZ
...
.c0ZZ

Beispielprogramme