Neue Tastaturbelegung in Modula-2: Alles im Griff

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.

Bild 1: Per Knopfdruck erfolgt die Umschaltung. Die jeweilige andere Belegung wird vorbelegt.

Auswahl

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 Programm

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.

Bild 2: Eine Empfehlung für die neue Tastenbelegung. Im Listing können Sie natürlich Ihre eigene kreieren.

Eigeninitiative

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.

Bild 3: Die Scancode-Tabelle. Hiermit macht die Umbelegung keine Schwierigkeiten mehr.
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.

Robert Tolksdorf
Aus: ST-Computer 12 / 1987, Seite 87

Links

Copyright-Bestimmungen: siehe Über diese Seite