Hallo,
ich bin nun wieder dabei für mein RM OS einen Tastaturtreiber in ASM zu schreiben.
Aber wieder das gleiche Problem, wie vor einem Jahr: Er geht nicht.
Das letzte Mal hatte ich auch einen Thread aufgemacht, leider kam es da zu keinem Ergebniss.
Deshalb versuche ich es hier erneut.
Code:
Das Problem ist bei der INt 16H Routine.
ich biege den INT 16H um und rufe ihn auf.
Doch anstatt einen ASCII Code zurückzuliefern, besteht eine Endlosschleife.
Der INT16H fragt das Byte "scan" ab. In dieses wird vom INT 9 der ASCII Code hineingeschrieben, wenn eine Tatse gedrückt worden ist.
Die segmentregister sind alle gleich, da dr gesamte Code im Bootloader an 07C0H:0H ist.
Das komische:
Führe ich den Code
Außerhalb einer Interrupt Routine aus, so funktioniert er schon.
Anzumerken ist, dass ich den BOCHS Emulator benutze.
ich bin nun wieder dabei für mein RM OS einen Tastaturtreiber in ASM zu schreiben.
Aber wieder das gleiche Problem, wie vor einem Jahr: Er geht nicht.
Das letzte Mal hatte ich auch einen Thread aufgemacht, leider kam es da zu keinem Ergebniss.
Deshalb versuche ich es hier erneut.
Code:
Code: [Auswählen]
[...]
CLI
MOV WORD [ES:6H*4],INT6H
MOV WORD [ES:6H*4+2],CS
MOV WORD [ES:4*9h],int9h
MOV WORD [ES:4*9h+2],CS
MOV WORD [ES:4*16h],int16h
MOV WORD [ES:4*16h+2],CS
MOV AX,9000H
MOV SS,AX
MOV SP,200H
STI
int 16h
[...]
int16h:
tests:
CMP BYTE [ds:scan], 0
MOV AH, 0eh
mov al, "W"
int 10h
JE tests
MOV AH, 0eh
mov al, [scan]
int 10h
iret
;hier beginnt der Keyboardtreiber
int9h:
pusha ;alle Register retten
;PUSH ES
;PUSH DS
MOV AX,CS
MOV ES,AX
MOV DS,AX
in AL,60h ;Port 60 lesen
;and AL,AL ;AND mit sich selbst - setzt "Sign" Flag, wenn >=128
;js Weiter ;Taste losgelassen - also nichts tun
cmp al,129
JAE Weiter
;:::::::::::::
;Hier das tun, was immer man tun will, wenn einer ne Taste drückt.
mov bl,al
lea si,[scancode]
check_scan:
lodsb
cmp bl,al
JE scan_ok
cmp word [si],0AAAAh
JE Weiter
inc si
inc si
inc si
jmp check_scan
scan_ok:
lodsb
mov byte [scan],al
;:::::::::::::
Weiter: ;hierhin wird gesprungen, wenn nur losgelassen
mov AL,20h ;Code 20h für "reset PIC"
out 20h,AL ;in den PIC (Port 20h) schreiben
;POP DS
;POP ES
popa ;alle Register wiederholen
iret ;und Int beenden
;Scancodes deutsche tastatur
scan db 0
scancode:
db 10h,"q","Q","@"
db 11h,"w","W",0
db 12h,"e","E",238
db 13h,"r","R",0
db 14h,"t","T",0
db 15h,"z","Z",0
db 16h,"u","U",0
db 17h,"i","I",0
db 18h,"o","O",0
db 1ch,13,0,0
dw 0aaaah
DB 510-$ DUP(0)
DW 0AA55h
Das Problem ist bei der INt 16H Routine.
ich biege den INT 16H um und rufe ihn auf.
Doch anstatt einen ASCII Code zurückzuliefern, besteht eine Endlosschleife.
Der INT16H fragt das Byte "scan" ab. In dieses wird vom INT 9 der ASCII Code hineingeschrieben, wenn eine Tatse gedrückt worden ist.
Die segmentregister sind alle gleich, da dr gesamte Code im Bootloader an 07C0H:0H ist.
Das komische:
Führe ich den Code
Code: [Auswählen]
tests:
CMP BYTE [ds:scan], 0
MOV AH, 0eh
mov al, "W"
int 10h
JE tests
MOV AH, 0eh
mov al, [scan]
int 10h
Außerhalb einer Interrupt Routine aus, so funktioniert er schon.
Anzumerken ist, dass ich den BOCHS Emulator benutze.

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert

