BNE $hhll
Aus C64-Wiki
Zur Navigation springenZur Suche springenMnemonic: | 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
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