Wer seinen Atari im Einfinger-Adler-Suchsystem bedient und außerdem mit der Standardbelegung der Tastatur zufrieden ist, kann diesen Artikel getrost überschlagen.
Wer allerdings seinen Atari als Textsystem benutzt und sich wie ich schon des öfteren über die Lage der <- bzw. >-Taste geärgert hat, dem seien die folgenden Ausführungen wärmstens ans Herz gelegt.
Leider haben die Konstrukteure der Atari-Tastatur (das gilt auch für den neuen Mega Atari) nicht nachgedacht, als sie das Layout der deutschen Tastatur festlegten. Damit ziehen sie zwar gleich mit ihren Kollegen, den Entwicklern des Industriestandards, aber was kann sich der Anwender dafür kaufen? Alle, die auf ihrem Atari mehr oder weniger professionelle Textverarbeitung betreiben, werden es sicher schon festgestellt haben: Die bzw. ‘>’-Taste sitzt so bescheuert neben der linken Shift-Taste, daß die Texte am <ende meistens <sO ausehen !!
Vielleicht haben es einige auch geschafft, durch langwieriges Trainieren ihren kleinen Finger so zu verformen, daß sie das Problem nicht mehr haben; aber was machen die Ärmsten, wenn sie gezwungen werden, sich einer normalen Schreimaschinentastatur zu nähern ?
Gerade beim neuen Mega Atari, der gar-nicht typisch für PCs eine wirklich angenehme und qualitativ gute Tastatur hat, läßt obiger Umstand äußerste Traurigkeit aufkommen.
Kurz gesagt: Ich habe mich entschlossen, mit folgendem Programm der Sache ein Ende zu machen.
Zuerst hatte ich die Idee, aus der KG-Taste (diese Abkürzung stehe ab jetzt für die bewußte, störende Taste) eine dritte Shift-Taste zu machen. Allerdings ist mir das nicht gelungen. Für entsprechende Hinweise wäre ich sehr dankbar.
Als Alternative bot sich an, die KG-Taste völlig lahmzulegen und die entsprechenden Zeichen, ohne die der Programmierer natürlich auch nicht leben kann, woanders hinzulegen.
Dieser Weg zeigte sich als gangbar und wurde in vorliegendem (trivialen) Progrämmchen verwirklicht.
Effekt:
Die KG-Taste ist nach Aufruf des Programms völlig tot und sollte irgendwie mechanisch mit der linken Shift-Taste gekoppe 1t werden (Wer hat eine gute Idee ?, Holzkeil schnitzen, Plastillin,...).
Nach einem zweiten Aufruf des Programms werden die alten Zustände wieder hergestellt.
Auf der Suche nach der Tastaturtabelle stieß ich auf die Funktion 16 des XBIOS, umgangssprachlich auch als Keytbl() bekannt. Dabei stellte sich heraus, daß der Atari nicht eine Tastaturtabelle, sondern deren drei hat. Jede ist genau 128 Byte lang und wird über den sogenannten Seancode derTasten (s. Bild 1) adressiert. Der Scancode ist eine Art Nummerierung aller Tasten.
Beispiel:
Sie wollen, daß die KG-Taste nur noch Null liefert. Also schauen Sie in der Tabelle (Bild 1) nach und sehen, daß die KG-Taste den Scancode 60 Hex hat. Deshalb müssen Sie in Position 60 Hex der shift- und unshift-Tabelle eine 0 eintragen.
Die erste Tabelle enthält die normale Belegung, die zweite die Belegung mit gedrückter shift-Taste und die dritte die bei aktiver CapsLock-Taste.
Mit der Funktion Keytbl(u,s,c) ist es nun möglich die Tabellen durch eigene zu ersetzen. Dazu ist der Funktion ein Zeiger auf die neue Tabelle zu übergeben. Wird als Parameter-IL übergeben, bleibt die jeweilige Tabelle unverändert.
Wenn man nun auch noch weiß, daß Keytbl() auch einen Wert zurückgibt - und zwar einen Zeiger auf drei weitere Zeiger, die, wen wundert’s, auf die gerade gültigen Tastaturtabellen zeigen, dann ist der Rest ein Kinderspiel.
Zuerst besorgt man sich die alten Tabellen, indem man Keytbl() mit dreimal -1L als Parameter aufruft. Da sich die Originaltabellen im ROM befinden, muß man diejenigen, die man gern verändern möchte, ins RAM kopieren, dann abändem und dem Betriebssystem mit einem weiteren Aufruf von Keytbl() die neue Lage nahebringen.
Damit auch keiner an den neuen Tabellen fummelt, muß man das Programm mit Ptermres(n,e) terminieren, so daß es resident im Speicher bleibt. Wie man die Länge des Programms feststellt, hängt vom jeweiligen Compiler und der Programmiersprache ab. Für Megamax C können Sie eine mögliche Lösung im Listing bewundern. Bemerkenswert dabei ist, daß Megamax C der ersten globalen Variable die höchste Adresse zuordnet.
Die Problemlösung sollte sich auf alle Programmiersprachen übertragen lassen, die TOS-Aufrufe erlauben. Vielleicht hat jemand Lust, eine Version in Assembler zu machen und als Public Domain zur Verfügung zu stellen?
/*
* KEY.C
*
* Legt die Kleiner/Groesser-Taste lahm. Dies Taste hat nachher keine
* Funktion mehr. Durch eine geeignete mechanische Verbindung koennen
* nun die linke Shift-Taste und die Kleine/Groesser Taste verbunden
* werden. Das erleichert das Schreiben im Zehnfingersystem ungemein.
* Ersatz: < auf Ziffernblock-( und > auf Ziffernblock-).
*
* Autor: Th. Weinstein
* Datum: 09.09.87
* erstellt mit Megamax C */
#include <osbind.h>
/*
* Wird vom Xbios(16) Aufruf (Keytbl(a,b,c)) geliefert.
*/
typedef struct {
char *unshift; /* Zeiger auf Tastaturtabelle ungeshifted */
char *shift; /* Zeiger auf Tastaturtabelle geshifted */
char *capslock; /* Zeiger auf Tastaturtabelle: CapsLock */
} *KEYTBLS;
extern long _base; /* Beginn der Base Page */
long plen; /* Zur Berechnung der Programmlaenge */
int end_of__program; /* Platz nur bis zu der Adresse dieser */
/* Variablen resident halten */
char unshift[128]; /* Platz fuer neue Tabelle ungeshifted */
char shift[128]; /* Platz fuer neue Tabelle geshifted */
/*
* Hauptprogramm */
main()
{
KEYTBLS keytbls; /* Zeiger auf urspruengliche: Tabellen */
/*
* Zuerst urspruengliche Belegung der Tastatur holen
* Alle drei Parameter gleich -1L liefert alte Belegung
* und aendert sonst nichts.
*/
keytbls - (KEYTBLS) Keytbl(-1L,-1L,-1L);
/*
* Feststellen ob die Tabellen schon manipuliert wurden
* (d.h. nicht mehr im ROM stehen)
*/
if ((long) keytbls->unshift < OxFCOOOOL)
{
Bioskeys(); /* alte Belegung wieder herstellen */
goto ENDE;
}
else
{
/*
* Tabellen für unshift und shift ins RAM kopieren
*/
copy(keytbls->unshift,unshift,128);
copy(keytbls->shift,shift,128);
/*
* < und > - Taste lahmlegen
*/
unshift[0x60] = shift[0x60] = (char) 0;
shift[0x63] = 0x3c;
/* < auf Ziffernblock-( legen */
shift[0x64] = 0x3e;
/* > auf Ziffernblock-) legen */
/*
* Neue Tabellen dem System bekannt machen
*/
Keytbl(unshift,shift,-1L);
/*
* Programmlaenge berechnen */
plen = ((long) &end_of_program - _base+ 1) - 2;
/*
* Terminieren aber Speicher nicht freigeben
*/
Ptermres(plen,0);
}
ENDE: ;
}
/*
* 'count' Bytes von 'from' nach 'to' kopieren. Keine Ueberpruefung auf
* Ueberlappung der Bereiche.
*/
copy (from,to,count)
char *from, *to;
int count;
{
while (count—)
*to++ = *from++;
}
/*
* ENDE von KEY.C
*/