Hi,
ich baue grad meinen Tastatur Treiber zusammen.
Ich lade meinen Treiber an die Stelle 7c0h:3600h.
Dort wird dann mittels:
Der Int 9h umgebogen und der int 16h
Im OS will ich dann in einem INT Aufruf ein Zeichen einlesen und ausgeben:
Dieser Int hätte die Nummer 02h.
Rufe ich ihn dann im OS auf:
Wird nichts ausgegeben.
Schreibe ich aber hingegen folgendes direkt im OS Code (wird also jetzt nicht als INT aufgerufen):
Geht es.
Ich benutzte BOCHS.
Woran kann das liegen?
Den Treiber schließe ich eigentlich aus, aber der Rest erscheint mir eigentlich ganz logisch und fehlerfrei.
?
Falls jemand den Treiber in Verdacht hat, hier mal der Code:
ich baue grad meinen Tastatur Treiber zusammen.
Ich lade meinen Treiber an die Stelle 7c0h:3600h.
Dort wird dann mittels:
Code: [Auswählen]
Keyboard_driver:
PUSH ES
PUSH AX
PUSH DS
MOV AX,0
MOV ES,AX
CLI
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
STI
POP DS
POP AX
POP ES
RET
Der Int 9h umgebogen und der int 16h
Im OS will ich dann in einem INT Aufruf ein Zeichen einlesen und ausgeben:
Code: [Auswählen]
rd_z:
;mov ah,0
;int 16h
CMP BYTE [scan],0h
JE rd_z
MOV AL,[scan]
MOV BYTE [scan],0h
mov ah,0eh
int 10h
POPA
iret
Dieser Int hätte die Nummer 02h.
Rufe ich ihn dann im OS auf:
Code: [Auswählen]
mov ah,02h
int 21h
Wird nichts ausgegeben.
Schreibe ich aber hingegen folgendes direkt im OS Code (wird also jetzt nicht als INT aufgerufen):
Code: [Auswählen]
rd_z1:
;mov ah,0
;int 16h
CMP BYTE [scan],0h
JE rd_z1
MOV AL,[scan]
MOV BYTE [scan],0h
mov ah,0eh
int 10h
jmp rd_z1
Geht es.
Ich benutzte BOCHS.
Woran kann das liegen?
Den Treiber schließe ich eigentlich aus, aber der Rest erscheint mir eigentlich ganz logisch und fehlerfrei.
?
Falls jemand den Treiber in Verdacht hat, hier mal der Code:
Code: [Auswählen]
Keyboard_driver:
PUSH ES
PUSH AX
PUSH DS
MOV AX,0
MOV ES,AX
CLI
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
STI
POP DS
POP AX
POP ES
RET
int16h:
; hier muss der BIOS INT 16H nacjhgebildet werden
;CMP AH,0h
;JnE int16h_nothing
PUSH ES
PUSH DS
PUSH AX
CHECK_SCAN:
CMP byte [scan],0
JE CHECK_SCAN
MOV AL,[scan]
MOV byte [scan],0
int16h_nothing:
POP AX
POP DS
POP ES
IRET
;hier beginnt der Keyboardtreiber
int9h:
pusha ;alle Register retten
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
popa ;alle Register wiederholen
iret ;und Int beenden

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken


Gespeichert