home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 09 / ldm / makeckbd.con < prev    next >
Encoding:
Text File  |  1989-06-21  |  10.1 KB  |  324 lines

  1. ,,u Listing des Monats
  2.  
  3. ,,d Compiler an die Tastatur!
  4.  
  5.  
  6. ,,a von Olaf Stoyke
  7.  
  8. ,,e
  9. Das Programm "Change Keyboard" (CKBD)
  10. ist den Lesern der TOOLBOX schon einmal
  11. in der Ausgabe 3'89 begegnet. Mußte bei
  12. der ersten Version zum Ändern der er-
  13. weiterten Tastaturdefinitionen noch ein
  14. Assembler bemüht werden, so können mit
  15. der hier vorgestellten Version alle
  16. Tastaturdefinitionen als Textdatei zu
  17. einem ready-to-run COM-Programm compi-
  18. liert werden. Und hatte man mit der
  19. Urversion bis zum Ausschalten des Rech-
  20. ners veränderte Tastendefintionen, so
  21. genügt es bei der neuen Version, das
  22. Programm mit (irgend)einem Parameter
  23. aufzurufen, um es aus dem Speicher zu
  24. entfernen.
  25.  
  26. ,,n,,g
  27. CKBD ist nach wie vor ein Programm, das
  28. sich resident im Speicher niederläßt
  29. und es dem Anwender ermöglicht, be-
  30. liebige Tasten umzudefinieren. Mit der
  31. neuen Version ist es möglich, daß einer
  32. Taste bis zu etwa 240 Zeichen zugeord-
  33. net werden. Diese Zahl ergibt sich aus
  34. der Größe des Lesepuffers in MakeCKBD,
  35. der vom Typ "String" ist. Alle neuen
  36. Defintionen sind in einem speziellen,
  37. aber einfachen Format in eine Textdatei
  38. zu schreiben, die dann mit MakeCKBD zu
  39. CKBD.COM compiliert wird. Wie sieht
  40. dieses Format aus?
  41.  
  42. Das erste Feld in einer Zeile muß eine
  43. hexadezimale Zahl sein, die vier Zei-
  44. chen lang ist. Sie repräsentiert den
  45. Scancode der umzudefinierenden Taste,
  46. den man unter anderem dem technischen
  47. Handbuch des Rechners entnehmen kann.
  48. Das darauf folgende Feld ist der
  49. String, der der Taste zugeordnet werden
  50. soll. Dieser String muß durch Anfüh-
  51. rungszeichen eingeleitet und abge-
  52. schlossen sein. Wenn diese Zeichen aber
  53. auch in dem String enthalten sein sol-
  54. len, kann man als erste Möglichkeit als
  55. Hochkomma sowohl <'> als auch <"> ver-
  56. wenden, jeweils dann aber paarweise,
  57. versteht sich.
  58.  
  59. Außerdem dürfen in der Textdatei auch
  60. kommentierende Texte auftauchen. Diese
  61. werden durch ein Semikolon eingeleitet
  62. und veranlassen MakeCKBD, wie in einem
  63. Assembler-Quellcode, den Rest der Zeile
  64. zu ignorieren. Kommentare und Tasten-
  65. definitionen benötigen aber jeweils
  66. eigene Zeilen.
  67.  
  68. Als Beispiel definieren wir hier für
  69. einen Wordstar-Editor ein PROCEDURE-
  70. Makro, das mit der Kombination [Alt][P]
  71. aktiviert werden soll:
  72.  
  73.  1900 ist der Hex-Scancode von [Alt][P]
  74.  
  75.  1900 "PROCEDURE ();<S><S><S>"
  76.  
  77. Die <S>-Teile sollen ^S-Zeichen dar-
  78. stellen, so wie sie mit ^P^S in den
  79. Text gebracht werden. Man kann, wenn
  80. man will oder muß, anstelle von ^P^S,
  81. also der direkten Einbindung der Zei-
  82. chen in den String, auch /19 schreiben.
  83. Ein im String auftauchendes Backslash-
  84. Zeichen wird vom Compiler als Sonder-
  85. zeichen interpretiert. Folgt hierauf
  86. nämlich eine dezimale Zahlenkonstante,
  87. so wird diese als ASCII-Konstante in-
  88. terpretiert, ansonsten wird nur das
  89. folgende Zeichen berücksichtigt. Ei-
  90. nen Dateinamen mit Pfadangaben muß man
  91. also wie folgt angegeben:
  92.  
  93.  5E00 "C:\\TURBO\\PASCAL5\\CKBD.COM"
  94.  
  95. und die Funktiostaste [Ctrl[F1] ist mir
  96. dem Makro belegt.
  97. Dies ist also die zweite Möglichkeit,
  98. Hochkomma-Zeichen in den String zu
  99. übernehmen, weil nun ja Folgendes kor-
  100. rekt übersetzt werden kann:
  101.  
  102.  ; [Alt][H] läßt grüßen ...
  103.  
  104. 2300  'WriteLn(\'Hello, World!\');\13'
  105.  
  106. ,,z Kill CKBD
  107.  
  108. Wie schon erwähnt, kann man CKBD auch
  109. wieder aus dem Speicher entfernen.
  110. Genaugenommen stimmt das so nicht, denn
  111. CKBD ist garantiert auch nach dem fol-
  112. genden Procedere im Speicher, nur hat
  113. es keine Kontrolle mehr über die Scan-
  114. codes der Tastatur. Dazu braucht man
  115. CKBD nur mit einer nicht-leeren Parame-
  116. terzeile aufrufen, das heißt, daß sich
  117. etwas mehr als nur Blanks hinter
  118.  
  119.  C:\>CKBD
  120.  
  121. befinden muß, zum Beispiel:
  122.  
  123.  CKBD Entferne CKBD aus dem Speicher
  124.  
  125. CKBD erkennt dann, daß der Anwender ein
  126. vorher geladenes CKBD entfernen möchte.
  127. CKBD erkennt hier und bei dem Versuch
  128. einer Installation, ob es bereits im
  129. Speicher ist, und reagiert entspre-
  130. chend.
  131.  
  132. ,,z Die Grenzen des Tastaturcompilers
  133.  
  134. Ja, Ja, CKBD hat auch Grenzen... Zum
  135. einen ging schon aus dem obigen Bei-
  136. spiel hervor, daß CKBD innerhalb der
  137. neuen Tastendefinition noch keine wei-
  138. teren Scancodes verarbeiten kann. Fer-
  139. ner können die Tastendefintionen wäh-
  140. rend der Arbeit mit CKBD nicht mehr
  141. geändert werden, was aber auch nicht
  142. zwingend benötigt wird. Ich schätze,
  143. daß man die Tastaturmakros, die man
  144. zwei oder drei Monate in Betrieb hatte,
  145. aus Gewöhnung nicht mehr ändert. Also
  146. lohnt sich eine solche Editorfunktion
  147. nur dann, wenn man sich noch an die neuen
  148. Makros gewöhnt und hier und da noch
  149. Änderungen machen muß. Mit diesem Manko
  150. von CKBD kann man aber auch noch mit
  151. Speicherriesen wie Turbo C oder Turbo
  152. Pascal arbeiten. Außerdem ist
  153. CKBD dadurch begrenzt, daß Code und
  154. Textdaten in ein einziges Codesegment
  155. passen müssen. Abzüglich PSP und Code
  156. bleiben dem Anwender aber noch 64736
  157. Bytes Platz zur freien Verfügung und es
  158. sollte mich wundern, wenn das nicht
  159. reicht.
  160.  
  161. ,,z Fehlermeldungen
  162.  
  163. So einfach das Format der Quelldatei
  164. auch sein mag, Fehler sind nicht zu
  165. vermeiden. Und so hat MakeCKBD unter
  166. Umständen auch etwas "zu meckern". Und
  167. zwar genau dann, wenn einer der folgen-
  168. den Fälle eintritt:
  169.  
  170. - Die hexadezimale Scancode-Konstante
  171. ist nicht vier Zeichen lang oder wird
  172. nicht von einem gültigen String ver-
  173. folgt;
  174. - Der String fängt nicht mit einem
  175. Hochkomma an oder er hört nicht mit
  176. einem solchen auf. Dies kann zum Bei-
  177. spiel dadurch entstehen, wenn MakeCKBD
  178. die ersten 255 Zeichen gelesen hat, die
  179. Zeile aber noch nicht beendet ist.
  180. Dann werden nämlich die restlichen Zei-
  181. chen bis Zeilenende überlesen, und un-
  182. ter diesen Zeichen kann natürlich auch
  183. das schließende Hochkomma-Zeichen
  184. sein. Also: In der Kürze liegt die Wür-
  185. ze...
  186. - Es soll ein Leerstring zugeordnet
  187. werden. MakeCKBD und ich sind ganz ent-
  188. schieden gegen eine Zuordung von leeren
  189. Strings;
  190. - Nach einem Backslash (\) folgt keine
  191. gültige Zahlenkonstante, also im Be-
  192. reich von 0 bis 255;
  193. - Es wird Innerhalb des Strings ein
  194. NUL-Zeichen verwendet, das das Zei-
  195. lenende für CKBD darstellt. Diese Ana-
  196. lyse geschieht im Interesse des Anwen-
  197. ders...
  198.  
  199. Sofern kein interner Fehler im Compiler
  200. auftritt, werden alle diese Fälle mit
  201. einer vielsagenden, neudeutschen Mel-
  202. dung quittiert und die betroffenen Zei-
  203. len ignoriert. Zwei- oder Mehrfachdefi-
  204. nitionen werden ebenfalls ignoriert,
  205. so daß nur die erste Tastendefinition
  206. relevant ist.
  207.  
  208. ,,z Die internen Details
  209.  
  210. Um den Hauptspeicher nicht mehr als
  211. nötig zu belasten, wurde und wird die
  212. Installationsroutine von CKBD nach der
  213. Installation freigegeben. Das hat aber
  214. für CKBD interessante Konsequen-
  215. zen. Da MakeCKBD die Textdaten an das
  216. Ende des residenten Teils von CKBD an-
  217. hängt und die Textdaten selten eine
  218. vorhersagbare Länge haben, weiß niemand
  219. so recht, wo die Installationsroutine
  220. im Codesegment nun eigentlich steht.
  221. MakeCKBD trägt zur Behebung dieser Pro-
  222. blematik die Länge der im Speicher ver-
  223. bleibenden Teile von CKBD.COM ebenfalls
  224. in das ausführbare Programm ein. Diese
  225. ist aber gleich dem Offset der Instal-
  226. lationsroutine im Codesegment, so daß
  227. diese mittels
  228. ,,l
  229.         MOV     SI,Offset
  230.         JMP     SI
  231. ,,n
  232. aufgerufen wird. "Ist ja umständlich!"
  233. -- Richtig, aber da die Installations-
  234. routine auch Meldungen ausgibt, und
  235. deren ganauen Adressen auch nicht fest-
  236. stehen, benötigt sie das SI-Register
  237. außerdem noch zum Adressieren ihrer
  238. Variablen. Ein geladenes CKBD.COM sieht
  239. wie folgt aus:
  240. ,,l
  241.   0000H   +-------------------------+
  242.           | PSP (von DOS kreiert)   |
  243.           +-------------------------+
  244.   0100H   | CKBD1                   |
  245.           | Der residente Programm- |
  246.           | teil von CKBD mit ISR.  |
  247.           +-------------------------+
  248.   01A6H   | Textdaten               |
  249.           | Dieser Teil hat keine   |
  250.           | feste Länge ...         |
  251.           +-------------------------+
  252.   xxxx    | CKBD2                   |
  253.           | Installationsroutine u. |
  254.           | ihre Daten, wird später |
  255.           | freigegeben ...         |
  256.           +-------------------------+
  257. ,,n
  258. Der residente Teil, CKBD1 genannt, ist
  259. genau 166 Byte groß (oder besser:
  260. klein) und hängt sich an den INT 16H
  261. an, so daß jeder von KEYBGR oder vom
  262. BIOS gelieferte Scancode abgefragt
  263. wird, bevor er CKBD1 verläßt. Dazu ist
  264. der Teil von CKBD.COM, der 'Textdaten'
  265. genannt wurde, ebenfalls in zwei Teile
  266. getrennt worden. Der erste Teil, der
  267. direkt an CKBD1 anschließt, enthält
  268. eine Scancodetabelle, in der jeder ge-
  269. suchte Scancode und das Offset des ihm
  270. zugeordneten Strings steht. Dabei be-
  271. deutet der Scancode FFFFH das Tabellen-
  272. ende. Daran anschließend folgen die
  273. Strings, alle in C-Manier null-termi-
  274. niert.
  275.  
  276. ,,z Die verwendete Ware
  277.  
  278. MakeCKBD habe ich mit Turbo Pascal 5.0
  279. entwickelt, wobei großes Lob den Ent-
  280. wicklern dieses Pakets zukommt, deren
  281. Debugger ich nötiger hatte als jemals
  282. zuvor (ReadSource, Compile). CKBD1 und
  283. CKBD2 wurden ganz und gar mit TASM as-
  284. sembliert, den ich hiermit einmal aus-
  285. probieren wollte, um zu sehen, ob die
  286. große Erleuchtung über mich kommen wür-
  287. de. Bis jetzt ist da nur ein kleines
  288. Schimmern... Neben den Benutzer- und
  289. Referenz-Handbüchern und dem Quell-
  290. code von CKBD 2.00, waren für die Ent-
  291. wicklung von CKBD noch folgende Quellen
  292. von zum Teil großer Bedeutung:
  293.  
  294. - Memory Resident Programming on the
  295. IBM PC (Thomas A. Wadlow; Addison-
  296. Wesley Publishing Company, 1987; Kom-
  297. mentar: Einzigartig!)
  298.  
  299. - 8086/8088/8087/80186/80188 Program-
  300. mer's Pocket Reference Guide (Intel
  301. Corporation; 1987; Kommentar: Notwen-
  302. dig.)
  303.  
  304. Folgendes Vorgehen schlage ich vor, um
  305. CKBD1 und CKBD2 für das Einbinden in
  306. Turbo Pascal 5.0 vorzubereiten:
  307.  
  308.  TASM D:P\CKBDx,D:P\CKBDx
  309.  TLINK D:P\CKBDx,D:P\CKBDx
  310.  EXE2BIN D:P\CKBDx
  311.  BINOBJ D:P\CKBDx D:P\CKBDx CKBDx
  312.  
  313. Dabei steht x für 1 oder 2, D und P für
  314. die Pfadangaben. (Der letzte Parameter
  315. von BINOBJ hat tatsächlich keine sol-
  316. chen Angaben, es handelt sich um eine
  317. PUBLIC-Deklaration.) BINOBJ wird von
  318. INSTALL zu den BGI-Dateien von Turbo
  319. Pascal kopiert und bringt Binärdateien
  320. in ein Turbo Pascal-verträgliches
  321. Format.
  322. ,,v
  323.                                  (wr)
  324.