Autor Thema: Tastatur ohne Interrupts abfragen  (Gelesen 18781 mal)

bscreator

  • Gast
Gespeichert
« am: 03. September 2009, 19:32 »
Hallo,
bin grad dabei, eine Funktion zu schreiben, die
- wartet bis eine Taste gedrückt wird und dieses Zeichen am Bildschirm ausgibt.

Das Zeichen auszugeben ist ja kein Problem, aber wie kann ich ohne Verwendung der Interrupts ein Zeichen von der Tastatur einlesen ?
(bzw. welche Ports brauch ich, dass die Tastatur bspw. jetzt auf einen Tastendruck wartet ?)

(den Tastaturpuffer auszulesen is ja auch kein Problem, aber die Aufforderung, jetzt auf einen Tastendruck von Tastatur zu warten bereitet mir Probleme...)

Mit den Interrupts ist das ja alles kein Problem, aber geht das auch ohne Interrupts (auch wenn es intern immernoch über Interrupts passiert...) ?
« Letzte Änderung: 03. September 2009, 19:58 von bscreator »

bscreator

  • Gast
Gespeichert
« Antwort #1 am: 03. September 2009, 20:01 »
Nene,
das Problem liegt darin, abzufragen, wann eine Taste gedrückt wird
(welche Ports, abgesehen vom Tastaturpuffer, sind dazu nötig ????)

DaCodaaa

  • Gast
Gespeichert
« Antwort #2 am: 03. September 2009, 20:12 »
Du willst alsoein zeichen von der Tastatur haben?
WOFÜR BRAUCHST DU DANN DIE ZEIT WANN EINE TASTE GEDRÜCKT WURDE :?
wenn der Interrupt ausgelöst wird springt der doch automatisch zu deinem Handler ohne dass der rest des Systems davon überhaupt was mitkriegt.
Wenn du wissen willst welches Zeichen aktueller ist kanst du dir einen PIT Treiber schreiben, und von dem eine Systemzeit holen. Die hängst du dann an das Zeichen. Die nidrigste Signatur ist dann das älteste Zeichen.

(erklär mir mal genau was du brauchst :|)
« Letzte Änderung: 03. September 2009, 20:16 von DaCodaaa »

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 03. September 2009, 20:20 »
Wenn eine Tastatur gedrückt wurde, ist das niederwertigste Bit in Port 0x64 gesetzt. Du kannst also in einer Schleife einfach darauf warten bis das gesetzt ist.
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #4 am: 03. September 2009, 21:52 »
Zitat
Wenn eine Tastatur gedrückt wurde, ist das niederwertigste Bit in Port 0x64 gesetzt. Du kannst also in einer Schleife einfach darauf warten bis das gesetzt ist.
Genau sowas mein ich. Mit Hilfe eines Ports die Tastatur abfragen.

Der ASCII-Code des Zeichens is dann im Tastaturpuffer, oder ?

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 03. September 2009, 21:55 »
Ich denke ja, wenn das BIOS wie gehabt funktioniert.
Dieser Text wird unter jedem Beitrag angezeigt.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #6 am: 04. September 2009, 20:49 »
So wie ich das verstehe bist du im Realmode und das BIOS verarbeitet den Tastaturinterrupt. Dann kannst du nicht einfach den I/O Port pollen, denn wahrscheinlich (?) wird der Interrupt erst ausgelöst und anschließend ist ein neuer Wert im I/O Port, d.h. zuerst wird das BIOS aufgerufen welches den Interrupt handhabt, dann ist natürlich wieder das Bit gelöscht und dann kommt erst dein Code an der Reihe, der schön in die Ewigkeit loopt.
Falls du jetzt eine Lösung haben willst, solltest du vielleicht genauer sagen, in welchem Modus du überhaupt bist, ob die BIOS Interrupt (das wird doch wohl einen Interrupt zum lesen eines Zeichens von der Tastatur haben) verwenden willst und warum genau du "ohne Interrupts" auskommen willst... vielleicht bin auch nur ich verwirrt...
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

bscreator

  • Gast
Gespeichert
« Antwort #7 am: 05. September 2009, 14:27 »
Nochmal :
Ich will nur eine Möglichkeit haben,  ein Zeichen von der Tastatur lesen ohne dabei irgendwelche Interrupt-Funktionen selbst zu verwenden

Das mit dem 0x64 klappt leider nicht, wie bluecode schon vorhergesagt hat.

Ich arbeite noch im Real-Mode ! Muss ich vielleicht zuerst das A20 aktivieren ?

chris12

  • Beiträge: 134
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. September 2009, 14:58 »
ist zwar ne blöde antwort, aber hast du schon mal versucht die interrupts abzuschalten? vllt gehts ja dann.
OS? Pah! Zuerst die CPU, dann die Plattform und _dann_ das OS!

bscreator

  • Gast
Gespeichert
« Antwort #9 am: 05. September 2009, 15:11 »
Mein Code bisher :

read_keyb:
cli    ;Interrupts deaktivieren
in al,0x64h  ;lese Port 0x64
cmp al,0x01
jne readkeyb  ;Wenn al = 0x01, dann wurde Taste gedrückt
in al,0x60  ;lese ASCII-Code der gedrückten Taste
sti    ;Interrupts wieder zulassen
ret

...und in der Schleife read_keyb bleibt er hängen...

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 05. September 2009, 15:12 »
Um zu testen, ob ein Bit gesetzt ist, musst du "test" nehmen nicht "cmp". Außerdem ist die Bedingung dann jz read_keyb. Und das funktioniert, wenn du 0x64h schreibt? Ist da nicht 0x oder h zu viel?
« Letzte Änderung: 05. September 2009, 15:17 von PorkChicken »
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #11 am: 05. September 2009, 15:37 »
Dann eben so:
read_keyb:
cli    ;Interrupts deaktivieren
in al,0x64h  ;lese Port 0x64
test al,00000001b
jz read_keyb
in al,0x60  ;lese ASCII-Code der gedrückten Taste
sti    ;Interrupts wieder zulassen
ret

Bewirkt aber dasselbe, und zwar dass das Lesen von Port 0x64 immer 0 liefert

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 05. September 2009, 15:42 »
Hm, also bei mir funktionierts in Bochs und qemu.
Dieser Text wird unter jedem Beitrag angezeigt.

bscreator

  • Gast
Gespeichert
« Antwort #13 am: 05. September 2009, 15:50 »
Aber qemu aktiviert doch das A20-Gate und springt in den Protected Mode, oder ?
Dann hast ja gar nicht die selben Arbeitsbedingungen (sprich Real Mode)

« Letzte Änderung: 05. September 2009, 15:54 von bscreator »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 05. September 2009, 15:54 »
Genau dann wenn das Gast-OS es macht...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #15 am: 05. September 2009, 18:42 »
ist zwar ne blöde antwort, aber hast du schon mal versucht die interrupts abzuschalten?
Das würde ich auch vorschlagen... Deine Phobie gegen BIOS-Interrupts (siehe hier) im Realmode verstehe ich allerdings nicht. Würde mich da definitiv über eine Erklärung freuen. :wink:
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

bscreator

  • Gast
Gespeichert
« Antwort #16 am: 05. September 2009, 19:31 »
Naja, weil zu den Aufgaben eines Betriebssystems ja auch die Geräteverwaltung gehört.
Deswegen wollt ich halt die Aufgabe selbst in die Hand nehmen und mir einen Tastaturtreiber schreiben, damit ich diese Aufgabe bereits erledigt hab. Wenn man die Interrupts verwendet braucht man ja keinen Tastaturtreiber mehr, oder ?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #17 am: 05. September 2009, 19:54 »
Ich möchte dich darauf hinweisen, dass
* du momentan Code für den Realmode produzierst. Dein Code wird nicht einfach so im Protectedmode laufen bzw. es ist nicht unbedingt sinnvoll das zu tun
* du dir mit dem Realmode kein modernes OS schreiben wirst/kannst
* es m.E. wenig Sinn macht im Realmode auf die BIOS-Interrupts zu verzichten
* zwischen "auf Interrupts verzichten" und "auf BIOS-Interrupts verzichten" ein rießiger Unterschied ist. Ersteres ist kompletter Blödsinn, weil du dich auf Polling festlegst und das heißt nunmal, dass du unnötig die ganze Zeit in einer Schleife rumloopst. So wird das sicherlich nie was mit Multitasking und einem "modernen" OS.
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

bscreator

  • Gast
Gespeichert
« Antwort #18 am: 05. September 2009, 23:22 »
Zitat
du momentan Code für den Realmode produzierst. Dein Code wird nicht einfach so im Protectedmode laufen bzw. es ist nicht unbedingt sinnvoll das zu tun
Hab noch nicht vor, in den PM zu springen

Zitat
m.E. wenig Sinn macht im Realmode auf die BIOS-Interrupts zu verzichten
Das ist mir klar, aber nur so kann ich einen "Treiber" für die Tastatur schreiben, oder ?



« Letzte Änderung: 05. September 2009, 23:53 von bscreator »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 06. September 2009, 00:19 »
Die Frage ist halt, warum du einen Treiber schreiben willst, wenn das BIOS das alles schon macht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen