Autor Thema: keyboard driver; port 0x61  (Gelesen 6200 mal)

Snake707

  • Beiträge: 20
    • Profil anzeigen
    • Spezi-OS
Gespeichert
« am: 28. May 2007, 11:52 »
So ich habe jetzt einen tastaturtreiber geschrieben; allerdings habe ich das problem, dass wenn ich die funktionen in einer Schleife verwende, ein Buchstabe mehrmals ausgelesen wird.

Das will ich nicht, ich will, dass danach einfach 0x00 aus dem Tastaturpuffer gelesen wird;

in einem tutorial wird das geschrieben:

int temp = inportb(0x61);
outportb(0x61,temp | 0x80);  // disable
outportb(0x61,temp & 0x7F);  // and re-enable
so das habe ich mit nasm versucht umzusetzen

  in al, 0x61; read
  mov ah, al
  or al, 10000000b
  out 0x61, al; disablen
  mov al, ah
  and al, 01111111b
  out 0x61, al; re-enablen

irgendwie funktioniert das nicht wie ich mir das vorstelle;
wie kann ich es denn umgehen, dass das zeichen, dann mehrmals ausgelesen wird, muss ich dann unbedingt auf die break codes warten???
SpeziOS und meine Freundin sind leider unvereinbar. Schade. Obwohl sie auch auf die Spezi geht. Nunja Chemiker und Biologen.

Physik ist nach wie vor die wichtigste Wissenschaft

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 28. May 2007, 15:58 »
allerdings habe ich das problem, dass wenn ich die funktionen in einer Schleife verwende, ein Buchstabe mehrmals ausgelesen wird.
nutzt du auch port 0x64? Da gibts nämlich ein Bit, welches angibt, ob ein neues Zeichen in port 0x60 ist oder nicht. Aber eigentlich solltest du sowieso kein Polling für die Tastatur benutzen...
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Snake707

  • Beiträge: 20
    • Profil anzeigen
    • Spezi-OS
Gespeichert
« Antwort #2 am: 28. May 2007, 17:19 »
hi,

thx; das heißt also:
ich brauche nur das besagte bit bei 0x64 zu prüfen. Also über
in al, 0x64

und dann überprüfen
ok thx

EDIT: Welches bit soll das genau sein?
« Letzte Änderung: 28. May 2007, 20:38 von Snake707 »
SpeziOS und meine Freundin sind leider unvereinbar. Schade. Obwohl sie auch auf die Spezi geht. Nunja Chemiker und Biologen.

Physik ist nach wie vor die wichtigste Wissenschaft

Snake707

  • Beiträge: 20
    • Profil anzeigen
    • Spezi-OS
Gespeichert
« Antwort #3 am: 28. May 2007, 22:20 »
dein Kommentar hat mich doch etwas stutzig gemacht:

und zwar frage ich mich: ist es so richtig wie ich es mache??
ich wollte nähmlich in unserer API (16-Bit RealMode OS) eine Funktion um die Tastatur zu behandeln. Da dachte ich mir, wartest du bis die Tastatur eine eingabe hat.

Ist das jetzt Polling?
SpeziOS und meine Freundin sind leider unvereinbar. Schade. Obwohl sie auch auf die Spezi geht. Nunja Chemiker und Biologen.

Physik ist nach wie vor die wichtigste Wissenschaft

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #4 am: 29. May 2007, 12:15 »
Wenn dein OS im RM ist, solltest du einen Tastaturtreiber schreiben der genau dasselbe macht wie der Standardtastaturtreiber nur halt deutsch oder so angepasst ist. Das heißt, die jeweiligen Tasten sind in der BDA (BIOS Data Area) zu speichern. Mit dem int 16h (der damit umgehen kann und den du dann auch nicht selbst neu schreiben musst) kannst du dann die Tasten abfragen. Falls der int 16h dir zu wenig kann, kannst du ja noch eine int Funktion dazuschreiben, welche auch auf der BDA Zugriff nimmt. An welcher Stelle genau sich die Tastatursachen im BDA befinden kannst du durch Suchmaschinen herausfinden. Das Ganze ist dann zwar ein bisschen Arbeit, aber damit erfüllt es den RM-Standard und der int 16h kann halt damit umgehen.

bitmaster
In the Future everyone will need OS-64!!!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 29. May 2007, 12:17 »
Es ist Bit0 "Status des Ausgabepuffers", falls das bit 1 ist, sind Daten vom Tastaturcontroller im Ausgabepuffer).

Es ist Polling, aber wenn dein OS sowieso im realmode (ohne multitasking), dann ist es auch nicht so wichtig. Bei multitasking wäre es etwas komisch, wenn der kernel auf eine tastatureingabe wartet und garnichts anderes mehr passiert :-P (wenn man mal kernelthreads außen vor lässt und einen monolithischen kernel annimmt)
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 29. May 2007, 14:28 »
Da dachte ich mir, wartest du bis die Tastatur eine Eingabe hat.
Das warten in einer Schleife, also ständiges abfragen (Polling) der Tastatur, ist  wie bereits erwähnt nicht die Optimale Lösung. Deshalb würde ich dir empfehlen(wenn du die BIOS-Funktionen benutzen willst): einen Tastendruck über den IRQ1 abzufangen die Eingabe auszuwerten und gegeben falls in einem Puffer zwischenzuspeichern auf den dann deine API zugreifen kann. Da bei solltest du nur sichergehen, dass der KBC auf so eingestellt ist das der IRQ ausgelöst wird, was aber (glaube ich) Standardmäßig der Fall ist.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

 

Einloggen