Hi,
ich bin gerade dabei am einem Real-Mode Programm zu basteln und brauche
dafür Tastatur-Eingabe. Die Funktion 11h aus int 16h scheint dafür
perfekt zu sein. Jedoch habe ich ein paar Probleme damit.
In einer Schleife (beginnt bei "footer:") hole ich Zufallszahlen und
nehme die für die Farbe für ein paar Zeichen die immerwieder geschrieben
werden. Das funktioniert soweit wie es soll. Jetzt sollen da aber noch
ein paar Tastendrücke ausgewertet werden, also springt die Schleife auf
noch in jedem Durchlauf nach "keyboard_handler".
Dort wird int 16h/funktion 11h aufgerufen. Die Funktion wartet nicht auf
einen Tastendruck, sondern setzt das Zero Flag oder nicht.
Das will ich auswerten an der Stelle direkt nach "int 0x16".
Eigentlich müsste da doch ein JZ (jump if zero) hin? Denn wenn ich da
ein JZ habe, dann springt er sofort nach gotkey, auch wenn nichts
gedrückt wurde. Mit JNZ springt er erst beim ersten Tastendruck dorthin.
Dann allerdings die ganze Zeit, bei jedem Durchlauf wieder.
Ich hoffe, ich habe die Dokumentation richtig verstanden... Zwei Fragen
ergeben sich jetzt. Wieso JNZ statt JZ? Wie sage ich dem BIOS, dass ich
den Tastendruck abgeholt habe und nicht dauernd wieder nach gotkey
laufen will?
1 | keyboard_handler:
|
2 | mov ah, 0x11 ; get keyboard status without wait
|
3 | int 0x16 ; on return: ZF=0 if key pressed (data waiting)
|
4 | ; AX=0 if no scan code avail
|
5 | ; AH=scancode
|
6 | ; AL=ascii char or special function key
|
7 | jnz gotkey
|
8 | nop
|
9 | ret
|
10 | gotkey:
|
11 | mov [rcv_key], al ; receive ascii code of pressed key
|
12 | mov dh, 6
|
13 | mov dl, 10
|
14 | call set_curs
|
15 | mov al, [rcv_key]
|
16 | mov bl, 0x47
|
17 | call put_char
|
18 | ret
|
19 | rcv_key db 0x00
|
20 |
|
21 |
|
22 | footer: mov dh, 20 ; row
|
23 | mov dl, 0 ; col
|
24 | call set_curs
|
25 | mov cx, 400 ; 80x5 = 400 chars
|
26 | loopfs: push ax
|
27 | push bx
|
28 | push cx
|
29 | push dx
|
30 | call rand ; 8bit rand in AL
|
31 | mov bl, al ; BL=color for put_char
|
32 | mov al, '%' ; char to put
|
33 | call put_char
|
34 | call inc_cursor
|
35 | call keyboard_handler
|
36 | pop dx
|
37 | pop cx
|
38 | pop bx
|
39 | pop ax
|
40 | loop loopfs
|
41 | .hang_forever: jmp footer
|
Ich Teste das ganze in qemu und ab und zu dann auf echter Hardware. Auf
beiden gab's schon unerwartete Phänomene...