************************************************************** * * * Ein Tastatur-Makro-Expander * * * ************************************************************** Jan Starzynski Maámannstr. 105 O-2500 Rostock 3. Juni 1993 Inhaltsverzeichnis ================== 0.1) News 0.2) Was soll das? 0.3) Wie erstelle ich meine eigenen Abkrzungen? 0.4) Welche Probleme gibt es? 0.5) Wer mag programmieren? 0.6) Welche Programme geh”ren dazu? 0.7) Warum mir nicht mal schreiben? 0.8) Wann schreiben? 0.1) News ========= Also, fr alle, die schon mit dem Expander gearbeitet haben. Was gibt's neues? Zun„chst natrlich die bliche Fehlerbeseitigung. Und hier war einiges zu tun. Kleine, aber hartn„ckige und teilweise in ihren Auswirkungen katastrophale Fehler. Backspaces zum L”schen von Makros standen vorher in der MKR-Datei, jetzt ist BIOSMAKR selbst in der Lage, sowas zu bearbeiten. Des weiteren gibt es die M”- glichkeit, bei der Eingabe den Status der Shift-Tasten beachten zu lassen, auáerdem werden sie bei Ausgabe des Makrotextes automatisch richtig gesetzt. Dadurch arbeitet BIOSMAKR ab sofort auch richtig mit TEMPUS und QED zusammen. (s.Abschnitt 0.3 ) Auáerdem gibt es jetzt 'Magic Keys' die von BIOSMAKR ignoriert werden, um einigen Programmen die M”glichkeit zu lassen, ihren 'Spezialcode' direkt aus dem Tastaturpuffer lesen zu k”nnen. (s.Abschnitt 0.3 ) Es lohnt also, die MKR-Dateien nochmal neu zu bersetzen, auch wenn es noch mit den alten funktioniert. In KBD2MKR wurden die Fehlerbehandlungsroutinen verbessert. Auáerdem wird die erzeugte Makrotabelle sofort in den Speicher kopiert und als aktuelle Ma- krotabelle verwendent (natrlich nur, wenn fehlerfrei). 0.2) Was soll das? ================== Jeder kennt sicher Programme, in denen einzelne Tasten mit gewissen Aktionen belegt werden, sogenannte Tastaturmakros. Oftmals sind das die Funktionstasten Control-, oder Alternate-Kombinationen. Leider gibt es das nicht in allen Pro- grammen und unterschiedlich sind sie meist auch. Aužerdem muž man sich die entsprechende Taste und ihre Wirkung merken. Das hat mir nicht gefallen, und so entstand in ein paar langen N„chten das Programm BIOSMAKR.PRG und ein dazu- geh”riges Tool. Was ist nun neu? Die Tastaturmakros werden hier v”llig anders definiert, eher wie Abkrzungen. Wenn ich 'js.' eingebe, wird folgendes aus- gegeben: Jan Starzynski Mažmannstr. 105 O-2500 Rostock Es ist natrlich auch m”glich, Abkrzungen zu definieren, die nur aus einem Zeichen bestehen, womit wir wieder die alten Makros h„tten. Das wirklich neue ist also die M”glichkeit, mit mehrbuchstabigen Makros zu arbeiten und die M”g- lichkeit, in nahezu jedem sauber programmierten Editor die gleichen Abkrzun- gen zur Verfgung zu haben. 0.3) Wie erstelle ich meine eigenen Abkrzungen? ================================================ Hierzu dient das Programm KBD2MKR.TTP in Verbindung mit einem normalen Ascii- Editor. Ein Beispiel ist TEST.KBD, TEST.MKR ist die mit KBD2MKR.TTP bersetzte Version davon. Das TTP-Programm wird wie folgt genutzt: KBD2MKR -2 -s TEST.KBD TEST.MKR Die Option -2 bewirkt dabei, daá der Zustand der Shift-Tasten weder bei der Ein- noch bei der Ausgabe bercksichtigt werden. Dadurch gibt es wieder Žrger mit QED etc., aber die MKR-Dateien werden etwas krzer. (2 steht fr 2-Byte- Modus [Scan+Ascii], normal ist der 3-Byte-Modus [Shift+Scan+Ascii]) Die Option -s bewirkt, daá die erzeugte Makrotabelle _nicht_ sofort bernom- men wird, sondern nur auf Diskette gesichert wird. Beide Optionen k”nnen natrlich weggelassen werden, Standard sind der 3- Byte-Modus (mit Shift-Tasten) und das sofortige Aktualisieren der Makrotabelle im Speicher. Wie sind nun die Makroquelltexte aufgebaut? ------------------------------------------- Als Beispiel nehme man TEST.KBD. Folgender Zeilenaufbau ist gefordert: ?Makro Ersetzungstex * Kommentar ?Makro = Ersetzungstex * Kommentar ?Makro + Ersetzungstex * Kommentar * Kommentar (leere Zeile) Die erste Form bewahrt die Kompatibilit„t zu den Makrodateien von xEDIT. In der zweiten Form werden alle eingegebenen Makrozeichen durch gel”scht und anschliežen der Ersetzungstext ausgegeben. Beispeil hier- fr ist das oben angebenen 'js.', das erst gel”scht wird und dann ersetzt wird. Die dritte Form erg„nzt den eingegebenen Text durch den Text nach dem Pluszeichen. Bsp.: #in wird zu #include <> , ohne #in vorher zu l”schen. Die dritte und vierte Form bewirken nichts. Die erste Form ist gleich der zweiten, wenn dort das '=' hinter dem ersten Code kommt, sprich, es ist die Form fr die klassischen einbuchstabigen Ma- kros. Fr einbuchstabige Makros gibt es keine '+' Form! Makro- und Ersetzungstext k”nnen in folgenden Formen eingegeben werden: 1) Direkt als Code, die einzelnen Codes durch Leerzeichen getrennt. Bsp: $3b00 = $0e08 $1c0d ersetzt die Funktiostaste f3 durch . Dies w„re bri- gens identisch zu Bsp: $3b00 $0e08 $1c0d Erlaubte Zahlensysteme sind a) Hexzahlen, gekennzeichnet durch $ oder & b) Oktalzahlen, gekennzeichnet durch O oder o, (also der Buchstabe Oh) c) Dezimalzahlen, die nicht gesondert gekennzeichnet werden Erlaubt ist es auáerdem, vor den Codes die gewnschte Shift-Tasten- Kombination anzugeben, geklammert durch 'S'. Das geschieht in folgender Form: Bsp: ?S|~S $7f00 '{' **** Shift + Alt + '(' zu '{' Der Shift-Status bezieht sich dabei nur auf den unmittelbar folgenden Code. Die verschiedenen Tasten werden wie folgt dargestellt: - |Shift - ~Alternate - ^Control Zwischen linker und rechter Shifttaste wird nicht unterschieden, CapsLock wird ignoriert. 2) als Zeichenketten in den Formen: g) 'Zeichenkette' h) "Zeichenkette" Innerhalb der Zeichenketten haben folgende Kombinationen eine besondere Bedeutung: \e Escape-Taste \b Backspace \t Tabulator \r Return \n Control-Return \f1 die F-Tasten F1-F9 . . . \f9 \f0 F10 \F1 . . . \F9 die F-Tasten F1-F9, zusammen mit shift \F0 shift F10 \c Clr-Home \^ Pfeil hoch \< links \> rechts \_ unten \i Insert \d Delete \u Undo \h Help \p kein Zeichen ausgeben: Pause \\ \ \' ' \" " \S Begin einer Shift-Tasten-Erkl„rung, Ende mit S ( also z.B.: \S~|^S ) Hiermit ist es m”glich, eine Reihe von Sonderaktionen auszul”sen, ohne sich mit Scancodes rumzuq„len. Die 'rechte' Seite einer Tastendefinition muá immer mindestens ein Zeichen enthalten, sonst gibt's eine Fehlermeldung. Und noch ein Bonbon: Diese Regel gilt nicht fr die ersten Definitionen, wenn die dort definierten Makros aus nur einem Zeichen besteht. Diese sind dann 'Magic Keys', die von BIOSMAKR nicht beachtet wird. Sobald aber einmal ein Ersetzungstext angegeben wurde, ist die Angabe von 'Magic Keys' nicht mehr erlaubt. Bsp. fr Definition: ?'\h' * Magic-Key: Help-Taste ?'\b' * Magic-Key: Backspace ?'An'+' Jan' * erstes Makro ?'a' * Fehler: Magic keys hier nicht mehr erlaubt ?'\h a'+'Hilfe zu a' * geht nicht, Help wird ignoriert ?'ab'+'a\h' * geht: auf rechter Seite 'Magic Keys' erlaubt bewirkt, daá die Help- und die Backspace-Taste nicht beachtet werden. Das heiát, es k”nnen auch keine Makros geschrieben werden, die die Help-Taste auf der _linken_ Seite beinhalten. Ich habe das eingefhrt, weil BIOSMAKR sonst alle Zeichen aus dem Tastaturpuffer entfernt. Im Tastaturinterrupt ist n„mlich die Zeit zu knapp fr eine Bearbeitung, und so hebe ich das Zeichen auf und bearbeite es sp„ter. Der 'Magic Key' hingegen wird nicht entfernt und auch nicht bearbeitet, steht somit anderen Anwendungen ganz normal zur Verfgung. (Ich hatte z.B. Žrger mit Sysmon, da dieser sein Shift-Help auch aus dem Ta- staturpuffer direkt liest und durch BIOSMAKR nicht fand.) Achtung: Es wird nur der Scan-Code auf šbereinstimmung berprft. Irgendwelche Shift-Tasten werden dabei ignoriert, bis auf die Ausnahem, wo sie eine Žnderung des Scan-Codes durch das Betriebssystem bewirken. Bsp: ?'A' * alles mit 'a' oder 'A' wir ignoriert 0.4) Welche Probleme gibt es? ============================= Zun„chst einmal: Der Makro-Expander berwacht alle Zeichen, die ber die Ta- statur eingegeben werden. Das sind z.B. nicht die, die bei festgehaltener Ta- ste automatisch eingegeben werden. Aber das drfte an sich kein Hindernis sein. Schwieriger wird es mit dem Timing. In manchen Programmen kommen die Zeichen fr die Verarbeitung zu schnell in den Puffer und werden daher ver- schluckt. Das f„llt insbesondere immer dann auf, wenn mehrzeilige Makros ge- schrieben werden. In xEdit trifft das z.B. meist fr das 2. Zeichen einer Zeile zu. Die Ausgabe ist derzeit allerdings schon so gebremst, daž bei mir keine Probleme auftraten. Žnderungen der Bremse werden im n„chsten Abschnitt behandelt. Aužerdem gibt es die M”glichkeit, spezielle 'Pausen' zu erzeugen. Ein Problem sind andere Programme, die sich in den ikbdsys-Vektor einklin- ken, z.B. Bildschirmschoner. Sie sollten immer *VOR* BIOSMAKR im Auto-Ordner stehen, sonst kriegen sie keine Tastendrcke mit. 0.5) Wer mag programmieren? =========================== Jetzt zum programmtechnischen Teil. Wie funktioniert das ganze nun? Eine Rou- tine sitzt im 'ikbdsys'-Vektor (ber Kbdvbase()) geholt) und besorgt alle ein- gegebenen Zeichen aus dem Tastaturpuffer. Diese werden dann der Makro-Auswert- Routine bergeben und ggf. in den Tastaturpuffer zurckgeschrieben. Weitere auszugebende Zeichen werden im Gemdos-Vektor 'etv_timer' in den Tastaturpuffer geschrieben. Das ist im Prinzip auch schon alles. Probleme bereitet vor allem die etwas komplizierte Pufferstruktur des TOS sowie einige Unklarheiten im Um- gang des TOS mit den Schreib- und Lesezeigern der IOREC-Struktur. Fr die Ta- statur z.B. werden beide Zeiger vertauscht. Tastaturzeichen werden auf ver- schiedenen Pufferebenen behandelt, so daž es leicht vorkommen kann, das mal ein Zeichen verschwindet, weil es irgendwo ausgefiltert wurde (bzw. einfach nicht registriert wurde). (alle Angaben fr Mega STE mit TOS 2.05) Das Programm installiert einen Cookie mit der Bezeichnung 'JSmk'. Der Cookie-Wert zeigt auf folgende Struktur: struct { long magic; /* 'JSmk' */ int on_off_flag; /* 0: kein Makroersatzt, <>0 Makroersatz */ int speed; /* Ausgabegeschwindigkeit 0: maximal */ long makro_table_size; /* Platz fr Makrotabelle in Bytes */ int *makro_table; /* Zeiger auf Beginn der Tabelle */ int max_makro; /* Gr”že des Puffers fr eingebenen Zeichen */ int *makro_receive; /* Zeiger auf diesen Puffer */ }; Dieselbe Struktur findet man mit Offset 4 im Text-Segment der Programmdatei. Bitte dort keine Zeiger „ndern. makro_table_size Bytes werden fr die Makrota- belle im Speicher resident gehalten. Die Gr”že max_makro darf nur verkleinert werden, das hat aber keinen positiven Effekt. Jede Erh”hung des Wertes speed um 1 vergr”žert die Pause zwischen der Ausgabe zweier Zeichen um 20 ms (ge- nauer Tickcal() ms, 0: 20 ms). Im Programm befindet sich des weiteren eine Patch-Variable, die den Namen der Makrotabelle enth„lt, die beim Programm-Start geladen wird. (Anfang des DATA-Segmentes) Die Makrotabelle im Speicher kann entweder durch „ndern der Adresse ge„ndert werden oder durch kopieren einer neuen Tabelle an den alten Platz. Vorher aber am besten durch on_off_flag die Routinen lahmlegen. 0.6) Welche Programme geh”ren dazu? =================================== Zu diesem Paket geh”ren folgende Dateien: - BIOSMAKR.PRG ; der eigentliche Expander - KBD2MKR.TTP ; eine Art Compiler fr Makrodateien - KBD2MKR.CNF ; die Konfigurationsdatei dazu - KBDMKR.CPX ; CPX zum Einstellen diverser Parameter - MKR_PRG.PRG ; wie das CPX, nur als Programm (oder nach Umbenennen als Acc) - MAKROKEY.DVI ; die Anleitung fr LaTeXianer - MAKROKEY.TXT ; die Anleitung fr die Normalen - TEST.KBD ; ein Makrotabelle im Ascii-Format - TEST.MKR ; das bersetzte Teil dazu - TASTE.TOS ; zeigt die ben”tigten Codes fr KBD2MKR an Ich w„re Euch zu Dank verpflichtet, wenn Ihr diese Dateien alle vollst„ndig und zusammen verbreitet. Des weiteren kann ich keine Garantie bernehmen, wenn Euch durch diese Programme irgendwelche Daten verloren gehen oder sonstwie Schaden entsteht. Tr”stet Euch, mich trifft's wahrscheinlich als ersten. Zur Bedienung nur kurz: BIOSMAKR.PRG geh”rt in den AUTO-Ordner, kann aber auch vom Desktop gestartet werden. Das CPX oder das equivalente PRG dienen zum schnellen Laden einer anderen Makrotabelle sowie zum Ein- und Ausschalten der Makroexpansion. Der Parameter Geschwindigkeit wurde weiter oben erl„utert, die Tabellengr”že bestimmt den Platz, der vom Programm fr die Makrotabelle reser- viert wird. Ist diese beim Start von BIOSMAKR gr”žer als der reservierte Platz, wird er automatisch vergr”žert. Žnderungen, die hier eingetragen wer- den, wirken erst, wenn sie abgespeichert wurden und 'resettet' wurde. 0.7) Warum mir nicht mal schreiben? =================================== *!!! Achtung !!!* Ich WAR im Maus-Netz unter Jan Starzynski @ HRO zu erreichen. das ist jetzt nicht mehr so. Durch den Umzug ist mir das Telefon verlorenge- gangen, d.h. hier gibt es keinen Anschluž. Und Telekom macht Mut: Frhestens 1995 soll es wieder soweit sein. Jetzt kann man mich nur noch ber das Inter- net erreichen. p67@hp1.uni-rostock.de Wenn diese Adresse angegeben wird, kommt die mail auch aus dem Mausnet rich- tig bei mir an. Natrlich geht's auch ber die gelbe Post unter Jan Starzynski Mažmannstr. 105 O-2500 Rostock Ich bin immer dankbar fr Ideen, Bug-Report etc. 0.8) Wann schreiben? ==================== na, am besten gleich nach dem Probieren. PS: Sourcen sind zu haben gegen Rckumschlag. Es gibt die Makro-Ersetzung auch als Einzelroutine zum Einbauen in eigene Programme. PPS: Sch”nen Dank an Roman Hodek fr seinen TeX2TXT-Konverter. Wie man an der Text-Datei erkennen kann, funktioniert er ganz gut. So, dann sinniert mal weiter ber die Bedeutung der Zahl 42 und vor allem