Ein Tastatur-Makro-Expander

Jan Starzynski Maßmannstr. 105 O-2500 Rostock 1. Juni 1993

Inhaltsverzeichnis

1. News 2 2. Was soll das? 2 3. Wie erstelle ich meine eigenen Abkürzungen? 2 4. Welche Probleme gibt es? 6 5. Wer mag programmieren? 6 6. Welche Programme gehören dazu? 7 7. Warum mir nicht mal schreiben? 8 8. Wann schreiben? 9

1. News

Also, für alle, die schon mit dem Expander gearbeitet haben. Was gibt’s neues? Zunächst natürlich 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 BIOS-MAKR 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 BIOS-MAKR ab sofort auch richtig mit TEMPUS und QED zusammen. (s.S. 4)

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.S. 5)

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 Makrotabelle verwendent (natürlich nur, wenn fehlerfrei).

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 Programmen 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 dazugehöriges Tool. Was ist nun neu? Die Tastaturmakros werden hier völlig anders definiert, eher wie Abkürzungen. Wenn ich ’js.’ eingebe, wird folgendes ausgegeben:

Jan Starzynski
Maßmannstr. 105
O-2500 Rostock

Es ist natürlich auch möglich, Abkürzungen 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öglichkeit, in nahezu jedem sauber programmierten Editor die gleichen Abkürzungen zur Verfügung zu haben.

3. Wie erstelle ich meine eigenen Abkürzungen?

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 berücksichtigt werden. Dadurch gibt es wieder Ärger mit QED etc., aber die MKR-Dateien werden etwas kürzer. (2 steht für 2-Byte-Modus [Scan+Ascii], normal ist der 3-Byte-Modus [Shift+Scan+Ascii])

Die Option -s bewirkt, daß die erzeugte Makrotabelle nicht sofort übernommen wird, sondern nur auf Diskette gesichert wird.

Beide Optionen können natürlich 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 <Backspace> gelöscht und anschließen der Ersetzungstext ausgegeben. Beispeil hierfür 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 für die klassischen einbuchstabigen Makros. Für 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 <Backspace> <Return>. Dies wäre übrigens 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 gewünschte Shift-Tasten-Kombina-tion 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:

a) ’Zeichenkette’

b) ”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 für 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. für 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 eingeführt, weil BIOSMAKR sonst alle Zeichen aus dem Tastaturpuffer entfernt. Im Tastaturinterrupt ist nämlich die Zeit zu knapp für 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 Verfügung. (Ich hatte z.B. Ärger mit Sysmon, da dieser sein Shift-Help auch aus dem Tastaturpuffer direkt liest und durch BIOSMAKR nicht fand.) Achtung: Es wird nur der Scan-Code auf Übereinstimmung überprüft. 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

4. Welche Probleme gibt es?

Zunächst einmal: Der Makro-Expander überwacht alle Zeichen, die über die Tastatur eingegeben werden. Das sind z.B. nicht die, die bei festgehaltener Taste automatisch eingegeben werden. Aber das dürfte an sich kein Hindernis sein. Schwieriger wird es mit dem Timing. In manchen Programmen kommen die Zeichen für die Verarbeitung zu schnell in den Puffer und werden daher verschluckt. Das fällt insbesondere immer dann auf, wenn mehrzeilige Makros geschrieben werden. In xEdit trifft das z.B. meist für 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 einklinken, z.B. Bildschirmschoner. Sie sollten immer VOR BIOSMAKR im Auto-Ordner stehen, sonst kriegen sie keine Tastendrücke mit.

5. Wer mag programmieren?

Jetzt zum programmtechnischen Teil. Wie funktioniert das ganze nun? Eine Routine sitzt im ’ikbdsys’-Vektor (über Kbdvbase()) geholt) und besorgt alle eingegebenen Zeichen aus dem Tastaturpuffer. Diese werden dann der Makro-Auswert-Routine übergeben und ggf. in den Tastaturpuffer zurückgeschrieben. 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 Umgang des TOS mit den Schreibund Lesezeigern der IOREC-Struktur. Für die Tastatur z.B. werden beide Zeiger vertauscht. Tastaturzeichen werden auf verschiedenen 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 für 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 für Makrotabelle in Bytes */
    int *makro_table;     /* Zeiger auf Beginn der Tabelle */
    int max_makro;        /* Größe des Puffers für 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 für die Makrotabelle 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 (genauer 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.

6. Welche Programme gehören dazu?

Zu diesem Paket gehören folgende Dateien:

• BIOSMAKR.PRG ; der eigentliche Expander

• KBD2MKR.TTP ; eine Art Compiler für 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 für LaTeXianer

• MAKROKEY.TXT ; die Anleitung für die Normalen

• TEST.KBD ; ein Makrotabelle im Ascii-Format

• TEST.MKR ; das übersetzte Teil dazu

• TASTE.TOS ; zeigt die benötigten Codes für 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 für die Makrotabelle reserviert wird. Ist diese beim Start von BIOSMAKR größer als der reservierte Platz, wird er automatisch vergrößert. Änderungen, die hier eingetragen werden, wirken erst, wenn sie abgespeichert wurden und ’resettet’ wurde.

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 verlorengegangen, d.h. hier gibt es keinen Anschluß. Und Telekom macht Mut: Frühestens 1995 soll es wieder soweit sein. Jetzt kann man mich nur noch über das Internet erreichen.

p67@hp1.uni-rostock.de

Wenn diese Adresse angegeben wird, kommt die mail auch aus dem Mausnet richtig bei mir an. Natürlich geht’s auch über die gelbe Post unter Jan Starzynski Maßmannstr. 105 O-2500 Rostock Ich bin immer dankbar für Ideen, Bug-Report etc.

8. Wann schreiben?

na, am besten gleich nach dem Probieren. PS: Sourcen sind zu haben gegen Rückumschlag. Es gibt die Makro-Ersetzung auch als Einzelroutine zum Einbauen in eigene Programme.

PPS: Schönen Dank an Roman Hodek für 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 Keine Panik!