JOYCE Tastatur

Beim Betätigen einer Taste schickt der Tastatur-Controller die Nummer der betätigten Taste sowie ihren Status zur CPU. Hier werden nun diese beiden Informationen als Index in eine Zeichentabelle verwendet und der entsprechende ASCII-Wert ermittelt. Mit dem Dienstprogramm SETKEYS ist es möglich, die Tastenkombination umzudefinieren. Der andere Weg, nämlich die aktuelle Belegung der Tasten auszulesen, ist mit einfachen Mitteln nicht zu erreichen. Die Zeichentabelle liegt nämlich bei den verschieden BIOS-Versionen auf unterschiedlichen Adressen.
Ich habe dazu zwei Assemblerprogramme geschrieben, die die Zeichentabellen auslesen:
  1. Auslesen der Tastatur
  2. Speichern der Tastaturbelegung
Eine weitere Möglichkeit ist, zunächst die Tastatur mittels XBIOS-Aufruf auszulesen und Kontrolltasten zu filtern. Wird keine Kontrolltaste gefunden, dann werden Tastennummer und Tastenstatus zurückgeschrieben und nun der Wert mit einer BDOS-Aufruf ausgelesen. Eine Routine könnte wie folgt aussehen:

;
; Routine liest ein Zeichen von der Tastatur
;
; Carry ist gesetzt bei vorhandener Eingabe
; Im Akku steht das Zeichen
;
	call	XBIOS		; Taste auslesen
	dw	00dah
	ret	nc		; Keine Taste betaetigt
;
; Hier wird die Tastennummer in Register C ausgewertet.
; (Z.B. die Pfeiltasten, Nr. 6, 14, 15 und 79)
;
; Wird eine der gesuchten Tasten gefunden, so muessen ein Wert
; im Akku zurueckgegeben werden und Carry gesetzt sein
;
	....
;
; Hier geht es weiter, wenn kein Kontrolltaste gefunden wurde
;
	call	XBIOS		; Numer und Status aus Register B und C zurueckschreiben
	dw	00ddh
	ld	c,6
	ld	e,-1
	call	BDOS		; Zeichen lesen
	or	a
	ret	z		; Kein Zeichen gelesen
	scf
	ret

Die Tastatur hat folgendes Aussehen:

Die komplette Zuordnung der Tasten zu den Tastennummern findet sich hier.
Die Kontrolltasten sind wie folgt definiert:

Taste ohne Wert ???Keine Bedeutung in CP/M 3
Nr.TasteHex-WertBedeutung in CP/M 3 Nr.TasteHex-WertBedeutung in CP/M 3
0f4 f30x11Bildschirm weiter 150x01Cursor links
1FORM0x12Zeichen links vom Cursor in neue Zeile 16DEL>0x07Zeichen rechts löschen
2f2 f10x1ADateiende 18RETURN0x0DZeilenende
3EINBL0x17Vorige Zeile abrufen 20ERS SUCHE0x1D???
4EINH PARA 23[+]0x16???
5WORT ZCHN0x06Cursor rechts 66STOP0x03Warmstart
60x06Cursor rechts 68TAB0x09Tabulator
7 72<DEL0x7FZeichen links löschen
8EXIT(0x1B)ESCape 73f6 f50x13Bildschirm anhalten
10AUSBL0x14Schreibt Zeichen links vom Cursor in den Puffer 75CAN0x08Abbruch
11COPY0x17Ruft die vorige Zeile ab 76[-]0x1C???
12DOK SEITE 77f8 f70x10Drucker ein oder aus
13ZEILE EZ0x06 0x02Cursor an Anfang der Zeile 78ENTER0x0DZeilenende
140x1FCursor nach oben 790x1ECursor nach unten