AT-Keyboard-Interface

Alle erweiterten ZX-Tastaturen haben zumindest zwei Nachteile: die Verbindung über ein (in der Länge begrenztes) Flachkabel und die lästige Tipperei bei langen Befehlsfolgen. Mal schnell RAMTOP anzeigen können. Schön wäre doch ein Interface: hinten ran an den ZX, Tastatur kaufen und fertig. Kurz vor Fertigstellung des Projektes erfuhr ich von Peter Liebert-Adelt, daß die ZX-Fans in den USA auch nicht schlafen. Da wurde fast dasselbe mit TTL-lC's gebaut. Die Schaltung ist sehr interessant, braucht aber eine XT-Tastatur, die nur noch schwer zu bekommen ist. Und vor kurzem habe ich Wilf Rigters Lösung mit einem PIC entdeckt.

Das ZX81-AT-Keyboard-IF arbeitet mit ganz normalen PC-AT-Tastaturen. Die Untersuchung zweier Tastaturen ergab: Innenleben einmal ein 80C49 und ein paar kleine IC's, andermal ein Spezial-IC und sonst fast nix dazu. Nach außen aber stets das gleiche: ein 4-adriges Kabel für Stromversorgung, eine Takt-und eine Datenleitung.

Beim Drücken einer Taste wechseln Takt und Daten von High auf eine Impulsfolge, die stets 12 bit lang ist. Hier liegt auch der Unterschied zur XT-Tastatur: diese schickt nur 8 bit. Die nähere Theorie der Datenübertragung hat mich hier nie so recht interessiert, es ist auch egal ob das nun 11Bit mit einem Stopbit sein sollen. Die seriellen Daten werden nun mit einem Microcontroller eingelesen und dekodiert. Jede normale Taste ist auf einen 12-bit-Code verschlüsselt, manche Sondertasten schicken allerdings auch mehrere Codes zu je 12 bit ab. Beim Loslassen einer Taste sendet das Keyboard aber immer zwei Codes: einen Code für "Taste losgelassen" und danach noch einmal den Code der Taste, wobei zwischen den einzelnen Codes 2ms Pause liegen. Das muß man für die Shift -Taste auswerten: angenommen man drückt Shift und mit gehaltenem Shift mehrere Tasten hintereinander. Da sendet die Tastatur nur zu Anfang einmal "Shift", dann muß man sich das merken bis "Loslassen+Shift" kommt.

Das Interface empfängt nun die seriellen Daten von der Tastatur, wandelt sie in einen 7-bit-Code plus ein Bit für Shift um (mehr als 64 Tasten braucht man ja nicht) und gibt über ein EPROM (IC3), das die ZX-Matrix enthält, die Taste an den Zeddy weiter.

Übersicht der Tastencodes

Dieses Matrix-EPROM ist eine verzwickte Sache, erinnern wir uns dazu an die ZX-Tastaturabfrage (z.B. im "kleinen Hardwarebuch" von A. Deckers beschrieben). Zur Abfrage der ZX-Tastatur wird eine der 8 Adreßleitungen A8 bis A15 auf Low gezogen und der Port $FE gelesen, wobei nur D0 ... D4 ausgewertet werden. Damit läßt sich jede der 40 ZX-Tasten lokalisieren. Die 8 Adreßleitungen können auf 3 Leitungen codiert werden. Der LS240 hat dabei zwei Aufgaben: Busentlastung und Logikumkehr. Ohne den '240 bräuchte man Germaniumdioden und die Belastung der Adreßleitungen wäre auch recht hoch. Ideal wäre ein LS 148 (spart Dioden und den LS240), nur hatte ich den gerade nicht in der Bastelkiste. Am Ende sind es also 3+8 Eingänge denen 5 Ausgänge eindeutig zugeordnet werden müssen.

Wie funktioniert das Ganze nun? Angenommen es wird die Taste Q gedrückt. Der MC gibt da eine "10" aus. Das Q verbindet in der ZX-Tastatur A10 mit D0, der ZX weiß also: wenn er bei A10=low auf dem Port D0=low liest - dann kann nur Q gedrückt sein. Als Ausgabe muß dem ZX also ein $FE (D0=low) geboten werden. Das Matrix-EPROM kann man sich etwa in 8 Blöcke zu je 256 Byte geteilt vorstellen. Jeder Block entspricht dabei einer ZX-Adreßleitung. Bei A10=Low ist der 3.Block -von A8 aus gezählt- güItig. Am EPROM liegt also an: A0...A7="10", A8=A9=High, A10=low. Auf dieser Adresse (778) muß nun ein $FE stehen. Wird Shift gedrückt, ist Bit7 (am MC, A7 am EPROM) = High und damit sind alle Adressen quasi um 128 nach oben versetzt. Damit der ZX auch ein Shift liest muß in den oberen 128 Bytes des A8-Blockes immer das Bit0=Low sein (Adresse 128 bis 255). Eine Taste, die mit A8 abgefragt wird und aber zugleich Shift geben muß, wird codiert indem zwei Bits auf 0 gesetzt werden.

Mit diesem Matrix-EPROM kann nun jede Taste beliebig transformiert werden. Man kann z.B den Code der "Del"-Taste dem ZX als "Shift+0" übermitteln. Oder die Tasten für ,;.:+-*/ usw. Damit kann man diese Tasten direkt (ohne Shift!) nutzen. Jede AT-Tastatur hat einen Nummernblock - auch dessen Tasten können transformiert werden, damit gehen Zahleneingaben viel bequemer.

Für die Umsetzung der 12-Bit-Codes auf die 7 Bit wird eine zweite Tabelle im Steuerprogramm des MC benutzt. Hier läßt sich ein Feature des 8048 geschickt ausnutzen: das Banking. Über die Tasten F11 und F12 lassen sich diese Bänke umschalten und man kann damit ganz einfach das Keyboardlayout verändern. Das Programm ist in allen Bänken gleich, nur die Codetabelle ist verändert. Besonders häufig braucht man eine alternative Belegung der Cursortasten, denn viele Programme werten die Tasten 5, 6, 7, 8 als Cursortasten einmal mit Shift und manchmal auch ohne Shift.

Weil nun zwischen Tastatur und ZX ein intelligentes Wesen arbeitet, kann man auf bestimmte Tasten hin auch mehrere Ausgaben zum ZX machen: der MC braucht nur ein "Tastaturmakro" abzuarbeiten. Ich habe daher auf die Funktionstasten meine häufigsten Bandwürmer gelegt, eben auch dieses nervtötende PRINT PEEK16389+... Die Sache ist im Programm relativ billig gelöst, funktioniert aber. Programmierfans können sich überlegen, ob man so ein Makro nicht auch im RAM des MC speichern kann, also Nutzer-programmierbar.

Als Matrix-EPROM kann auch ein 2732 gesteckt werden. Mit einem Schalter lassen sich damit zwei verschiedene Tastaturlayouts (z.B. Spectrum oder Power3000) wählen, wenn die Möglichkeiten mit F11 und F12 erschöpft sind.

Noch ein paar Sachen für den Nachbau:

Dokumentiertes Listing (scans) 245 kB
Binärfile Programm-EPROM IC2 2 kB
Binärfile Matrix-EPROM IC3 2 kB
Sourcecode 13 kB
Schaltplan 52 kB
Platinenfoto 31 kB


07/01 Kai Fischer