Server read only due to being migrated.


Das Wiki ist im Nur-Lese-Modus, da es gerade migriert wird.

BNE $hhll

Aus C64-Wiki
(Weitergeleitet von bne)
Zur Navigation springenZur Suche springen
Mnemonic: BNE $hhll
Opcode: $D0
Operand(en): $nn
Anzahl der Bytes: 2
Befehlsgruppe: Sprungbefehl
Adressierung: relativ
Beeinflusste Flags im Statusregister:
keine
Taktzyklen: 2
1 Extratakt bei Sprung
1 Extratakt bei Überschreitung einer Page-Grenze
1 PC R Lese Befehl, inkrementiere PC
2 PC R hole Operand, inkrementiere PC
3 PC R lese Opcode des nächsten Befehls;
wird Sprung ausgeführt,
addiere Operand zu PCL
4+ PC R lese Opcode des nächsten Befehls;
korrigiere PCH; hat er sich nicht geändert,
inkrementiere PC
5! PC R lese Opcode des nächsten Befehls,
inkrementiere PC
Anmerkung: Der Opcode-Ladezyklus des nächsten Befehls
ist nur zu Demonstrationszwecken angegeben.
Zur Berechnung der Zyklenzahl nicht verwenden.
Anmerkung: * Das Highbyte des Programmzählers (PCH)
kann zu diesem Zeitpunkt ungültig sein,
z.B. um 256 Bytes zu hoch oder niedrig.
Anmerkung: + Dieser Zyklus wird beim Sprung ausgeführt
Anmerkung: ! Führt der Sprung zu einer anderen Seite,
wird dieser Zyklus ausgeführt


Der Assembler-Befehl BNE $hhll verzweigt zur Adresse $hhll (als neuer Wert des Programmzählers PC), wenn das Ergebnis der letzten Operation ungleich $00 ist, was mit Zero-Flag = 0 angezeigt wird.
Es ist bei der relativen Adressierung darauf zu achten, dass sich das Sprungziel innerhalb des gültigen Adressbereiches befindet!

Funktionsprinzip

Fehler beim Erstellen des Vorschaubildes: Die Miniaturansicht konnte nicht am vorgesehenen Ort gespeichert werden

Bedeutung der Buchstaben im Befehl

BNE Branch on Not Equal
Verzweige bei Ungleichheit (<>0)

Beispiel

; Dieses Programm wartet bis die Taste "S" gedrückt wurde.
; Programmstart mit SYS 49152

*=$c000                  ; Startadresse des Programms

PRA  =  $dc00            ; CIA#1 (Port Register A)
DDRA =  $dc02            ; CIA#1 (Data Direction Register A)

PRB  =  $dc01            ; CIA#1 (Port Register B)
DDRB =  $dc03            ; CIA#1 (Data Direction Register B)


start    sei             ; Interrupts sperren

         lda #%11111111  ; CIA#1 Port A = Ausgänge 
         sta DDRA             

         lda #%00000000  ; CIA#1 Port B = Eingänge
         sta DDRB             

         lda #%11111101  ; Spalte 1 (COL1) der Matrix testen
         sta PRA
            
loop     lda PRB
         and #%00100000  ; Reihe 5 (ROW5) maskieren
         bne loop        ; Warte bis "S" gedrückt

         cli             ; Interrupts zulassen

ende     rts             ; Zurück zu BASIC

Speicherauszug:

.c000  78         sei
.c001  a9 ff      lda #$ff
.c003  8d 02 dc   sta $dc02
.c006  a9 00      lda #$00
.c008  8d 03 dc   sta $dc03
.c00b  a9 fd      lda #$fd
.c00d  8d 00 dc   sta $dc00
.c010  ad 01 dc   lda $dc01
.c013  29 20      and #$20
.c015  d0 f9      bne $c010
.c017  58         cli
.c018  60         rts

Vergleichbare BASIC-Anweisung

Für BASIC V2:

10 IF ER <> 0 GOTO 50  : REM Wenn Ergebnis ungleich 0, springe nach 50

Beispielprogramme