EOR (RAUTE)$nn

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Mnemonic: 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

Ass befehl 49.gif

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.

Beispielprogramme