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

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #20 am: 06. September 2009, 04:25 »
Das ist mir klar, aber nur so kann ich einen "Treiber" für die Tastatur schreiben, oder ?
Wenn du einen richtigen Treiber schreiben willst dann verwende doch den entsprechenden IRQ/Interrupt der Tastatur, wie gesagt Polling/Busy Waiting ist in diesem Fall kompletter Müll und kaum später wiederverwendbar.
Ganze Sätze als fett markieren ist m.E. zuviel des Guten btw. :-)
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 #21 am: 06. September 2009, 20:56 »
Ähm, das kapier ich jetzt nicht ganz.

Zitat
den entsprechenden IRQ/Interrupt der Tastatur
Für die Tastatur gibts doch viele INTs, wie Zeichen lesen und ausgeben, Zeichen lesen, Tastaturpuffer abfragen,....

Meinst Du ich soll doch die ganzen vorgegebenen Interrupts verwenden, die ich selbst schreiben wollte ??????????
Dann brauch ich doch gar keinen Treiber mehr (welchen ich ja selbst schreiben wollte)

XanClic

  • Beiträge: 261
    • Profil anzeigen
    • github
Gespeichert
« Antwort #22 am: 06. September 2009, 21:41 »
Zitat von: bscreator
Zitat von: bluecode
den entsprechenden IRQ/Interrupt der Tastatur
Für die Tastatur gibts doch viele INTs, wie Zeichen lesen und ausgeben, Zeichen lesen, Tastaturpuffer abfragen,....
Zitat von: bluecode
zwischen "auf Interrupts verzichten" und "auf BIOS-Interrupts verzichten" ein rießiger Unterschied ist.
Wie bluecode damit gesagt hat, gibt es einen himmelweiten Unterschied zwischen IRQs (bzw. "einfachen" Interrupts) und den BIOS-Interrupts.

bscreator

  • Gast
Gespeichert
« Antwort #23 am: 06. September 2009, 22:29 »
Und was sind dann die einfachen Interrupts, bzw. welche Nummern haben die ?

Sind BIOS-Ints oder einfache INTs besser, bzw. hardware-unabhängiger ?

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 06. September 2009, 23:14 »
Was den Unterschied angeht: Gibt keinen. Interruptnummern werden via einer Tabelle Codestücke zugeordnet, die angesprungen werden (vereinfacht). bios-ints werden halt nur beim rechnerstart initialisiert, mit sinnvollen handlern die definierte tätigkeiten ausführen.

Zum was besser ist, Kommt wie immer dadrauf an was du jetzt genau vor hast. Solange du im Realmode bist ist es eigentlich doofe Codeduplikation wenn du nen eigenen Tastaturtreiber schreiben willst, ergo sind bios-ints angebracht. Da du im PMode eigentlich keine bios-ints mehr hast erübrigt sich die Frage da auch ;)

Wie du auf Hardware(un)abhängigkeit kommst ist mir jetzt ein Rätsel. Solange du auf x86 (und kompatiblen) arbeitest gibt es ints, die funktionieren halt so, und fertig. Hardwareabhängigkeit kommt ja erst rein wenn du mit spezifischer Hardware arbeitest. Für Tastaturen musst du dich aber um nix kümmern (eigentlich, sobald nen USB-Treiber ins Spiel kommt fällt für USB-Tastaturen die PS/2-Emulation weg).

Generell, siehe die Wiki-Artikel zu Interrupts und KBC, die sollten eigentlich alle Fragen beantworten ;)
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #25 am: 07. September 2009, 01:39 »
Was ich meinte ist folgendes: Es ist eine Sache keine BIOS-Interrupts (Das sind bestimmte Interrupts, die das BIOS registriert um Funktionalität zur Verfügung zu stellen) zu verwenden. Es ist aber eine ganz andere Sache keine IRQs (Das sind bestimmte Interrupts, die die Hardware verwendet um Ereignisse anzuzeigen) zu verwenden. Auf letzteres zu verzichten bedeutet wie gesagt Polling und das hat keine Zukunft in einem Treiber.
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 #26 am: 07. September 2009, 13:27 »
Okay, aber die Sache mit den Interrupts beschäftigt mich noch. Bitte korrigiert mich, wenn ich irgendwie falsch liege :

- BIOS-Interrupts sind INTs, die vom BIOS zur Verfügung gestellt werden und die jedes x86-kompatible BIOS, egal ob BIOS aktuell oder nicht, zur Verfügung gestellt werden

- Aber woher kommen dann einfache Interrupts ?
« Letzte Änderung: 07. September 2009, 14:47 von bscreator »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 07. September 2009, 14:50 »
Also, mal ganz von vorne: Mal ganz grob haben wir drei Arten von Interruptquellen. Das wären IRQs (Hardwareinterrupts), Exceptions und Softwareinterrupts. Einem Interrupt wird über die IVT (Real Mode) oder IDT (Protected Mode) ein ISR (Interrupthandler) zugewiesen. "Einfache" oder "komplexe" Interrupts gibt es nicht.

Wenn man von BIOS-Interrupt redet, meint man im allgemeinen, dass dein Code einen Softwareinterrupt auslöst, desser ISR eine BIOS-Funktion ist (das BIOS setzt beim Booten ein paar Einträge in der IVT auf seinen eigenen Code). Dadurch kannst du BIOS-Code ausführen. Das Prinzip ist ungefähr das gleiche wie wenn später ein Programm per Interrupt einen Syscall in deinem Kernel aufruft.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #28 am: 18. January 2011, 13:07 »
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

Ich mache es so (MASM-Syntax):

; Zum Anfang sperre ich IRQ 1:

       cli                          ; Software-Interrupts ausschalten
       mov      al, 2               ; IRQ 1 sperren
       out      21h, al
       sti                          ; Software-Interrupts einschalten

;-------------------------------------------------------------------------
; In der Hauptschleife kommt die eigentliche Tastatur-Abfrage:

MAIN:


       in       al, 64h             ; Tastatur-Status holen
       test     al, 1
       jz  NOKEY                    ; wenn keine Taste weiter
       test     al, 20h
       jnz NOKEY                    ; wenn PS2-Mouse weiter
       in       al, 60h             ; Tasten-Code holen
       dec      al                  ;  Escape-Taste ?
       jz  HOME                     ; Escape-Taste = Programm-Ende
       inc      al
;-------------------------------------------------------------------------
;                E x t r a - T a s t e n   a b f r a g e n
;-------------------------------------------------------------------------
       mov      si, OFFSET SONTAB   ; Zeiger auf Extra-Tasten-Tabelle
       mov      cl, Extablen        ; länge
XSUCH: cmp      al, [si]            ; Taste suchen
       jz  XFOUND                   ;  gefunden ?
       lea      si, [si+1]
       dec      cl
       jnz XSUCH
;-------------------------------------------------------------------------
;                    T a s t e n   a b f r a g e n
;-------------------------------------------------------------------------
       mov      si, OFFSET TASTTAB  ; Zeiger auf Tasten-Tabelle
       mov      cx, tablen          ; länge
       mov      bx, OFFSET TEXTTAB  ; Offset auf Text
SUCH:  cmp      al, [si]            ; Taste suchen
       jz  FOUND                    ;  gefunden ?
       lea      si, [si+1]
       dec      cx
       jnz SUCH
       jmp NOKEY

FOUND:

XFOUND:

NOKEY:

       jmp MAIN


; .....................................
; Zum Ende erlaube ich IRQ 1 wieder:
; .....................................
HOME:  in       al, 60h             ; Tasten-Code holen (Puffer leeren)
       xor      cl, cl              ; kein Fehler

RAUS:  cli
       xor      al, al              ; IRQ 1 freigeben (Taste)
       out      21h
       sti

       mov      ah, 1               ; Tastatur-Puffer löschen
       int    16h

       mov      al, cl              ; ERRORLEVEL holen
       mov      ah, 4Ch             ; Programm beenden
       int    21h


;----------------------------------------------------
; Unser Datenbereich:
;.....................
TASTTAB DB 02h,03h,04h,05h,06h,07h,08h,09h,0Ah,0Bh,0Ch,0Dh
        DB 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1Ah,1Bh,1Eh,1Fh
        DB 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,2Bh,2Ch,2Dh,2Eh,2Fh
        DB 30h,31h,32h,33h,34h,35h,39h
        DB 56h
tablen =  ($-TASTTAB)

TEXTTAB DB "1234567890ß'"
        DB "qwertzuiopü+as"
        DB "dfghjklöä^#yxcv"
        DB "bnm,.- "
        DB "<"
Textablen  =  ($-TEXTTAB)
;----------------------------------------------------
; Tab,shift li.,shift re.,HOME,UP,LEFT,RIGHT,END,DOWN
;----------
SONTAB  DB 0Fh,2Ah,36h,47h,48h,4Bh,4Dh,4Fh,50h
Extablen  =  ($-SONTAB)
        DB 0,0,0
SHIFT   DW 0

Dirk

 

Einloggen