Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: ScAr_TeX am 05. January 2006, 10:14
-
Guten Morgen !
Ich hab' folgendes Problem:
Ich sehe einfach nicht mehr durch, mit diesen Make- u. Brakecodes der Tastatur.
Wenn man(n) z.B. 'A' drückt, steht bei mir 'A'. :idea:
Lasse ich aber z.B. die Taste wieder los, wird ja ein Break-Code gesendet.
Aber irgendwie bekommt mein OS dass nicht mit, besser gesagt es bekommt es mit, ich kann aber nicht zw. Drücken und Loslassen unterscheiden.
Also, wie bekomme ich dass hin, dass mein OS feststellt, ob losgelassen oder gedrückt wurde ?
Helft mir :)
Danke im Vorraus...
-
Tut mir echt leid, aber irgendwie verstehe ich dass jetz' nicht :oops:
Also du meinst, der Keyboard-Controller sended für jede Aktion ein extra Byte an irgendein Port (z.B. 0x64), oder wie ?
-
Toaster bezog sich auf Windows, Windows verarbeitet aber die Codes auch erstmal, bevor es die Messages sendet.
Die Brakecodes sehen genauso aus wie die Makecodes, nur haben sie das Bit 0x80 gesetzt,
-
:oops: :oops: :oops: ???
Ich versteh' es immer noch nicht, könnteste mal Beispiel-Code posten ?
Wo ist das Bit gesetzt ?
*man bin ich dumm* :P
-
void irq1_handler() {
unsigned char scancode = inb(0x60);
if(scancode & 0x80) {
// taste wurde losgelassen
}else{
// taste wurde gedrückt
}
}
-
Werd' mal zu hause gucken, ob das funzt. :shock:
Danke !!!
Hab mal noch ne' frage:
Wie ist dass mit den Strg, Alt, etc. Tasten ?
Die Senden doch auch einen Break-Code wenn sie gedrückt sind,
wie funzt denn dass ?
-
Soweit ich weiß musst du dir selber im Tastaturtreiber merken, ob STRG, ALT usw. gedrückt wurden, die Scancodes werden nicht automatisch verändert, wenn STRG, ALT, SHIFT usw. gedrückt werden.
-
Neee, ich meine, wenn ich 'A' drücke dann bekomme ich über Port 0x64 ein Byte dass mir sagt dass ich 'A' gedrückt habe.
Drücke ich aber z.B. STRG dann steht laut meinen Informationsmeterialien ein 2-Byte Code.
Meine Frage ist jetz, wie ich dass Auslesen kann !
Wenn ich nähmlich 2x ein Byte von 0x64 auslese bekomme ich nicht dass gewünschte ergebniss. *heul*
-
Hm, ich habe mich noch nicht so stark mit der Tastatur beschäftigt, aber ich glaube, du musst warten, bis noch ein Interrupt auftritt.
-
Werd' ich mal zu Haus' ausprobieren...
Vielen Dank für deine Hilfe (speziel für den Code), hat mir sehr weitergeholfen.
*thx*
-
Also ich habe mir einen Tastaturtreiber geschrieben (bzw. abgekauft ;) ). Wenn du eine Taste drückst wird der IRQ1 aufgerufen. Das ist ja ein Hardwareinterrupt. Also wissen wir das du am ende schon mal ein EOI senden musst. Die normalen Tasten (z.B. A-Z, a-z, 0-9) senden beim drücken nur einen IRQ1. Aber wenn du losläßt wird wieder einer gesendet. Das heißt, wenn du eine Tastedrückst und losläßt wird der IRQ1 zwei mal aufgerufen. Das 8. Bit ist gesetzt wenn eine Taste losgelassen wurde. Aber bei STRG usw. sieht das anders aus. Da wird der IRQ1 öffters aufgerufen. Wenn du die Kombination STRG+ALT+ENF verwenden willst, musst du 3 Variablen haben (im RM solltest du die in der BIOS Data Area verwenden, weil dann auch der int 16h funktioniert.). Der Tastaturcontroller ist ziemlich leicht zu verstehen. Das Problem ist nur die Kompaktheit. Deswegen habe ich mir auch meinen Code gekauft ;) .Der kleinste IRQ1 Code müsste also so aussehen (in ASM):
IRQ1-Code:
pusha
in al,60h
mov al,20h ;EOI
out 20h,al
popa
iret
Die Codes werden an den Port 60h gesendet. Das sind immer Scancodes die du in ASCII auch noch umwandeln musst. Mein Code hat ca. 1000 Zeilen. Du musst nämlich sämtliche Überprüfungen machen. Z.B. ob du Make oder Break hast, ob die Leuchten an oder ausgeschaltet werden sollen. Du musst den Status in Variablen packen wie ich oben schon gesagt habe. Viel Erfolg
bitmaster