LSR

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Begriffsklärung Der Titel dieses Artikels ist mehrdeutig. Weitere Bedeutungen finden sich unter LSR (Begriffsklärung).
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

Ass befehl 4a.gif

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.

Beispielprogramme