Zusatzhardware über Tastenkombinationen beliebig schalten, Tastaturmacros abspielen, Tastaturlayout umdefinieren und mehr...
Ich möchte hier mein neustes Hardware-Projekt vorstellen: Der keyman64 ist ein universaler Tastatur- und Hardwarecontroller, der zwischen Tastatur und C64 geschaltet wird. Er scannt zunächst nur kontinuierlich die Tastatur und reicht den Zustand der Tasten über einen analogen Crosspoint Switch an den C64 weiter. Der C64 bemerkt so keinen Unterschied zu einer echten Tastatur, während der Mikrokontroller die Möglichkeit gewinnt, die vom C64 als Tastatur gesehene Matrix zu kontrollieren.
Dadurch wird es möglich, bestimmte Tastaturkombinationen nicht an den C64 durchzuschleifen, sondern stattdessen vom Benutzer programmierte Schaltsequenzen auszuführen, die ihrerseits eine oder mehrere der auf der Platine bereitgestellten sechzehn frei verfügbaren Steuerleitungen schalten können.
So kann im C64 verbaute Zusatzhardware über die Tastatur gesteuert werden, z.B.:
- Reset auslösen
- Kernel-Adapter Umschalten, danach Reset auslösen
- SDIEC Taster schalten
- Die LED-Beleuchtung im rauchgrauen Akryllgehäuse steuern
- ... (?)
Die dazu verwendeten Tastenkombinationen bestehen aus einer Meta-Taste und einer weiteren Taste.
Damit die als Meta-Taste definierte Taste weiterhin uneingeschränkt benutzbar bleibt, wird folgendes Schema verwendet: Solange die Meta-Taste gehalten wird, werden alle weiteren betätigten Tasten als Funktionstasten interpretiert, die die benutzerdefinierten Funktionen auslösen. Wird die Meta-Taste allerdings wieder losgelassen, ohne dass überhaupt eine Funktionstaste betätigt wurde, so wird nachträglich ein Drücken der Taste zum C64 hin simuliert.
Wählt man z.B. den Pfeil-nach-links als Meta-Taste, so kann man die Taste also weiterhin einzeln betätigen, um das entprechende Pfeil-nach-links Symbol einzugeben. Der einzige Unterschied zu herkömmlichen Tasten besteht darin, dass das Symbol (im Direktmodus) erst nach Loslassen der Taste erscheint.
Beispiel: Reset und Kernalumschaltung.
Zunächst wird die Resetleitung mit der ersten der sechzehn Steuerleitungen verbunden. Dann schreibt man folgende Konfigurationsdatei auf dem PC:
Befehle, denen keine Tastendefinition vorangestellt sind, werden einmalig beim Einschalten ausgeführt und dienen so der Initialisierung. Hier wird die Pfeil-nach-links-Taste als Meta-Taste definiert und die Resetleitung initial in einen hochohmigen Zustand versetzt (Das ist so, als wäre die Leitung erstmal garnicht verbunden).
Alle folgenden Befehle sind mit der Taste R verknüpft und werden der Reihe nach ausgeführt, sobald Meta-R gedrückt wird. Mit clear wird die Resetleitung auf low gezogen, dann wird 10 Millisekunden gewartet und die Leitung wieder in den hochohmigen Zustand versetzt. Das ist im Prinzip genau dasselbe, was ein herkömmlicher Reset-Taster macht.
Um diese Konfiguration zum Keyman64 zu übertragen konvertiert man sie zunächst mit dem mitgelieferten Kommandozeilentool in ein schlankes binäres Format:
Der Keyman64 verfügt über einen USB-Anschluss und einen USB-Bootloader, sodass man ihn einfach mit dem PC verbinden kann und die binäre Konfiguration mit avrdude (oder jedem anderen geeigneten tool) in das Eprom des Mikrokontrollers übertragen kann:
Nach dem Flashen kann also durch Drücken von Meta-R ein Reset ausgelöst werden.
Jetzt baut man z.B. einen Zweifach-Kernal-Adapter ein. Die oberste Adressleitung des Eproms wird üblicherweise über einen Schalter zwischen high und low umgeschaltet, um den einen oder den anderen Kernal einzublenden. Man verbindet die Adressleitung stattdessen mit der zweiten Steuerleitung und ändert die Konfiguration wie folgt:
Nach dem erneuten flashen kann Meta-K gedrückt werden, um den Kernel umzuschalten (die Leitung zu invertieren) und danach einen Reset auszuführen. Der Befehl "exec R" führt die für die Taste R definierte Sequenz aus.
Tasten gedrückt halten
Falls der Kernal beim Einschalten die Möglichkeit bietet, eine bestimmte Taste gedrückt zu halten, um beispielsweise den Speichertest zu überspringen, kann man das mit den Befehlen down und up zusätzlich automatisieren. Man ändert die Sequenz K dazu wie folgt:
Einzelne Tasten drücken
Falls nach dem Reset ein Modul-Menü erscheint, in dem verschiedene Optionen über das Drücken der F-Taten ausgewählt werden, könnte man auch nach dem Reset etwas warten und
verwenden. Synonym dazu kann auch der Befehl "press" verwendet werden:
Macros
Sollen dagegen mehrere Tasten nacheinander betätigt werden, kann der Befehl "type" verwendet werden, z.B.:
Die Tilde (~) steht hier für RETURN. Damit hat man zwei praktische Macros auf die Tasten Meta-L und Meta-I gelegt.
Tastaturlayout ändern
Eine weitere Möglichkeit ist das Umdefinieren der Tastatur, indem zwei Tasten miteinander vertauscht werden können:
Dadurch ändert sich das Tastaturlayout vom üblichen QWERTY auf QWERTZ. Verknüpft man diesen Befehl mit einer Tastenkombination kann man nach Bedarf zwischen beiden Layouts hin- und herschalten:
Die Tasten werden allerdings nur in Richtung des C64 getauscht, die definierte Funktionstaste bleibt konstant, d.h. der Befehl stets über Meta-Z aufgerufen.
Weitere Befehle
Die sechzehn Steuerleitungen sind in zwei 8bit ports (a und b) organisiert. Neben den Befehlen set, clear, invert und tristate gibt es noch die Befehle increase und decrease, die einen bestimmten Bereich des jeweiligen Ports hoch- bzw runterzählen, z.B:
An die entsprechenden Leitungen könnten also z.B. die beiden höchsten Adressleitungen eines vierfach-Charset-Adapters angeschlossen werden, sodass wir mit Meta-i nacheinander durch die installierten Zeichensätze schalten könnten.
Serielle Schnittstelle
Der Keyman64 verfügt zusätzlich über eine einfache serielle Schnittstelle, über die die vorhandene Funktionalität von außen verwendet werden kann.
Es können die definierten Befehlssequenzen ausgeführt werden oder die Tastaturmatrix kontrolliert werden. Dazu stehen die Befehle exec, up, down und press über ein einfaches serielles Protokoll zur Verfügung.
Die beiden dafür verwendeten Leitungen können beispielsweise mit dem Prozessorport des C64 verbunden werden (Cassete Sense als /STROBE und Cassette Data als DATA). Somit wird es möglich, aus einem C64 Programm heraus die definierten Befehlssequenzen auszuführen und damit die Zusatzhardware auch softwareseitig zu steuern.
Eine andere denkbare Anwendung wäre der Anschluss weiterer Eingabegeräte, deren Ausgabe über die Schnittstelle in Tastaturereignisse übersetzt wird.
Hardware, Verfügbarkeit / Aktueller Status des Projekts
Realisiert wird das Ganze über einen Atmega1284P Mikrokontroller, einen 74HC22106 oder MT8808 Crosspoint-Switch sowie einige zusätzliche 74er ICs.
Der Schaltplan, das bisherige Platinenlayout sowie alle Quellcodes sind bereits unter einer offenen Lizenz auf github veröffentlicht.
Der auf dem Bild gezeigte Prototyp ist bei mir im Einsatz und funktioniert in der oben beschriebenen Weise. Dort ist noch ein Bugfix am 4520 zu sehen (Drahtbrücken), der in der aktuellen Version bereits behoben ist. Es wurden mittlerweile auch die Kupferfächen im Bereich der Tastaturanschlüsse entfernt.
Alternativ zum 22106 kann auch ein MT8808 verwendet werden, der u.U. einfacher zu beschaffen ist (gibt es z.B. bei mouser). Der MT8808 ist pinkompatibel, möchte aber active-high Signale für STROBE und RESET haben. Daher muss der Firmware über die Konfiguration mitgeteilt werden, dass ein MT8808 verwendet wird:
Ich wäre bei vorhandenem Interesse bereit, eine Sammelbestellung für die Platinen, die Crosspoint-Switches und die Atmegas zu organisieren. Die Atmegas würde ich auch mit dem USB-Bootloader, der Firmware und einer initialen Konfiguration programmieren, sodass weitere Updates der Firmware sowie das Übertragen der Konfiguration bereits bequem über USB möglich wären.
Die Software für das Generieren der Konfiguaration läuft problemlos unter Linux und Windows und MacOSX.
Die Hardware ist übrigens nicht C64-spezifisch, sondern sollte mit jedem Gerät nutzbar sein, das eine 8x8 Matrix-Tastatur verwendet. Allerdings orientiert sich die Anordnung der Anschlüsse am Tastaturstecker des C64. Softwareseitig sind die Tastennamen sowie die Tastenkombinationen, die beispielsweise beim programmatischen Eingeben eines Anführungszeichens betätigt werden müssen (shift + 2), vorerst noch C64-spezifisch kodiert.
Hier die Website zum Projekt: http://www.henning-bekel.de/keyman64
Und das entsprechende github repository: https://github.com/hbekel/keyman64
Gruß,
Henning