Programmieren mit Pascal & Delphi
Pascal
PC-Tastatur umbelegen
Alte Tastaturen, exotische Programme oder schlicht persönliche Bedürfnisse machen es manchmal erforderlich, daß die Belegung der Tastatur umdefiniert werden muß. Dies ist im allgemeinen nicht so ohne weiteres möglich oder bringt eine Reihe von Programmen ins Stolpern. Im folgenden stellen wir darum ein programm vor, daß in der Lage ist, bis zu 10 Tasten umzudefinieren. Wer selbst Hand anlegt, kann diesen Puffer sogar noch vergrößern.
Tastatureingaben
Um die Vorgehensweise des Programms KEYDEF zu verstehen, muß man wissen, daß MS-DOS Tastatureingaben über den Interrupt 16h verarbeitet. Zuständig ist die Funktion 0 bzw. 16, die jewiels ein Zeichen in den internen Tastaturpuffer stellen. Um in diesen Mechanismus eingreifen zu können, ohne nun komplett alles neu programmieren zu müssen, ist ein Einklinken in den Interrupt 16h nötig.
Interrupt-Service-Routine
Die Interrupt-Service-Routine (ISR) für den Interrupt 16h kann sich bei geschickter Programmierung auf das reine Austauschen von Zeichen beschränken. Damit dies auch problemlos funktioniert, muß der Interrupt 16h seine normale Tätigkeit weiter verrichten, das heißt, der Original-Interrupt holt das Zeichen wie üblich. rreicht wird dieses Verhalten durch einen FAR-Call der alten ISR, der in die neue ISR eingebaut wird.
Zeichen austauschen
Nachdem die alte ISR das anstehende Zeichen von der Tastatur geholt hat, wird in einer Schleife geprüft, ob es sich um ein auszutauschendes Zeichen handelt. Wenn ja wird das Zeichen, das im Register AX steht, gegen das neue Zeichen ausgetauscht, ansonsten wird das eingegebene Zeichen nicht verändert.
Zur alten ISR verzweigen
Handelt es sich beim Eintritt des Interrupt 16h nicht um die Service-Funktionen AH=0 oder AH=16, kann sofort die alte ISR angesprungen werden, da es für die neue ISR nichts zu tun gibt.
Prozedur TranslateIsr
Kern des Programms KEYDEF ist folglich die ISR, die wie folgt aussieht:
procedure TranslateIsr(BP : word); interrupt;
var
Regs : IntRegisters absolute BP;
begin
if (regs.ah = 0) or (regs.ah = $10)
then begin
EmulateInt(Regs, OrigAddr);
index := 255;
repeat
inc(index,2);
if WordsToTrans[index] = regs.ax
then regs.ax := WordsToTrans[index+1];
until (index = NumberOfWords);
end
else ChainInt(Regs, OrigAddr);
end;
Das Hauptprogramm hingegen sieht eher bescheiden aus. Hier wird lediglich geprüft, ob die übergebenen Parameter korrekt sind. Anschließend wird die Adresse der alten ISR gesichert und die neue ISR gesetzt. Danach beendet sich das Programm resident über die Funktion Keep() mit Exitcode 0. Damit Turbo-Pascal jetzt nicht den gesamten Speicher belegt, muß die Kompiler-Direktive $M bemüht werden:
Lediglich 2 KByte Stack werden angefordert. Verzichtet man auf die Übergabe des falschen Parameters an die Error-Funktion, würde es auch
tun.
Das Programm KEYDEF erwartet als Parameter jeweils zwei Tastaturcode als Hexadezimalzahl. Da wohl kaum einer alle Hex-Codes auswendig kennt, wurde mit KEYWORD zusätzlich ein Utility implementiert, das zu einer gedrückten Taste den Code als Hexadezimalzahl und zusätzlich die Taste im Klartext ausgibt. Für <ESC> sieht die Ausgabe folglich so aus:
$011B=<ESC>
Beendet wird das Programm KEYWORD, das aus einer simplen Endlosschleife besteht, durch Betätigen der Taste <ESC>.