Also, nachdem ich das Problem mit dem Interrupt nicht lösen konnte, versuche ich es nun komplizierter:
Ich mache, wenn ich ein Zeichen einlesen will, einen FAR CALL auf eine Adresse, die in der VAriable GET_CHAR liegt.
Das entsprechende CS steht in der VAriable GET_CHAR_CS.
Soweit so gut.
Lese ich nun so ein Zeichen ein, funktioniert alles.
Sobald ich allerdings meinen Tastaturtreiber starte, und mit einem FAR CALL anspringe, geht nix mehr.
Der Tastaturtreiber setzt die beiden VAriablen
GET_CHAR
GET_CHAR_CS
neu und füllt sie eben mit den DAten des Treibers.
Zur Veranschaulichung mal der Code:
Keyboard_driver:
PUSHA
PUSH ES
PUSH DS
MOV AX,CS
MOV ES,AX
MOV DS,AX
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
MOV BX,GETC
MOV AX,CS
MOV AX,07c0h
MOV DS,AX
MOV AX,CS
MOV [DS:153h],AX
MOV [DS:151h],BX
POP DS
POP ES
POPA
RETF
GETC:
CMP BYTE [scan],0
JE GETC
MOV AL,[scan]
MOV BYTE [scan],0
RETF
Bei dem obigen Code werden eben die VAriablen neu gesetzt.
Die FUnktion GETC liest eben ein Zeichen ein.
Das funktioniert noch.
JEtzt der Treibercode:
;hier beginnt der Keyboardtreiber
int9h:
pusha ;alle Register retten
[b]PUSH ES
PUSH DS[/b]
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
[b]POP DS
POP ES[/b]
popa ;alle Register wiederholen
iret ;und Int beenden
Es kommt hier maßgeblich auf das fett markierte an.
Lasse ich nämlich die POP und PUSH Befehle im Code stehen (muss ich ja), geht nix mehr.
Lasse ich sie weg, kann ich Zeichen einlesen.
Es tritt dann zwar auch unerklärliche fehler auf, aber erstmal muss das gelöst werden.
Ich verstehs überhaupt nicht, wo da ein Fehler sein kann.
Mein Stack liegt bei 9000h:200h. Da ist afaik kein BIOS Kram oder sonstiger reservierter Speicher.
Übrigens:
Sichere ich die beiden Segmentregister mittels:
MOV CX,DS
MOV BX,ES
und schreibe sie dementsprechend zurück, geht es auch nicht.