Autor Thema: KeyboardTreiber  (Gelesen 3327 mal)

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« am: 06. March 2005, 10:18 »
hallo,

so, jetzt hab ich mich auchmal dazu durchgerungen, einen KeyboardTreiber zu bauen. hat bisher auch sehr gut funktioniert, bin gerade dabei, das mit den Lämpchen zu machen... ich hab mir ein byte geschaffen, dass die werte der steuertasten (alt, strg, shift, scroll und num) aufnimmt und im oberen teil (den restlichen 3 bits) die flags für die kleinen lämpchen... das ganze is so aufgebaut:

(7) CapslockLight | (6) NumLight | (5) ScrollLight | (4) Strg | (3) Scroll | (2) Num | (1) Alt(Gr) | (0) Shift

es funktioniert alles wunderbar, er switcht zwischen den tastensets (normal, shift, alt(gr)) und soweiter. nun will ich also die lämpchen schalten und mache das hiermit:

irq0x01_waitforkeyb1:
in al,0x64
and al,0x02
jnz irq0x01_waitforkeyb1
mov al,0xED
out 0x60,al
irq0x01_waitforkeyb2:
in al,0x64
and al,0x02
jnz irq0x01_waitforkeyb2
mov al,[io_keyboard_status]
shr al,0x05
out 0x60,al    

problem is, dass er das garnet mag. bochs sagt:
Zitat
00014900021p[KBD  ] >>PANIC<< internal keyboard buffer full (imm)
mein echter PC reagiert einfach nichtmehr. der code schaut, ob der buffer leer is, wenn ja schreibt er seinen command rein, schaut wieder, ob er leer is, und schreibt dann die parameter rein. es funktioniert auch, in real wird das capslocklämpchen angeknipst, wenn ich auf capslock drück, aber leider halt nur einmal und danach regiert er nimmer. wo liegt mein problem? ich hab die infos aus einem buch und einem tut (http://www.nondot.org/sabre/os/files/HCI/keyboard2.txt) wo es exakt so drinne steht...

danke für hilfe,

J!N[/url]
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #1 am: 09. March 2005, 14:40 »
hm... eigendlich nein... ich weiß nur, dass bochs diese schleife exakt 24 mal ausführt und beim 25. mal abkackt... ich frag mich auch, wieso das so oft ausgeführt wird, wenn ich nur eine taste drücke... hm, es könnte also schon eine endlosschleife sein, aber warum geht das dann bei anderen? ich werd mal nochmal alles durchgehen und euch dann sagen, ob es eine endlosschleife ist, oder ob bochs irgendwo her diese ganzen dinger holt. ich dachte halt, dass bochs den buffer als voll erachtet, wenn ich was reinschreibe und dann vll. gleich wieder das irq auslöst und es dann kracht... mal sehen.
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #2 am: 10. March 2005, 18:11 »
also ich habe jetzt nochmal nachgeforscht. also das werte teil wird ja ausgelöst, wenn eine taste gedrückt oder losgelassen wird. und da scheint das problem zu sein. wenn man die taste loslässt kommt man wieder zu der passage. allerdings wird der iret danach zu einem unfreundlichen ziel geführt, irgendwo in den busch (dieser busch ist, wie ich gerade herausfand einer meiner funktionen :D)... und dann wird das int nochn bisschen öfters ausgefürt (kA, warum) und dann krachts... also am stack liegt es nicht, da würde es sonst schon früher krachen... das int wird öfters aufgerufen und als "wert" is 0xFA... das ist kein scancode! und das is öfters und naja... ich werd mal googlen, was der wert zu bedeuten hat weiß jemand ggf. was?
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #3 am: 22. March 2005, 16:43 »
Achja 0xFA steht übrigens für Acknowledge das soll eine Bestätigung sein, das ein befehl ausgeführt wurde bzw. ein datenbyte abgeholt wurde.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #4 am: 23. March 2005, 09:35 »
ah, danke...
ich hab meinen code etz umgebaut. da ich nicht an meinem PC mit dem code sitz, weil ich im urlaub bin kann ich nur pseudocode posten:


warten_auf_inputbuffer_leer
mov al,0xED
out 0x60,al
in al,0x60
warten_auf_inputbuffer_leer
mov al,[tastaturlampenstatus]
out 0x60,al
warten_auf_inputbuffer_leer


funktioniert 8 tastendrücke lang, beim 9. kommt wieder der "tastaturbuffer voll"-fehler...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

joachim_neu

  • Beiträge: 1 228
    • Profil anzeigen
    • http://www.joachim-neu.de
Gespeichert
« Antwort #5 am: 08. April 2005, 12:35 »
erst, wenns geht...
http://www.joachim-neu.de | http://www.orbitalpirates.de | http://www.middleageworld.de

System: 256 RAM, GeForce 2 MX 400, AMD Athlon XP 1600+, Windows XP, 1x Diskette, 1x DVD-ROM, 1x CD-R(W) Brenner,...

 

Einloggen