Programmieren mit Pascal & Delphi

Pascal

PC-Tastatur umbelegen

Alte Tastaturen, exotische Programme oder schlicht persönliche Be­dü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 Pro­grammen ins Stolpern. Im folgenden stellen wir darum ein pro­gramm vor, daß in der Lage ist, bis zu 10 Tasten umzudefinieren. Wer selbst Hand an­legt, 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 Inter­rupt 16h verarbeitet. Zuständig ist die Funktion 0 bzw. 16, die je­wiels ein Zeichen in den internen Tastaturpuffer stellen. Um in diesen Mecha­nismus eingreifen zu können, ohne nun komplett al­les neu program­mieren zu müssen, ist ein Einklinken in den Inter­rupt 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 funktio­niert, muß der Interrupt 16h seine normale Tätigkeit weiter ver­richten, das heißt, der Original-Interrupt holt das Zeichen wie üb­lich. 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 auszu­tauschendes Zeichen handelt. Wenn ja wird das Zeichen, das im Register AX steht, gegen das neue Zeichen ausgetauscht, anson­sten wird das eingegebene Zeichen nicht verändert.

Zur alten ISR verzweigen
Handelt es sich beim Eintritt des Interrupt 16h nicht um die Ser­vice-Funktionen AH=0 oder AH=16, kann sofort die alte ISR an­gesprungen 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 aus­sieht:

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. An­schließend wird die Adresse der alten ISR gesichert und die neue ISR gesetzt. Danach beendet sich das Programm resident über die Funk­tion Keep() mit Exitcode 0. Damit Turbo-Pascal jetzt nicht den ge­samten Speicher belegt, muß die Kompiler-Di­rektive $M bemüht werden:

{$M 2024,0,0}

Lediglich 2 KByte Stack werden angefordert. Verzichtet man auf die Übergabe des falschen Parameters an die Error-Funktion, würde es auch

{$M 1024,0,0}

tun.

Das Programm KEYDEF erwartet als Parameter jeweils zwei Tasta­turcode als Hexadezimalzahl. Da wohl kaum einer alle Hex-Codes auswendig kennt, wurde mit KEYWORD zusätzlich ein Utility im­plementiert, das zu einer gedrückten Taste den Code als Hexadezi­malzahl 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>.





Sachgebiet


© 2009-2012 by Alojado Publishing. Alle Rechte vorbehalten. Ausgewiesene Marken gehören ihren jeweiligen Eigentümern.
Mit der Benutzung dieser Seite erkennen Sie die Nutzungsbedingungen und die Datenschutzerklärung an. Der Betreiber übernimmt keine Haftung für den Inhalt verlinkter externer Internetseiten.
Seite erzeugt 2012-02-22 22:06:20 von textarchiv.alojado.de