home *** CD-ROM | disk | FTP | other *** search
- ,,u Listing des Monats
-
- ,,d Compiler an die Tastatur!
-
-
- ,,a von Olaf Stoyke
-
- ,,e
- Das Programm "Change Keyboard" (CKBD)
- ist den Lesern der TOOLBOX schon einmal
- in der Ausgabe 3'89 begegnet. Mußte bei
- der ersten Version zum Ändern der er-
- weiterten Tastaturdefinitionen noch ein
- Assembler bemüht werden, so können mit
- der hier vorgestellten Version alle
- Tastaturdefinitionen als Textdatei zu
- einem ready-to-run COM-Programm compi-
- liert werden. Und hatte man mit der
- Urversion bis zum Ausschalten des Rech-
- ners veränderte Tastendefintionen, so
- genügt es bei der neuen Version, das
- Programm mit (irgend)einem Parameter
- aufzurufen, um es aus dem Speicher zu
- entfernen.
-
- ,,n,,g
- CKBD ist nach wie vor ein Programm, das
- sich resident im Speicher niederläßt
- und es dem Anwender ermöglicht, be-
- liebige Tasten umzudefinieren. Mit der
- neuen Version ist es möglich, daß einer
- Taste bis zu etwa 240 Zeichen zugeord-
- net werden. Diese Zahl ergibt sich aus
- der Größe des Lesepuffers in MakeCKBD,
- der vom Typ "String" ist. Alle neuen
- Defintionen sind in einem speziellen,
- aber einfachen Format in eine Textdatei
- zu schreiben, die dann mit MakeCKBD zu
- CKBD.COM compiliert wird. Wie sieht
- dieses Format aus?
-
- Das erste Feld in einer Zeile muß eine
- hexadezimale Zahl sein, die vier Zei-
- chen lang ist. Sie repräsentiert den
- Scancode der umzudefinierenden Taste,
- den man unter anderem dem technischen
- Handbuch des Rechners entnehmen kann.
- Das darauf folgende Feld ist der
- String, der der Taste zugeordnet werden
- soll. Dieser String muß durch Anfüh-
- rungszeichen eingeleitet und abge-
- schlossen sein. Wenn diese Zeichen aber
- auch in dem String enthalten sein sol-
- len, kann man als erste Möglichkeit als
- Hochkomma sowohl <'> als auch <"> ver-
- wenden, jeweils dann aber paarweise,
- versteht sich.
-
- Außerdem dürfen in der Textdatei auch
- kommentierende Texte auftauchen. Diese
- werden durch ein Semikolon eingeleitet
- und veranlassen MakeCKBD, wie in einem
- Assembler-Quellcode, den Rest der Zeile
- zu ignorieren. Kommentare und Tasten-
- definitionen benötigen aber jeweils
- eigene Zeilen.
-
- Als Beispiel definieren wir hier für
- einen Wordstar-Editor ein PROCEDURE-
- Makro, das mit der Kombination [Alt][P]
- aktiviert werden soll:
-
- 1900 ist der Hex-Scancode von [Alt][P]
-
- 1900 "PROCEDURE ();<S><S><S>"
-
- Die <S>-Teile sollen ^S-Zeichen dar-
- stellen, so wie sie mit ^P^S in den
- Text gebracht werden. Man kann, wenn
- man will oder muß, anstelle von ^P^S,
- also der direkten Einbindung der Zei-
- chen in den String, auch /19 schreiben.
- Ein im String auftauchendes Backslash-
- Zeichen wird vom Compiler als Sonder-
- zeichen interpretiert. Folgt hierauf
- nämlich eine dezimale Zahlenkonstante,
- so wird diese als ASCII-Konstante in-
- terpretiert, ansonsten wird nur das
- folgende Zeichen berücksichtigt. Ei-
- nen Dateinamen mit Pfadangaben muß man
- also wie folgt angegeben:
-
- 5E00 "C:\\TURBO\\PASCAL5\\CKBD.COM"
-
- und die Funktiostaste [Ctrl[F1] ist mir
- dem Makro belegt.
- Dies ist also die zweite Möglichkeit,
- Hochkomma-Zeichen in den String zu
- übernehmen, weil nun ja Folgendes kor-
- rekt übersetzt werden kann:
-
- ; [Alt][H] läßt grüßen ...
-
- 2300 'WriteLn(\'Hello, World!\');\13'
-
- ,,z Kill CKBD
-
- Wie schon erwähnt, kann man CKBD auch
- wieder aus dem Speicher entfernen.
- Genaugenommen stimmt das so nicht, denn
- CKBD ist garantiert auch nach dem fol-
- genden Procedere im Speicher, nur hat
- es keine Kontrolle mehr über die Scan-
- codes der Tastatur. Dazu braucht man
- CKBD nur mit einer nicht-leeren Parame-
- terzeile aufrufen, das heißt, daß sich
- etwas mehr als nur Blanks hinter
-
- C:\>CKBD
-
- befinden muß, zum Beispiel:
-
- CKBD Entferne CKBD aus dem Speicher
-
- CKBD erkennt dann, daß der Anwender ein
- vorher geladenes CKBD entfernen möchte.
- CKBD erkennt hier und bei dem Versuch
- einer Installation, ob es bereits im
- Speicher ist, und reagiert entspre-
- chend.
-
- ,,z Die Grenzen des Tastaturcompilers
-
- Ja, Ja, CKBD hat auch Grenzen... Zum
- einen ging schon aus dem obigen Bei-
- spiel hervor, daß CKBD innerhalb der
- neuen Tastendefinition noch keine wei-
- teren Scancodes verarbeiten kann. Fer-
- ner können die Tastendefintionen wäh-
- rend der Arbeit mit CKBD nicht mehr
- geändert werden, was aber auch nicht
- zwingend benötigt wird. Ich schätze,
- daß man die Tastaturmakros, die man
- zwei oder drei Monate in Betrieb hatte,
- aus Gewöhnung nicht mehr ändert. Also
- lohnt sich eine solche Editorfunktion
- nur dann, wenn man sich noch an die neuen
- Makros gewöhnt und hier und da noch
- Änderungen machen muß. Mit diesem Manko
- von CKBD kann man aber auch noch mit
- Speicherriesen wie Turbo C oder Turbo
- Pascal arbeiten. Außerdem ist
- CKBD dadurch begrenzt, daß Code und
- Textdaten in ein einziges Codesegment
- passen müssen. Abzüglich PSP und Code
- bleiben dem Anwender aber noch 64736
- Bytes Platz zur freien Verfügung und es
- sollte mich wundern, wenn das nicht
- reicht.
-
- ,,z Fehlermeldungen
-
- So einfach das Format der Quelldatei
- auch sein mag, Fehler sind nicht zu
- vermeiden. Und so hat MakeCKBD unter
- Umständen auch etwas "zu meckern". Und
- zwar genau dann, wenn einer der folgen-
- den Fälle eintritt:
-
- - Die hexadezimale Scancode-Konstante
- ist nicht vier Zeichen lang oder wird
- nicht von einem gültigen String ver-
- folgt;
- - Der String fängt nicht mit einem
- Hochkomma an oder er hört nicht mit
- einem solchen auf. Dies kann zum Bei-
- spiel dadurch entstehen, wenn MakeCKBD
- die ersten 255 Zeichen gelesen hat, die
- Zeile aber noch nicht beendet ist.
- Dann werden nämlich die restlichen Zei-
- chen bis Zeilenende überlesen, und un-
- ter diesen Zeichen kann natürlich auch
- das schließende Hochkomma-Zeichen
- sein. Also: In der Kürze liegt die Wür-
- ze...
- - Es soll ein Leerstring zugeordnet
- werden. MakeCKBD und ich sind ganz ent-
- schieden gegen eine Zuordung von leeren
- Strings;
- - Nach einem Backslash (\) folgt keine
- gültige Zahlenkonstante, also im Be-
- reich von 0 bis 255;
- - Es wird Innerhalb des Strings ein
- NUL-Zeichen verwendet, das das Zei-
- lenende für CKBD darstellt. Diese Ana-
- lyse geschieht im Interesse des Anwen-
- ders...
-
- Sofern kein interner Fehler im Compiler
- auftritt, werden alle diese Fälle mit
- einer vielsagenden, neudeutschen Mel-
- dung quittiert und die betroffenen Zei-
- len ignoriert. Zwei- oder Mehrfachdefi-
- nitionen werden ebenfalls ignoriert,
- so daß nur die erste Tastendefinition
- relevant ist.
-
- ,,z Die internen Details
-
- Um den Hauptspeicher nicht mehr als
- nötig zu belasten, wurde und wird die
- Installationsroutine von CKBD nach der
- Installation freigegeben. Das hat aber
- für CKBD interessante Konsequen-
- zen. Da MakeCKBD die Textdaten an das
- Ende des residenten Teils von CKBD an-
- hängt und die Textdaten selten eine
- vorhersagbare Länge haben, weiß niemand
- so recht, wo die Installationsroutine
- im Codesegment nun eigentlich steht.
- MakeCKBD trägt zur Behebung dieser Pro-
- blematik die Länge der im Speicher ver-
- bleibenden Teile von CKBD.COM ebenfalls
- in das ausführbare Programm ein. Diese
- ist aber gleich dem Offset der Instal-
- lationsroutine im Codesegment, so daß
- diese mittels
- ,,l
- MOV SI,Offset
- JMP SI
- ,,n
- aufgerufen wird. "Ist ja umständlich!"
- -- Richtig, aber da die Installations-
- routine auch Meldungen ausgibt, und
- deren ganauen Adressen auch nicht fest-
- stehen, benötigt sie das SI-Register
- außerdem noch zum Adressieren ihrer
- Variablen. Ein geladenes CKBD.COM sieht
- wie folgt aus:
- ,,l
- 0000H +-------------------------+
- | PSP (von DOS kreiert) |
- +-------------------------+
- 0100H | CKBD1 |
- | Der residente Programm- |
- | teil von CKBD mit ISR. |
- +-------------------------+
- 01A6H | Textdaten |
- | Dieser Teil hat keine |
- | feste Länge ... |
- +-------------------------+
- xxxx | CKBD2 |
- | Installationsroutine u. |
- | ihre Daten, wird später |
- | freigegeben ... |
- +-------------------------+
- ,,n
- Der residente Teil, CKBD1 genannt, ist
- genau 166 Byte groß (oder besser:
- klein) und hängt sich an den INT 16H
- an, so daß jeder von KEYBGR oder vom
- BIOS gelieferte Scancode abgefragt
- wird, bevor er CKBD1 verläßt. Dazu ist
- der Teil von CKBD.COM, der 'Textdaten'
- genannt wurde, ebenfalls in zwei Teile
- getrennt worden. Der erste Teil, der
- direkt an CKBD1 anschließt, enthält
- eine Scancodetabelle, in der jeder ge-
- suchte Scancode und das Offset des ihm
- zugeordneten Strings steht. Dabei be-
- deutet der Scancode FFFFH das Tabellen-
- ende. Daran anschließend folgen die
- Strings, alle in C-Manier null-termi-
- niert.
-
- ,,z Die verwendete Ware
-
- MakeCKBD habe ich mit Turbo Pascal 5.0
- entwickelt, wobei großes Lob den Ent-
- wicklern dieses Pakets zukommt, deren
- Debugger ich nötiger hatte als jemals
- zuvor (ReadSource, Compile). CKBD1 und
- CKBD2 wurden ganz und gar mit TASM as-
- sembliert, den ich hiermit einmal aus-
- probieren wollte, um zu sehen, ob die
- große Erleuchtung über mich kommen wür-
- de. Bis jetzt ist da nur ein kleines
- Schimmern... Neben den Benutzer- und
- Referenz-Handbüchern und dem Quell-
- code von CKBD 2.00, waren für die Ent-
- wicklung von CKBD noch folgende Quellen
- von zum Teil großer Bedeutung:
-
- - Memory Resident Programming on the
- IBM PC (Thomas A. Wadlow; Addison-
- Wesley Publishing Company, 1987; Kom-
- mentar: Einzigartig!)
-
- - 8086/8088/8087/80186/80188 Program-
- mer's Pocket Reference Guide (Intel
- Corporation; 1987; Kommentar: Notwen-
- dig.)
-
- Folgendes Vorgehen schlage ich vor, um
- CKBD1 und CKBD2 für das Einbinden in
- Turbo Pascal 5.0 vorzubereiten:
-
- TASM D:P\CKBDx,D:P\CKBDx
- TLINK D:P\CKBDx,D:P\CKBDx
- EXE2BIN D:P\CKBDx
- BINOBJ D:P\CKBDx D:P\CKBDx CKBDx
-
- Dabei steht x für 1 oder 2, D und P für
- die Pfadangaben. (Der letzte Parameter
- von BINOBJ hat tatsächlich keine sol-
- chen Angaben, es handelt sich um eine
- PUBLIC-Deklaration.) BINOBJ wird von
- INSTALL zu den BGI-Dateien von Turbo
- Pascal kopiert und bringt Binärdateien
- in ein Turbo Pascal-verträgliches
- Format.
- ,,v
- (wr)