EOR (RAUTE)$nn
Aus C64-Wiki
Zur Navigation springenZur Suche springenMnemonic: | EOR #$nn |
Opcode: | $49 |
Operand(en): | $nn |
Anzahl der Bytes: | 2 |
Befehlsgruppe: | Arithmetik und Logikbefehl |
Adressierung: | unmittelbar |
Beeinflusste Flags im Statusregister: | |
Negative-Flag | |
Zero-Flag | |
Taktzyklen: | 2 |
Der Assembler-Befehl EOR #$nn führt eine bitweise EXKLUSIV-ODER-Verknüpfung mit dem Akkumulator und einer Konstanten $nn durch.
Das Ergebnis wird im Akkumulator gespeichert. Dieser Befehl eignet sich besonders zum Invertieren einzelner Bits.
Wahrheitstabelle der EXKLUSIV-ODER-Verknüpfung
Das Ergebnis ist bei der EXKLUSIV-ODER-Verknüpfung gleich 1, wenn beide Bits unterschiedlich sind.
0 | 0 | = | 0 |
0 | 1 | = | 1 |
1 | 0 | = | 1 |
1 | 1 | = | 0 |
Funktionsprinzip
Bedeutung der Buchstaben im Befehl
EOR | Exclusive OR with Accumulator |
Bitweise EXKLUSIV-ODER-Verknüpfung mit Akkumulator |
Beispiele
Bildschirminvertieren
; Dieses Programm invertiert den gesamt Bildschirm. ; Programmstart mit SYS 49152 *=$c000 L_BLOCK = $fb H_BLOCK = $fc H_BILDSCHIRM = $0288 start lda #$00 sta L_BLOCK ldy H_BILDSCHIRM sty H_BLOCK ; Startadresse des Bildschirmspeichers in $fc/$fb tax ; X=0 tay ; Y=0 schleife lda (L_BLOCK),Y ; Zeichen lesen eor #%10000000 ; invertiere Bit7 (Reverse-Bit) sta (L_BLOCK),Y ; Zeichen schreiben iny bne schleife ; verzweige solange Y<>0 (256 Bytes) inc H_BLOCK ; erhöhe High-Byte der Bildschirmspeicheradresse inx cpx #$04 ; 4 Pages bne schleife ; verzweige solange X<>4 rts ; Rücksprung zu BASIC
Speicherauszug:
.c000 a9 00 lda #$00 .c002 85 fb sta $fb .c004 ac 88 02 ldy $0288 .c007 84 fc sty $fc .c009 aa tax .c00a a8 tay .c00b b1 fb lda ($fb),y .c00d 49 80 eor #$80 .c00f 91 fb sta ($fb),y .c011 c8 iny .c012 d0 f7 bne $c00b .c014 e6 fc inc $fc .c016 e8 inx .c017 e0 04 cpx #$04 .c019 d0 f0 bne $c00b .c01b 60 rts
Negation
Befindet sich im Akku ein Wert, der von einem anderen Wert subtrahiert werden soll, kann dies auch ohne umständliches Umspeichern erfolgen, indem der Wert vorher negiert wird.
ADR_L = $fb ADR_H = ADR_L+1 ; Unterprogramm subadr: ADR_L/ADR_H um Wert in A (Akku) vermindern. ; Eingabe: A (Akku) ; ADR_L/ADR_H ; Ausgabe: ADR_L/ADR_H subadr eor #$ff ; Komplement bilden ... sec ; +1 -> Zweierkomplement adc ADR_L ; = Negation von A sta ADR_L ; -A + ADR_L/ADR_H ; entspr. ADR_L/ADR_H - A bcs + ; Subtraktionsübertrag dec ADR_H ; im High-Byte berücksichtigen + rts
Vergleich des Beispielprogramms mit BASIC
Für BASIC V2:
10 ADR = -A + ADR
Entsprechend obigem Negations-Beispiel.
Da BASIC V2 keinen direkten XOR-Operator hat, muss dieser mittels anderer Logikoperatoren zusammengestellt werden, wie bei den XOR-Beispielen gezeigt wird.