Keyman64: Tastatur- und Hardwarecontroller

  • Keyman64: Tastatur- und Hardwarecontroller

    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:

    Quellcode

    1. meta arrowleft
    2. tristate port a bit 0
    3. R: clear port a bit 0
    4. R: sleep 10ms
    5. R: tristate port a bit 0


    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:

    Quellcode

    1. $ keyman64 example.conf example.bin


    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:

    Quellcode

    1. $ avrdude -p m1284p -c usbasp -U eeprom:w:example.bin:r


    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:

    Quellcode

    1. meta arrowleft
    2. tristate port a bit 0
    3. clear port a bit 1
    4. R: clear port a bit 0
    5. R: sleep 10
    6. R: tristate port a bit 0
    7. K: invert port a bit 1
    8. K: exec R


    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:

    Quellcode

    1. K: invert port a bit 1 # Kernal wechseln
    2. K: down COMMODORE # Commodore-Taste gedrückt halten
    3. K: exec R # Reset ausführen
    4. K: sleep 500 # eine halbe Sekunde warten
    5. K: up COMMODORE # Commodore-Taste loslassen



    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

    Quellcode

    1. K: down F5
    2. K: sleep 20
    3. K: up F5


    verwenden. Synonym dazu kann auch der Befehl "press" verwendet werden:

    Quellcode

    1. K: press F5



    Macros


    Sollen dagegen mehrere Tasten nacheinander betätigt werden, kann der Befehl "type" verwendet werden, z.B.:

    Quellcode

    1. L: type load"$",8~
    2. I: type list~


    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:

    Quellcode

    1. swap Y Z


    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:

    Quellcode

    1. Z: swap Y Z


    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:

    Quellcode

    1. clear port a bits 4-5
    2. I: increase port a bits 4-5


    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:

    Quellcode

    1. using MT8808


    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: henning-bekel.de/keyman64
    Und das entsprechende github repository: github.com/hbekel/keyman64

    Gruß,
    Henning
  • Weil kein Bedanken-Buttom (sollte Henning vielleicht "nachrüsten") vorhanden ist
    :ilikeit: :dafuer:

    Leider sind die IC CD74HC22106E oder MT8808 für den Privatanwender sehr schwer beschaffbar bzw. sehr teuer . Habe das vor Jahren schon mal versucht und bin gescheitert.
    Jetzt ist die Situation schon etwas besser, nur stimmt der Preis für mich immer noch nicht ( als Einzelbestellung)
    MT8808 EBäh bzw. CD74HC22106E auch EBäh

    Für den Privatanwender ist die Bestellung bei Mouser von einem IC mit einem Stück auch nicht gerade attraktiv. Mouser 9,47€ + Versand;
    wobei mir bei Mouser noch nicht klar ist, ob es die DIL 28 oder die 28 PIN PLCC - Version ist. Hier hilft dann nur Sammelbestellung.
    Staffelpreise:
    1: 9,47 €
    10: 8,51 €
    25: 7,76 €
    100: 7,01 €
  • Gefällt mir gut! Da ich mich gerade mit automatisiertem Testen auf dem C64 beschäftige, fallen mir gleich noch ein paar mögliche Anwendungsfälle (vielleicht für zukünftige Versionen) ein: Wenn die serielle Schnittstelle neben dem Empfang von Key-Events auch in die andere Richtung übertragen würde was auf dem C64 passiert, könnte man die Events auf dem PC aufzeichnen und mit dem selben Timing wiedergeben (zumindest fast dem selben Timing, da es natürlich nicht so leicht mit dem C64 Takt synchronisiert werden kann). Würde man das ganze noch mit einem In-/Output der Joystickports erweitern, könnte man wie in Vice eine History z.B. für einen Spiel-Walkthrough aufzeichnen und wieder abspielen.

    Läuft der Microcontroller denn mit dem C64 Takt, oder unabhängig? Evtl. könnte der Controller auch selber Events z.B. auf Flash oder ähnlichem aufzeichnen? Dann könnte das ganze sogar taktgenau wiedergegeben werden...
    ────────────────────────────────────────────────────────────
    Time of Silence - Time of Silence 2 Development Blog
    ────────────────────────────────────────────────────────────
  • Hmm den MT8812 hab ich kürzlich für 1,30$ / Stück in China geordert. Aber der hat leider ein abweichendes Pinout. Außerdem weiß ich noch nicht, ob die was taugen. Selbst bei kleinem Preis ist man nicht vor Fälschungen sicher...
    In a moment all went screaming wild until the darkness killed the light..
  • Den MT8808 habe ich in PLCC28 auch schon für knapp 5€ auf Ebay bekommen (aus Polen). Da braucht es natürlich noch einen Adapter auf DIP28, was dann den Preisvorteil wieder zunichte macht.

    Generell gehe ich jetzt mal davon aus, dass dieser Chip einfach nicht für ein paar cents zu haben ist. Bei Mouser ist er wenigstens verfügbar (aktuell 167 Stk, außerdem als "New at Mouser" gekennzeichnet).

    Aus diesem Grund kann ich auch noch keine konkreten Angaben zum Preis machen. Die außer dem Crosspoint Switch benötigten Teile belaufen sich (inklusive Atmega für 6,35€) bei Reichelt momentan auf 12,32€ (siehe Warenkorb). Hinzu kommt noch die Platine (6x8cm). Der konkrete Preis ist abhängig von der Anzahl der Interessenten.

    Falls also Interesse besteht, bitte ich euch, dies hier konkret (mit Anzahl der gewünschten Exemplare) und verlässlich kundzutun, da ich für die Sammelbestellung auch nicht in Vorkasse gehen kann. Ich habe übrigens auch keinerlei Gewinnabsicht dabei.
  • @Claus: Die Idee des automatisierten Testens habe ich zusammen mit Mac of Tugs auch schon ins Auge gefasst, da gibt es schon einige Ideen, an denen ich im Moment noch forsche. Am Ende soll es möglich sein, Testcases mit Erfolgsbedingungen formulieren zu können, um das automatisierte Testen von deterministischen, (erstmal nur textbasierten) Spielen wie Adventures zu ermöglichen. Dabei soll auch von zuvor gemachten "Aufnahmen" von Ereignissen ausgegangen werden können. Ob sich das technisch nur auf dem keyman64 oder auch in Kombination mit PC und meinem xlink-System wird realisieren lassen, wird sich noch zeigen. Ein Protoyp eines vom PC aus steuerbaren Joystick-Kontrollers gibt es bereits, mit dessen Hilfe bereits ein am PC angeschlossener Joystick an den C64 über USB "durchgeschleift" werden kann (und so in ein PC-Basiertes Testframework eingebunden werden könnte). Ob das alles am Ende praktisch reicht, wird sich zeigen, im Moment ist das alles noch im Konjunktiv.

    Claus schrieb:

    Läuft der Microcontroller denn mit dem C64 Takt, oder unabhängig? Evtl. könnte der Controller auch selber Events z.B. auf Flash oder ähnlichem aufzeichnen? Dann könnte das ganze sogar taktgenau wiedergegeben werden...

    Der keyman64 ist vom C64 komplett unabhängig. Er kann über die serielle Schnittstelle mit dem C64 verbunden werden, notwendig ist das aber erstmal nicht. Über die serielle Schnittstelle kann der keyman64 generell ferngesteuert werden. Und ja, theoretisch könnte er auch selbst Ereignisse aufzeichnen.
  • Jetzt erheben die ersten schon den Finger für eine Sammelbestellung und ich frage mich immer noch, wozu genau man das Teil benutzen kann/soll. :schande:
    :amiga: CPC 464/6128 464/6128+ GX4000, Atari 2600 600XL 800XL/XE Portfolio, C64/II/G/R/SX VC20 TC64, AX81, ZX Spectrum 48k, Amiga 500/600/2000 A2630 A2088 :amiga:
    :syshack: Meine 3D-Drucker Teile auf thingiverse.com/oobdoo/designs :strom:
    Mit wäre das nicht passiert! :prof:
  • oobdoo schrieb:

    ich frage mich immer noch, wozu genau man das Teil benutzen kann/soll.

    Das Teil wird zwischen die Tastatur und dem Mainboard eingebaut.
    Wenn nun bestimmte Tastaturkombinationen gedrückt werden, dann wird z.B. ein Reset ausgelöst oder ein Kernal umgeschaltet oder andere Tastatureingaben werden an den C64 geschickt oder ... Welche Tastaturkombinationen benutzt werden und was dabei passiert, ist so ziemlich frei programmierbar. Also, keine Löcher für Resettaster ins Gehäuse, sondern eine Tastenkombination.
    Steht aber alles oben...

    DoReCo #53 am Sa. 17.06.2017
  • oobdoo schrieb:

    Jetzt erheben die ersten schon den Finger für eine Sammelbestellung und ich frage mich immer noch, wozu genau man das Teil benutzen kann/soll.

    Primär um Zusatzhardware wie Kernal-Adpater und ähnliches über die Tastatur zu schalten, ohne auf Schalter und Buttons angewiesen zu sein und damit ohne Löcher ins Gehäuse bohren zu müssen.

    Ich kann ja mal kurz erläutern, wozu ich es benutze, indem ich meine Hardware+Tastenbelegung mal aufliste.

    Die Meta Taste ist bei mir die Pfeil-Nach-Links-Taste, ich halte also diese Taste und drücke dabei eine der von mir definierten und programmierten Befehlstasten.

    Die Button-Leitungen meiner Ultimate habe ich aus der Ultimate raus an den keyman64 geführt.

    Dann habe ich noch ein Multirom-Modul mit 4x Kernal und 4x Charset, mit 2x2 Auswahl-Leitungen, die man normalerweise über Schalter oder Drehschalter kontrollieren würde.

    Und noch mein spezielles internes DualSID-Audio-Mischmodul, mit dem ich zwischen altem/neuen SID und Stereo-Kombinationen wählen kann, ebenfalls mit entsprechenden Steuerleitungen am keyman64.
    • Meta-R: Einfacher Reset, Resetleitung runterziehen.
    • Meta-U: Reset an der Reset-Leitung der Ultimate -> also Reset ins Modul-Menü
    • Meta-Rechte-Shift-Taste: Ultimate Menü-Button drücken
    • Meta-F: Ultimate Freeze Button drücken
    • Meta-Q: Ultimate-Reset mit gleichzeitigem Halten von RUNSTOP -> direkt in den Fastload-Direktmodus des Retro-Replay-Roms
    • Meta-+: Ultimate-Reset, danach drücken von F5 -> direkt ins Utility-Menü des Retro-Replay-Roms
    • Meta-1 bis Meta-4: Eine der vier Möglichen Audio-Mischungen auswählen
    • Meta-j: Jiffydos-Kernal wählen + normaler Reset
    • Meta-k: Xlink-Kernal + Ultimate Reset ins Fastload
    • Meta-l: Original Kernal + Ultimate Reset ins Fastload
    • Meta-F1: Macro load"*",8,1<return>
    • Meta-F3: Macro load"$",8<return>
    • Meta-F5: Macro list<return>
    • Meta-F7: Macro run<return>
    • Meta-Y: Tastaturlayout zwischen QWERTZ und QWERTY umschalten
    • ... und und und

    Prinzipiell kann man mit dem keyman alles schalten, was sonst über einen Button oder Schalter geht. Z.B. könnte man auch gut ein intern verbautes SD2IEC damit steuern, ohne tatsächliche Buttons einbauen zu müssen. Oder die selbstgebastelte Beleuchtung steuern, oder, oder...