DOS Programmierung Tutorial – Keyboard
Unter DOS ist die primäre Eingabequelle das Keyboard. Das geht soweit, dass die frühen DOS Rechner und auch teilweise bis in die 90er Jahre hinein nur eine Tastatur hatten. Die Maus war meist nur ein optionales Eingabegerät.
DOS Programmierung Tutorial – Keyboard
Die Tastatur ist eigentlich ein Arbeitsgerät, wurde aber schon in Zeiten von DOS schnell zur Eingabe für Spiele verwendet. In diesem Tutorial zeige ich euch wie man in einer Game Loop die gedrückten Tasten erkennt. Das ist gar nicht so einfach, da die Tastatur primär darauf ausgelegt ist Buchstaben und Zahlen zu erkennen, aber gleich mehr dazu. Starten wir mit einer einfachen Erweiterung des Hello World Beispiels vom letzten Artikel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <conio.h> #include <stdio.h> int main() { char kc = 0; clrscr(); printf("Keyboard test program!\n"); while(1) { if(kbhit()) { kc = getch(); printf("Key pressed: %02x\n", kc); } } return 0; } |
Die erste Erkenntnis: wir verwenden eine weitere Header Datei. conio.h (Console Input Output) bietet Funktionen mit denen man gedrückte Tasten erkennen kann. Das funktioniert leider nur recht primitiv im Polling Verfahren. Das heißt wir müssen aktiv nachfragen, welche Taste gedrückt wurde. Weiter im Code… clrscr() löscht einfach die Konsole, wir starten also mit einem schwarzen Bildschirm auf dem wir in der ersten Zeile eine Ausgabe zeichnen. In einer Endlosschleife (while(1) ist immer gültig) fragen wir mit kbhit() ab ob eine Taste gedrückt wurde. Mit getch() bekommen wir das Zeichen als ASCII Code. Das Ergebnis speichern wir in der Variable kc und geben es gleich wieder auf dem Bildschirm aus. Die Ausgabe wird als Hexadezimale Zahl ausgegeben. Warum? Weil Sondertasten keine druckbare ASCII Ausgabe erzeugen und ein Steuerkommando ausführen. Das bringt uns nichts, wir wollen den Hexadezimalen Wert pro Taste ermitteln, damit wir mit dieser Information später auf bestimmte Tasten reagieren können.
Die Ausgabe zeigt ein interessantes Ergebnis:
A, B, C,D werden als aufsteigende Zahlen 61, 62, 63, 64 (Achtung: Hexadezimal!) ausgegeben. Das macht Sinn. Drückt man aber ALT, STRG oder andere Sondertasten gibt es keine Ausgabe. Die Leertaste aber wird als 20 interpretiert. Es gibt noch ein weiteres interessantes Detail. Klickt man die Pfeiltasten werden gleich 2 Zeilen pro Taste geschrieben:
Wir halten fest:
- manche Tastencodes sind 1 Byte groß (beispielsweise die Buchstaben)
- manche Tastencodes sind 2 Bytes groß (beispielsweise die Pfeiltasten)
- manche Tasten werden nicht erkannt und erzeugen keine Ausgabe (beispielsweise STRG)
Wie gehen wir damit um? Man kann zumindest eines der Probleme recht einfach lösen. Mit ein paar Erweiterungen erkennt das Programm beispielsweise welche Pfeiltaste gedrückt wurde und die Endlosschleife wird mit der ESC Taste beendet. Das ist ein Anfang.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #include <conio.h> #include <stdio.h> #include <string.h> int main() { char kc = 0; char s[255]; clrscr(); printf("Keyboard test program!\n"); /* game loop stops with ESC */ while( kc != 0x1b) { if(kbhit()) { kc = getch(); if(kc == (char)0) { kc = getch(); switch(kc) { case 0x48: /* up arrow */ strcpy(s, "up arrow"); break; case 0x50: /* down arrow */ strcpy(s, "down arrow"); break; default: sprintf(s, "00 %02x", kc); break; } } else { sprintf(s, "%02x", kc); } printf("Key pressed: %s\n", s); } } return 0; } |
Neu ist die Abfrage nach der expliziten Hexadezimalen Darstellung von der ESC Taste in der Bedingung der while Schleife. Wenn der ermittelte Keycode der Taste 0 ist, dann fragen wir einfach noch einmal und holen das zweite Byte. In einem switch ist es nun möglich alle 2 Byte langen Keycodes zuzuordnen. Sofern die Taste unbekannt ist wird der ermittelte Code ausgegeben. Damit können wir recht einfach weitere Tasten ermitteln.
Todo
Fürs erste können wir mit den meisten Tasten arbeiten. Einige Spezialtasten lassen sich aktuell mit den gezeigten Mitteln nicht ermitteln, da diese nur in Kombination mit anderen Tasten vorkommen (beispielsweise STRG+C). Da haben wir zu einem späteren Zeitpunkt noch Bedarf.
Fazit
Das Beispiel zeigt auf einfache Weise, wie man die meisten Tasten des Keyboards mit C Code ermittelt und anhand der jeweiligen Taste anders reagiert.