Der ST-Zeichensatz bietet viele interessante Sonderzeichen. Leider lassen sich nur die wenigsten direkt mit der Tastatur eingeben. Abhilfe schafft das kleine Accessory ’Keyboard’, das die Tastaturbelegung umdefiniert.
Das Accessory installiert sich beim Booten unter dem Eintrag „Keyboard“ im Desk-Menü. Beim Aufruf erscheint eine kleine Dialogbox (Bild 1), in der die gewünschte Tastaturbelegung ausgewählt werden kann.
Durch den „Sonder“-Button werden die Tasten wie in Bild 2 abgebildet belegt. Damit sind alle Sonderzeichen, außer den hebräischen, auf der Tastatur erreichbar. Ob sie auch wirklich eingegeben werden können, hängt allerdings vom laufenden Programm ab.
Die Auswahl von „Normal“ bewirkt die Rücksetzung der Tastatur auf die Standard-Belegung. Das Accessory merkt sich, in welchem Zustand das Keyboard sich gerade befindet und bietet die jeweils andere als Default-Auswahl an.
Interessanterweise lassen sich mit Benutzung der „CapsLock“-Taste die normalen Großbuchstaben erreichen. Das Betriebssystem erlaubt also nicht die vollständige Umbelegung der Tastatur.
Das Modula-2-Programm selbst ist in Listing 1 abgedruckt. Beim Linken muß im Modula-2 Options-Accessory die „Query“-Marke gesetzt sein. Der Linker fragt dann explizit nach den zu bindenden LNK-Files. Da das Programm ein Accessory werden soll, muß anstatt „GEMX.LNK“ das File „GEMACCX.LNK“ verwendet werden. „KEYBOARD.PRG“ muß anschließend noch in „KEYBOARD. ACC“ umbenannt werden.
Das Programm benutzt die XBIOS-Funktion SetKeyTable zum Umdefinieren der Tastatur-Belegung. Sie erhält als Parameter die Adressen dreier Tabellen, die zur Umsetzung des Tastaturcodes in ASCII-Werte zuständig sind.
Die zwei benötigten neuen Tabellen für normale und geshiftete Tasten werden direkt im Programm mit der „CODE“-Routine erzeugt. Sie bewirkt, daß die angegeben Werte eincompiliert werden. Durch die Compiler-Optionen S, P und T bewirkt das Programm, daß kein zusätzlicher Code erzeugt wird; die Tabellen also über die Adressen der Pseudo-Prozeduren angesprochen werden können, was von der Prozedur InstallNewTables übernommen wird.
Zum Rücksetzen der Tastatur verwendet RestoreOldTables die XBIOS-Routine BiosKeys. Sie versetzt das Keyboard in den Zustand, der beim Booten galt, also der normalen Belegung.
Das Hauptprogramm besteht, für Accessories typisch, aus einer Endlosschleife, die auf eine Mitteilung, daß das Accessory ausgewählt wurde, wartet und dann den Dialog und die Reaktion darauf ausführt.
Gerade bei der Benutzung von Ist-Word ist das Accessory eine große Hilfe, da zur Eingabe von Sonderzeichen meist erst ein Fenster weggeschoben werden muß, um die Zeichentabelle mit der Maus zu erreichen. Es hat sich gezeigt, daß mit der Umschaltung der Tastatur „zwischendurch“ die Verwendung von speziellen Zeichen sogar schneller vonstatten geht.
Falls Sie eine andere Tastaturbelegung wünschen, müssen Sie dazu die schon genannten Tabellen entsprechend ändern. Zur Erläuterung sei daher deren Aufbau dargestellt. Jede Taste liefert bei Betätigung einen Wert an den ST, den sogenannten Scan-Code. Die Zuordnung dieser Codes zu den einzelnen Tasten ist in Bild 3 dargestellt (alle Zahlen hexadezimal).
Wie man sieht, handelt es sich keineswegs um ASCII-Werte, vielmehr entspringen sie der physischen Anordnung der Tasten. Der ST muß nun die Scan-Codes in ASCII-Werte umwandeln. Dazu werden die drei Tabellen verwendet.
Man kann sie als Felder mit je 256 Elementen auffassen, wobei man den Scan-Code als Index verwendet (von Null an gezählt !). Bei Drücken der Taste „3“ nimmt der ST den fünften Wert des Feldes für ungeshiftete Tasten. Bei normaler Tastenbelegung ergibt dies den Wert 51, also das ASCII-Aquivalent des Zeichen „3“.
Wollen Sie nun die Tabellen ändern, so müssen Sie anhand von Bild 3 den Scan-Code der zu ändernden Taste ermitteln und diesen als Index für die Tabellen verwenden. Soll so zum Beispiel die Taste „3“ ab jetzt das Zeichen „?“ liefern, so muß der fünfte Wert des Feldes in 63 geändert werden.
Viel Spaß mit der eigenen Tastaturbelegung.
MODULE KeyboardChanger;
(* Robert Tolksdorf - 28.5.87 *)
(*$A+*) (* Code optimieren *)
FROM SYSTEM IMPORT CODE, ADR, ADDRESS ;
FROM Strings IMPORT String, Concat ;
FROM XBIOS IMPORT BiosKeys, SetKeyTable ;
FROM GEMAESbase IMPORT AccessoryOpen ;
FROM AESAppllcatlons IMPORT Appllnittalise ;
FROM AESEvents IMPORT EventMessage ;
FROM AESForms IMPORT FormAlert ;
FROM AESMenus IMPORT MenuRegister ;
(*$S-,$P-,$T-*) (* Nur Daten erzeugen *)
PROCEDURE NormalTable;
BEGIN
CODE(0001BH,000ABH,09FACH,0EEBDH,0A6A7H,091B4H,00000H,00809H);
CODE(00086H,08200H,0E789H,0A3A1H,0ECE3H,09600H,00D00H,085E5H);
CODE(0EBEDH,00000H,0C08CH,0A2B1H,0B0BBH,000DFH,098A0H,087B3H);
CODE(0E1A4H,0E600H,000A9H,00000H,00020H,00000H,00000H,00000H);
CODE(00000H,00000H,00000H,00000H,00000H,0F080H,00000H,0F100H);
CODE(00000H,0007FH,00000H,00000H,00000H,00000H,00000H,00000H);
CODE(0AE00H,000F3H,0F2F6H,0BFF4H,0FFF7H,0F5FBH,0FAFCH,0FDFEH):
CODE(0F8F9H,00D00H,00000H,00000H,00080H,00000H,00000H,00000H);
END NormalTable;
(*$S-,$P-,$T-*) (* Nur Daten erzeugen *)
PROCEDURE ShiftTable;
BEGIN
CODE(0001BH,0AD00H,0889CH,0EF9BH,00093H,092B5H,0A800H,00809H);
CODE(0BC8FH,090BEH,0E98AH,0978DH,0EA00H,00000H,00D00H,0B6E4H);
CODE(07FE8H,0E200H,0C18BH,095B8H,0B700H,000B9H,09D83H,080B2H);
CODE(0E0A5H,00000H,000AAH,00000H,00020H,00000H,00000H,00000H);
CODE(00000H,00000H,00000H,00000H,00000H,0F000H,00000H,0F100H);
CODE(00000H,0007FH,00000H,00000H,00000H,00000H,00000H,00000H);
CODE(0AF00H,000F3H,0F2F6H,0BFF4H,0FFF7H,0F5FBH,0FAFCH,0FDFEH);
CODE(0F8F9H,00D00H,00000H,00000H,00000H,00000H,00000H,00000H);
END ShiftTable;
PROCEDURE InstallNewTables;
VAR dummy, normal, shift, alternate : ADDRESS;
BEGIN
normal:=ADDRES5(NormaITable); (* Tabellen-Adressen setzen *)
shift :=ADDRESS(ShiftTable);
alternate:=NIL; (* unbenutzt *)
dummy:=SetKeyTable(normal,shift,alternate); (* installieren*)
END InstallNewTables;
PROCEDURE RestoreOldTables;
BEGIN
BiosKeys; (* normale Belegung *)
END RestoreOldTables;
VAR applID, menuID, choice : INTEGER;
AccText : String;
AlertText : ARRAY [0..200] OF CHAR;
MessageBuffer : ARRAY [0..7] OF CARDINAL;
normal : BOOLEAN;
default : INTEGER;
BEGIN
applID:=ApplInitialise(); (* anmelden *)
AccText:=' Keyboard';
AlertText:='[2][ Keyboard-Changer| ST-Computer | Robert Tolksdorf | |';
Concat(AlertText,'Tastaturbelegung :][Normal |Sonder]', AlertText);
normal:=TRUE;
menuID:=MenuRegister(applID,AccText); (* installieren *)
LOOP (* Endlosschleife *)
EventMessage(ADR(MessageBuffer)); (* Mitteilung erwarten *)
IF MessageBuffer[0]=AccessoryOpen THEN
IF normal THEN default:=2 (* Default für Alert *)
ELSE default:=1 (* feststellen *)
END;
choice:=FormAlert(default.AlertText):
IF choice=1 THEN (* 'normal' gewählt *)
RestoreOldTables;
normal:=TRUE;
ELSE
InstallNewTables; (* 'sonder' gewählt *)
normal:=FALSE;
END;
ELSE
END
END;
END KeyboardChanger.