LSR
Mnemonic: | LSR |
2. Schreibweise: | LSR A |
Opcode: | $4A |
Anzahl der Bytes: | 1 |
Befehlsgruppe: | Rotations- und Schiebebefehl |
Adressierung: | Akku |
Beeinflusste Flags im Statusregister: | |
Carry-Flag | |
Negative-Flag | |
Zero-Flag | |
Taktzyklen: | 2 |
Der Assembler-Befehl LSR verschiebt die acht Bits des Akkumulators um eine Stelle nach rechts (von den höherwertigen zu den niederwertigen Bits). Das höchstwertige Bit wird 0 und das herausfallende Bit 0 wird im Carry-Flag aufgefangen.
Damit teilt dieser Befehl den Inhalt des Akkumulators 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
Bedeutung der Buchstaben im Befehl
LSR | Logical Shift Right |
Logisches Rechts-Schieben |
Beispiel
Vergleiche auch Beispiele bei LSR $ll.
; Diese Programm ist eine einfache Joystick-Abfrage des Controlports 2. ; Joystick auf/ab = Rahmenfarbe +/- ; Joystick links/rechts = Hintergrundfarbe +/- ; Feuerknopf = Ende ; Programmstart mit SYS 49152 *=$c000 ; Startadresse des Programms start lda $02 ; Zwischenspeicher in Zeropage cmp $dc00 beq start ; bleibe solange in Schleife bis sich Joystick-Register ändert. lda $dc00 ; Lade Akku mit Statusbyte des "Control Port 2" sta $02 ; Speichere Wert in Speicherzelle 2 lsr ; "Joystick oben"-Bit ins Carry-Flag schieben bcs weiter1 ; wenn Bewegung nicht nach oben --> keine Erhöhung der Rahmenfarbe inc $d020 ; Rahmenfarbe + 1 weiter1 lsr ; "Joystick unten"-Bit ins Carry-Flag schieben bcs weiter2 ; wenn Bewegung nicht nach unten --> keine Verminderung der Rahmenfarbe dec $d020 ; Rahmenfarbe - 1 weiter2 lsr ; "Joystick links"-Bit ins Carry-Flag schieben bcs weiter3 ; wenn Bewegung nicht nach links --> keine Erhöhung der Hintergrundfarbe inc $d021 ; Hintergrundfarbe + 1 weiter3 lsr ; "Joystick rechts"-Bit ins Carry-Flag schieben bcs weiter4 ; wenn Bewegung nicht nach rechts --> keine Verminderung der Hintergrundfarbe dec $d021 ; Hintergrundfarbe - 1 weiter4 lsr ; Feuerknopf-Bit ins Carry-Flag schieben bcs start ; wenn Feuerknopf nicht gedrückt --> verzweige zum Start rts ; Rücksprung ins BASIC
Speicherauszug:
.c000 a5 02 lda $02 .c002 cd 00 dc cmp $dc00 .c005 f0 f9 beq $c000 .c007 ad 00 dc lda $dc00 .c00a 85 02 sta $02 .c00c 4a lsr .c00d b0 03 bcs $c012 .c00f ee 20 d0 inc $d020 .c012 4a lsr .c013 b0 03 bcs $c018 .c015 ce 20 d0 dec $d020 .c018 4a lsr .c019 b0 03 bcs $c01e .c01b ee 21 d0 inc $d021 .c01e 4a lsr .c01f b0 03 bcs $c024 .c021 ce 21 d0 dec $d021 .c024 4a lsr .c025 b0 d9 bcs $c000 .c027 60 rts
Vergleich des Beispielprogramms mit BASIC
Für BASIC V2:
100 A=PEEK(56320) 110 IF A=W GOTO 100 120 W=A 200 A=A/2 : C=A-INT(A) : A=INT(A) : REM LSR 210 IF C GOTO 300 : REM CARRY 220 POKE 53280, (PEEK(53280)+1) AND 255 300 A=A/2 : C=A-INT(A) : A=INT(A) : REM LSR 310 IF C GOTO 400 : REM CARRY 320 POKE 53280, (PEEK(53280)-1) AND 255 400 A=A/2 : C=A-INT(A) : A=INT(A) : REM LSR 410 IF C GOTO 500 : REM CARRY 420 POKE 53281, (PEEK(53281)+1) AND 255 500 A=A/2 : C=A-INT(A) : A=INT(A) : REM LSR 510 IF C GOTO 600 : REM CARRY 520 POKE 53281, (PEEK(53281)-1) AND 255 600 A=A/2 : C=A-INT(A) : A=INT(A) : REM LSR 610 IF C GOTO 100 : REM CARRY
Dabei enthält die Variable C (entsprechend dem Carry-Flag) den Rest dessen Wert entweder 0 oder 0.5 ist.