Autor Thema: Make- u. Brakecodes ?  (Gelesen 7437 mal)

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« 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...

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #1 am: 06. January 2006, 09:21 »
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 ?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 06. January 2006, 09:52 »
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,

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #3 am: 06. January 2006, 09:54 »
: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

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 06. January 2006, 09:58 »
void irq1_handler() {
unsigned char scancode = inb(0x60);

if(scancode & 0x80) {
// taste wurde losgelassen
}else{
// taste wurde gedrückt
}
}

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #5 am: 06. January 2006, 10:05 »
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 ?

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 06. January 2006, 10:12 »
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.

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #7 am: 06. January 2006, 10:15 »
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*

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 06. January 2006, 10:19 »
Hm, ich habe mich noch nicht so stark mit der Tastatur beschäftigt, aber ich glaube, du musst warten, bis noch ein Interrupt auftritt.

ScAr_TeX

  • Beiträge: 25
    • Profil anzeigen
    • ScAr_TeX's Homepage
Gespeichert
« Antwort #9 am: 06. January 2006, 10:20 »
Werd' ich mal zu Haus' ausprobieren...

Vielen Dank für deine Hilfe (speziel für den Code), hat mir sehr weitergeholfen.

*thx*

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #10 am: 06. January 2006, 18:02 »
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
In the Future everyone will need OS-64!!!

 

Einloggen