Im Herzen des JOYCE

Teil 5: Unter der Hand - die Tastatur

Will der Anwender mit einem Programm kommunizieren, so zählt die Tastatur immer noch zu den am häufigsten benutzten Eingabegeräten. Auch wenn in größeren Systemen die Maus oder das Grafik-Tablett immer mehr an Bedeutung gewinnen, läßt sich das tastenbesetzte Eingabemedium nicht so einfach ersetzen. Für den JOYCE wird sich daran auch in der Zukunft nicht viel ändern. Darum ist, wer seine Tastatur richtig einsetzen kann, den anderen immer einige Schritte voraus.

Die Umsetzung beziehungsweise Übersetzung der Tastatureingaben wird für gewöhnlich durch das BIOS erledigt, so daß sich ein Programm nicht darum zu kümmern braucht. Trotzdem ist es manchmal nützlich, wenn man weiß, wie bestimmte Funktionen ausgeführt werden, beziehungsweise wie man spezielle Anwendungen selbst programmieren kann. Um Ihnen dabei zu helfen, werden wir uns in diesem Beitrag etwas näher mit dem Keyboard Manager (KM) befassen, jenem Programm-Modul, das im BIOS die Zeicheneingabe steuert und überwacht. Die Hauptaufgaben des Keyboard Managers lassen sich folgendermaßen definieren:
- Bereitstellung und Unterstützung der Zeichenübergabe an das BIOS
Die hierfür implementierten Routinen geben ein angefordertes Zeichen, sofern vorhanden, über den Accumulator ans BIOS zurück.
- Verwaltung und Bearbeitung der Expansions-Strings
Expansions-Strings sind Zeichenketten, die jeweils einem bestimmten ASCII-Code von $80 - $9E zugeordnet sind. Wird nun bei der Übersetzung einer Tastatureingabe ein solches Zeichen gefunden, so wird der entsprechende String aktiviert, Zeichen für Zeichen ausgelesen und ans BIOS übergeben, so als würden die entsprechenden Tasten gedrückt. Diese Zeichenketten werden im sogenannten "Expansion String Buffer" ($2876 - $290C) aufbewahrt und können vom Anwenderprogramm ausgelesen oder auch geändert werden. Die vom BIOS vorgegebenen "Expansions" dienen hauptsächlich der Eingabe von Steuerzeichen, hier lassen sich allerdings auch Programmaufrufe, Kommandoeingaben und so weiter definieren und abspeichern. Sollte der Default-Puffer zu klein werden, so besteht mit der Routine KM EXP BUFFER INIT die Möglichkeit, einen "eigenen", beliebig großen Expansions-Puffer einzurichten.
- Übersetzung und Speicherung der von der Tastatur empfangenen Zeichen
Bevor ein Zeichen ans BIOS übergeben wird, muß es, sofern es nicht aus einem Expansions-String stammt, entsprechend der Tastennummer und der eventuell gedrückten Sondertasten (<SHIFT/ALT/EXTRA>) in ein ASCII-Zeichen übersetzt werden. Diese Übersetzung geschieht mit Hilfe von Tabellen, in denen die den Tasten zugeordneten ASCII-Codes gespeichert sind. Für jede Sondertaste gibt es separate Übersetzungstabellen.
Übersetzungstabelle für:Adresse:
keine Sondertaste ('NORMAL')$1780
SHIFT-Taste oder <SHIFT LOCK>$17D1
ALT-Taste$1822
SHIFT- +ALT-Tasten$1873
EXTRA-Taste$18C4
Die Startadressen der Tabellen für die Übersetzung der Tasten-Codes beim JOYCE
Exp.-Code:Funktion:Taste:
$80^C[STOP]
$81^Z[f1]
$82^Z[f2] ([SHIFT]+[f1])
$83^Q[f3]
$84^Q[f4] ([SHIFT]+[f3])
$85^S[f5]
$86^S[f6] ([SHIFT)+[f5])
$87^P[f7]
$88^P[f8] ([SHIFT]+[f7])
$89^G[DEL→]
$8ADEL[←DEL]
$8B^H[CAN]
$8C^U[AUSBL]
$8D^W[EINBL]
$8E^][SUCHE]
$8F^F^B^B[EZ]
$90^F^B[ZEILE]
$91^_[↑]
$92^V[+]
$93^A[←]
$94^F[→] oder [ZCHN]
$95^R[FORM]
$96^^[↓]
$97^K[ALT]+[DEL→]
$98[-]
$99^E[ALT]+[↓]
$9A^X[ALT]+[←DEL]
$9Bnicht belegt 
$9Cnicht belegt 
$9Dnicht belegt 
$9Enicht belegt 
Das Zeichen $9F wird als Füllzeichen benutzt und nicht beachtet.
Die "Default-Expansions" des JOYCE

Direkt zugreifen

Nun aber zu den schon erwähnten Programm-Routinen.
Da sind zunächst einmal die allgemeinen Funktionen für die Zeicheneingabe, die vom BIOS aufgerufen werden, wenn ein Zeichen von der Tastatur gelesen werden soll:
KM WAIT CHAR $1142
liest ein Zeichen von der Tastatur oder aus einem Expansions-String beziehungsweise wartet, bis ein solches Zeichen vorliegt.
KM FLUSH $1148
leert den Tastaturpuffer und beendet die Bearbeitung eines gerade aktiven Expansions-Codes.
KM READ CHAR $114E
liest ein Zeichen aus dem Tastaturpuffer, von der Tastatur oder aus einem Expansions-String, sofern ein Zeichen vorhanden ist.
KM GET STATUS $115C
prüft, ob ein Zeichen (Tastatur oder Expansions-String) vorhanden ist.
Für das direkte Auslesen von Tastaturpuffer und Expansions-String können folgende Funktionen aufgerufen werden:
KM READ KEY $119C
holt ein Zeichen aus dem Tastaturpuffer beziehungsweise von der Tastatur. Ist ein gültiges Zeichen vorhanden, wird es übersetzt und übergeben.
KM GET EXPAND $1270
liest ein Zeichen aus einem Expansions-String. Der Expansions-String-Zähler bestimmt die Position des Zeichens innerhalb des Strings.
Die folgende Routine eignet sich sowohl für die Einrichtung eines neuen Expansions-Puffers als auch zur Initialisierung des Default-Puffers:
KM EXP BUFFER INIT $11A6
Für den Aufruf müssen Startadresse (Default=$2876) und Pufferlänge (Default=$97) übergeben werden. Der Keyboard Manager richtet dann den Expansions-Puffer ein, setzt die benötigten Zeigervariablen und überträgt die Default-Expansions in den neuen Puffer. Damit steht der Anlage eines eigenen "Makro"-Puffers nichts mehr im Wege. Bleibt noch anzumerken, daß ein neuer Puffer in der sogenannten COMMON-Memory ($C000-$FFFF) liegen muß, damit er vom Keyboard Manager erreicht werden kann.
Für den Eintrag neuer Expansions-Strings kann dann die Funktion
KM SET EXPAND $1204
aufgerufen werden, die eine über das HL-Register adressierte Zeichenkette in den Expansions-Puffer einträgt, sofern genügend Platz vorhanden ist. Dieser neue Expansions-String muß ebenfalls über die COMMON-Memory übergeben werden, damit er für den Keyboard Manager verfügbar ist.

An der Basis: Tasten-Codes

Wer sich mit den normalen Eingabe-Routinen nicht zufriedengibt, dem gestattet der Keyboard Manager auch den Zugriff auf die Routinen zur Bearbeitung der Tasten-Codes, von Fachleuten als "Key-Token" (KT) bezeichnet. Solche Tasten-Codes bestehen immer aus zwei Bytes, der Tastennummer und dem Tastenstatus, der den Zustand der Sondertasten <SHIFT>, <EXTRA> und <ALT> beschreibt.
Die Erstellung dieser Tasten-Codes ist eine recht komplizierte Sache, darum sei sie hier nur "im groben" erläutert.
Wird auf der Tastatur eine Taste betätigt, so übergibt der Keyboard-Controller diese Information in Form von Koordinaten an das Gate-Array des JOYCE. Das Gate-Array überträgt die Koordinaten dann in den Speicher, in die sogenannte Key Response Table (KRT). Die KRT liegt, da sie von der "Hardware" angesprochen wird, immer an der gleichen Adresse ($BFF0-$BFFF) in der Speicherbank #0.
Der Keyboard Manager überprüft nun in regelmäßigen Abständen über eine Interrupt-Routine die KRT, ob eine Taste gedrückt wurde, und errechnet dann aus den Einträgen der KRT die Key-Token. Die so ermittelten Tasten-Codes werden nun auf Sonderfunktionen geprüft, das bedeutet, es wird geprüft, ob ein Urladen (Cold Boot) durchgeführt, ob das Drucker-Menü aufgerufen oder eine Hardcopy gedruckt werden soll.
Da der Aufruf der Interrupt-Routine automatisch vom System-Ticker erfolgt, sind Details an dieser Stelle nicht ganz so wichtig.
Wichtig ist jedoch, daß am Ende dieser Routine die gültigen Tasten-Codes in den Tastaturpuffer eingetragen werden und dann für den Anwender zur Verfügung stehen. Dieser Puffer kann insgesammt 20 Key-Token aufnehmen und ist als Ringpuffer mit FIFO-Struktur organisiert. Entsprechende Schreib-/Lesezeiger sorgen für eine ordnungsgemäße Speicherung der Tasten-Codes.
Für die Aufrufe, bei denen die Key-Token benötigt werden, enthält das C-Register die Tastennummer und das B-Register den Tastenstatus in der folgenden Bit-Konfiguration:

bit 0:nicht definiert
bit 1:EXTRA
bit 2:CAPS LOCK (= ALT+ENTER)
bit 3:REPEAT
bit 4:NUM LOCK (= ALT+FORM)
bit 5:SHIFT
bit 6:SHIFT LOCK aktiv
bit 7:ALT

Zur Manipulation des Tastaturpuffers und der Tasten-Codes eignen sich besonders die Routinen:
KM KT GET $133B
liest ein Key-Token aus dem Tastaturpuffer. Falls notwendig, wird der CAPS-LOCK- beziehungsweise NUM-LOCK-Status geändert und auf den neuesten Stand gebracht.
KM KT READBUFFER $137F
liest ein Key-Token aus dem Tastaturpuffer, ohne eventuelle Änderung der Status-Bytes, was bedeutet, daß das Token so übergeben wird, wie es aus der KRT errechnet wurde.
KM KT PUT $1363
schreibt ein Key-Token in den Tastaturpuffer, wobei es "an die Spitze" der dort eventuell schon vorhandenen Token gesetzt wird. Bei der nächsten Abfrage wird dieses Token dann direkt wieder zurückgegeben.
KM KT WRITE BUFFER $13B6
schreibt ein Key-Token in den Tastaturpuffer und setzt es ans Ende der eventuell schon vorhandenen Token.
KM KT TEST BUFFER $13D1
überprüft, ob Key-Token im Tastaturpuffer vorhanden sind.
KM KT TRANSLATE $1298
übersetzt das im BC-Register übergebene Token in ein entsprechendes Zeichen aus der Übersetzungstabelle.
Wie schon erwähnt, errechnet die Interrupt-Routine nicht nur die Key-Token, sondern überprüft sie auch auf eventuelle Sonderfunktionen, zum Beispiel Aufruf des Drucker-Menü über die PTR-Taste oder der Hardcopy-Routine.
KM PTR MODE $146F
ruft das Drucker-Menü auf.
KM PTR COPY $1472
ruft die Hardcopy-Routine auf.
Damit können Sie diese Routinen zukünftig per Software aus Ihren eigenen Programmen heraus aufrufen.
Zwei weitere Routinen, die die Arbeit des Keyboard Managers direkt beeinflussen, bedürfen noch der Erläuterung:
KM SET SPEED $14B4
verändert die Verzögerungswerte für Tastaturabfrage und Repeat-Funktion. Die Abfrageverzögerung definiert die Zeit, in der ein gültiges Token vom Keyboard Manager ermittelt und in den Tastaturpuffer eingetragen wird. Die Repeat-Verzögerung definiert die Geschwindigkeit, mit der Zeichen von der Tastatur wiederholt werden können.
KM SET KEY $14B8
ändert die Übersetzungstabelle für ein bestimmtes Zeichen. Die zu ändernde Übersetzungstabelle wird durch eine Bitmaske im D-Register definiert.
Damit können wir das Thema "Keyboard Manager" zunächst abschließen.
Die System-Routinen des Keyboard-Managers

Hinweis

Da sämtliche hier erläuterten Routinen in der System-Speicherbank liegen, muß vor dem Aufruf die Speicherbank umgeschaltet werden. Dazu läßt sich die BIOS-Funktion #30 (USERF) verwenden, die mit
CALL 0FC5AH
DEFW routine

aufgerufen werden kann. "routine" bezeichnet dabei die Adresse der gewünschten System-Routine in der Speicherbank #0.

(Norbert Finke/rs)

Die Programme zu diesem Teil:
[Part 4] [Overview] [Part 6]

Scanned by Werner Cirsovius
March 2003
© DMV Verlag