Einstiegsseite Bildergalerie PC-Entwicklung Seitenüberblick Tastaturgalerie Tastaturlayout

Die Vitrine
- PC-Museum -

Tastaturereignisse

Was passiert eigentlich, wenn eine Taste gedrückt wird?
Dargestellt am Beispiel einer Original-IBM-Tastatur mit 83 Tasten

Bei jedem Drücken oder Loslassen einer Taste erhält der Rechner ein Signal, einen sogenannten Hardware-Interrupt 9, der eine zugehörige Tastaturereignisbehandlungsroutine, aber verwenden wir lieber den kürzeren Begriff INT09-Handler, aufruft. Dieser INT09-Handler ist ein Programm, das die weitere Bearbeitung des Ereignisses übernimmt. Da die von den einzelnen Tasten gelieferten Zeichen je nach gewählter Sprache und damit Tastenbelegung variieren, hat IBM den Tasten keine festen Zeichen sondern eine Nummer zugeordnet. In der folgenden Abbildung sind die Nummern der 83 Tasten der Original-IBM-Tastatur in hexadezimaler Schreibweise dargestellt.
Wie leicht zu erkennen wurde zunächst der Standard-Block zeilenweise von links nach rechts fortlaufend nummeriert (01h - 3Ah, die Endung h steht für "hexadezimal"). Darauf folgen die zehn Funktionstasten (3Bh - 44h) und schließlich der numerische Block (45h - 53h).

Zur Bearbeitung eines Tastaturereignisses muss nun der INT09-Handler

* Zur Notation:
  Bezeichnung    Tastennummer  Bemerkung
Shift2Ah und 36hUmstelltaste
Ctrl1Dhauch "Strg" für Steuerung
Alt38h
ScrollLock46hauch "Rollen"
NumLock45h
CapsLock3AhFeststelltaste
Insert52hauch "Einfg"

Die Ermittlung der betroffenen Tastennummer (="Scancode") ist unproblematisch, da diese von der Tastatur am Ein-/Ausgabekanal (="I/O-Port") 60h bereitgestellt wird und dort abgeholt werden kann. Für die Erzeugung und Bereitstellung des zugehörigen Zeichens stellt das BIOS standardmäßig im sogenannten BIOS-Daten-Segment 0040h folgende Adressen zur Verfügung:

Adresse (h)     Inhalt
---------------------------------------------------------------------
0040:0017       Umschalttastenstatus
                Bit 0: gesetzt = Rechte Shift-Taste gedrückt
                Bit 1: gesetzt = Linke Shift-Taste gedrückt
                Bit 2: gesetzt = Ctrl-Taste gedrückt
                Bit 3: gesetzt = Alt-Taste gedrückt
                Bit 4: gesetzt = ScrollLock aktiv
                Bit 5: gesetzt = NumLock aktiv
                Bit 6: gesetzt = CapsLock aktiv
                Bit 7: gesetzt = Insert aktiv
0040:0019       Aktueller Zeichencode, der mit gedrückter Alt-Taste eingegeben wurde
0040:001A       Offset des ersten auszulesendes Zeichen im Tastaturpuffer
0040:001C       Offset der ersten freien Stelle im Tastaturpuffer
0040:001E-003D  Tastaturpuffer
---------------------------------------------------------------------
Der 32 Byte große Tastaturpuffer ist als Ringpuffer ausgelegt. An Adresse 0040h:001Ah steht der Offset des ersten auszulesenden Zeichens, an Adresse 0040h:001Ch der der ersten freien Stelle. Jedem erzeugten Zeichen sind im Tastaturpuffer zwei Byte zugordnet: das eine enthält den Scancode der gedrückten Taste, das andere den ASCII-Code des erzeugten Zeichens (ASCII = American Standard Code for Information Interchange [GIF, 23 kB]).

Soweit zu den Voraussetzungen. Wie bekommen wir nun aber zum Beispiel ein großes "Z" in den Tastaturpuffer? Dazu muss bei gedrückter Shift-Taste (als versierte Maschinenschreiber verwenden wir die linke, also 2Ah) die Z-Taste (15h) angeschlagen werden. Dadurch werden zwei Tastaturereignisse ausgelöst: Zuerst das Drücken der Shift- und anschließend das der Z-Taste.
Der INT09-Handler überprüft bei jedem Tastaturereignis zunächst, ob eine der Umschalttasten mit den Scancodes 1Dh (Ctrl), 2Ah (LShift), 36h (RShift), 38h (Alt), 3Ah (CapsLock), 45h (NumLock) oder 46h (ScrollLock) gedrückt oder losgelassen wurde. Falls dem so ist, wird das Umschaltstatusbyte an 0040h:0017h entsprechend verändert und fertig. In unserem Fall führt somit das Drücken der linken Umschalttaste zum Setzen des "Linke-Shift-Taste-gedrückt"-Bits im Umschalttastenstatusbyte .
Beim zweiten Anschlag (Z-Taste) liefert die Tastatur den Scancode 15h, der direkt in den Tastaturpuffer übernommen werden kann. Aber halt, schon falsch! Auf der deutschen Tastaturbelegung sind gegenüber der amerikanischen die Buchstaben Y und Z vertauscht. Es gibt immer wieder Programme, die klüger sein wollen als der INT09-Handler, und nicht den im Tastaturpuffer abgelegten Zeichencode verwenden, sondern den dort stehenden Scancode selbst auswerten. Also muss unser INT09-Handler den Scancode 15h gegen den Scancode 2Ch (und umgekehrt) vertauschen.
Zur Ermittlung des im Tastaturpuffer abzulegenden Zeichencodes wird zunächst der Umschalttastenstatus geprüft. Ist dieser Null, das heißt keine Umschalttaste ist gedrückt, so wird in einer Tabelle der zugehörige Zeichencode (7Ah = 122 für Taste 2Ch) nachgeschlagen und zusammen mit dem Scancode (2Ch) im Tastaturpuffer abgelegt.
In der folgenden Abbildung sind die Zeichencodes der deutschen Tastatur dargestellt. Abweichungen von der amerikanischen Belegung sind durch rote Schrift kenntlich gemacht. Ein Wort noch zu den vielen Leerstellen: Umschalttasten liefern, wie bereits erwähnt, keinen Zeichencode. Hier wird lediglich das Umschalttastenstatusbyte verändert. Die Funktionstasten und Tasten des numerischen Blocks liefern bei ausgeschaltetem NumLock keinen Zeichen- sondern lediglich den, in der vorherigen Abbildung eingetragenen, Scancode

Bei gehaltener linker und/oder rechter Shift-Taste muss der zugehörige "Großbuchstabe" gefunden werden. Die Buchstaben a - z werden durch Subtraktion von 32 (=20h) "vergrößert": aus unserem z mit ASCII-Code 7Ah wird Z mit ASCII-Code 5Ah. Daneben bedürfen einige Tasten einer Sonderbehandlung, so liefert etwa Shift-Enter den gleichen Code wie Enter und das große Ü (154 = 9Ah) weist keinesfalls einen um 32 niedrigeren Code auf als das kleine (129 = 81h).
Ähnlich verhält es sich bei gedrückter Ctrl-Taste. Hier werden bei den Buchstaben a - z die ASCII-Codes jedoch nicht um 20h, sondern um 60h vermindert. Die Ctrl-Kombinationen eignen sich daher zum Einbringen der Steuerzeichen mit den ASCII-Codes 1 - 26. So entspricht etwa Ctrl-H (Code 08h) der Funktion der BackSpace-Taste (versuchen Sie's mal, aber schlafen Sie nicht darauf ein!) und Ctrl-I (Code 09h) der Tabulator-Taste. Und was liefert wohl Ctrl-M (Code 0Dh)? Ctrl-Z führt zu einem Zeichencode von 1Ah, früher die End-Of-File-Markierung bei Textdateien.
Ist schließlich die Alt-Taste gedrückt, so erhält der Zeichencode den Wert Null. Wird bei gedrückter Alt-Taste eine Zahl auf der numerischen Tastatur eingegeben, so wird diese direkt als Zeichencode in den Tastaturpuffer geschrieben. Damit können sämtliche nicht auf der Tastatur vorhandenen ASCII-Zeichen eingesetzt werden, zum Beispiel die damals auf deutschen Tastaturen fehlenden geschweiften Klammern mit den Zeichencodes 123 und 125.
Hier noch einmal zusammengefasst die Codes im Tastaturpuffer bei Eingabe eines "Z" in Abhängigkeit vom Umschalttastenstatus:

Umschaltstatus    Scancode  Zeichencode  
---------------------------------------
    leer             2Ch        7Ah
    Shift            2Ch        5Ah
    Ctrl             2Ch        1Ah
    Alt              2Ch        00h
---------------------------------------

Nachdem der Tastenanschlag wie beschrieben bearbeitet wurde, erwartet der INT09-Handler ein Signal von der Tastatur, dass die Z-Taste losgelassen wurde. Trifft dieses innerhalb einer definierten Zeit nicht ein, so legt er gnadenlos weitere Z's im Tastaturpuffer ab bis die Z-Taste losgelassen wird oder der Tastaturpuffer voll ist!

Es bleiben noch einige Fragen offen:

Was passiert wenn der Tastaturpuffer voll ist?
In diesem Fall steht an Adresse 0040h:001Ah (=Offset des ersten auszulesenden Zeichens) der gleiche Wert wie an Adresse 0040h:001Ch (=Offset der ersten freien Stelle), und dann piepst's!

Wie kommt eine Anwendung an die Zeichen im Tastaturpuffer?
Hierzu dienen BIOS-Funktionen (BIOS-Interrupt 16h), mit denen
- überprüft werden kann, ob Zeichen im Tastaturpuffer liegen (Int 16h, Funktion 1),
- ein Zeichen aus dem Tastaturpuffer abgeholt werden kann (Int 16h, Funktion 0) und
- der Status der Umschalttasten ermittelt werden kann (Int 16h, Funktion 2).

Welche Codes liefern Funktionstasten in Verbindung mit Umschalttasten?

Was ist mit den später hinzugefügten Tasten?

... Fortsetzung folgt!

 

  Klaus Hank (14.11.2000) [ Home ] [ Sitemap ] [ Galerie ] [ Top