Keyscan Messungen

Es gibt 15 Antworten in diesem Thema, welches 1.959 mal aufgerufen wurde. Der letzte Beitrag (6. November 2021 um 15:37) ist von 0xdeadbeef.

  • Wie in meinen Bitte melde dich an, um diesen Link zu sehen. angekündigt werde ich hier ein paar Messungen verschiedener Keyscans veröffentlichen. Ich habe damit angefangen, um die Möglichkeiten eines passiven und aktiven Keyscans für eine Erweiterungsplatine zu untersuchen.

    Im oben genannten Thread haben wir von Bitte melde dich an, um diesen Link zu sehen. gelernt, daß sich die Ausgangsschaltungen von PortA und PortB des CIA sich physikalisch unterscheiden. PortA ist ein Open-Drain-Ausgang mit internem Pullup. PortB ist ein Push-Pull-Ausgang mit Pullup. Während es also ungefährlich ist, PortA als Ausgang zu konfigurieren und Pins auf high zu schalten, weil sie nicht aktiv auf 5V gezogen werden, sondern lediglich von einem Pull-Up, schaltet an Port B ein Transistor gegen 5V. Wenn also Pins an PortB auf Ausgang konfiguriert und eingeschaltet werden, würde ein externer Kurzschluß gegen Masse (durch einen Joystick o.ä.) einen Kurzschlußstrom durch den Transistor fließen lassen. Vermutlich ist das der Grund, daß nicht nur der Kernal, sondern mehr oder weniger alle Programme/Spiele PortA auf Ausgang konfigurieren und PortB auf Eingang, um die Tastaturmatrix abzutasten.

    Als erstes eine Messung des Kernal-Keyscans.

    Ohne gedrückte Taste

    Bitte melde dich an, um diesen Anhang zu sehen.

    Space gedrückt:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Der Keyscan geschieht also immer am Ende der IRQ-Routine. Am Anfang werden alle PA-Pins für ~39µs auf Masse gezogen, falls dabei keine Änderung an PortB erkannt wurde, wird nicht weiter gescannt.

    Falls eine Taste gedrückt war, werden die PA0 bis PA7 nacheinander einzeln kurz auf Masse gezogen. Das verlängert die Laufzeit der IRQ-Routine deutlich von etwas über 200µs auf fast 2ms.

    Am Ende der Keyscans, vor dem Verlassen der IRQ-Routine, wird PA7 als einziger Pin von PortA wieder explizit auf Masse gezogen. Das dient dazu, den Zustand der Run/Stop-Taste in Laderoutinen usw. ohne Keyscan abpollen zu können.

    Weitere Messungen werde ich der Übersicht halber als neue Beiträge in diesem Thread einstellen.

  • Commando Arcade:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Nach menschlichem Ermessen gibt es keinen Keyscan im Sinne der Kernals (auch nicht, wenn man andere Tasten drückt). Die Abfrage der Space-Taste ist trotzdem möglich, weil PA7 dauerhaft low ist.

    Interessant ist das Verhalten, wenn man Space und F1 gleichzeitig drückt:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Ich vermute, daß dadurch PA0 und PA7 verbunden wurden, weil Space und F1 in der gleichen Spalte liegen. Warum diese Low-Phasen aber immer nur ca. 28ms betragen, kann ich im Augenblick nicht wirklich erklären.

    Diesen Fall müßte ich mir eventuell nochmal mit dem Scope ansehen und/oder mit einem anderen LogicAnalyzer (mit 16 statt 9 Kanälen) auch die Pins von PortB aufzeichnen...

  • Gates of the Ancients

    Ohne gedrückte Taste werden ähnlich wie beim Keyscan des Kernals alle PortA-Pins kurz gegen Masse gezogen. Das passiert allerdings außerhalb des IRQs

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wenn man Space oder F1 drückt, wird ein voller Keyscan an der gleichen Position (also nach dem IRQ) gemacht:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Im Gegensatz zum Kernal sind nach dem Keyscan alle PortA-Pins high.

  • Koronis Rift hat keinen Keyscan, alle PortA-Pins sind normalerweise high:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Trotzdem wird beim Drücken von Space ein Keyscan auf PA7 gestartet:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wenn man dagegen F1 drückt, gibt es einen Keyscan auf PA0:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Auch hier ist mir offen gestanden nicht wirklich klar, wie das funktioniert. Eigentlich können PA0 und PA7 durch durch das Drücken von Tasten nicht low werden - außer der Low-Pegel kommt von PortB!?

    Leider habe ich an diesem Logic-Analyzer nur 9 Eingänge, also muß ich das später nochmal mit einem 16-Kanal-Gerät nachmessen.

  • Last Ninja 3 (EF) zeigt gegenüber den meisten anderen Spielen nicht nur eine sehr hohe IRQ-Aktivität, sondern auch unverhältnismäßig viel Aktivität auf den PortA-Pins ohne jeden Tastendruck:Bitte melde dich an, um diesen Anhang zu sehen.  Bitte melde dich an, um diesen Anhang zu sehen.

    Beim Drücken von Space kann man nicht wirklich einen Unterschied sehen.

    Während des Drückens von F1 werden große Teile des Keyscans gestoppt:
    Bitte melde dich an, um diesen Anhang zu sehen.

    Das liegt allerdings daran, daß das Spiel während des Drückens von F1 stehenbleibt.

    So oder so eine eher exotische Implementierung.

  • Legacy of the Ancients hat einen Keyscan ähnlich dem im Kernal, allerdings wie schon bei Gates of the Ancients außerhalb der IRQ-Routine. PA7 ist wie beim Kernal normalerweise immer low.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wenn man Space oder eine Funktionstaste drückt, gibt es einen vollen Keyscan ähnlich wie im Kernal.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wie im Kernal wird PA7 danach wieder auf low geschaltet.

  • Murder on the Mississippi hat wie Commando keinen permanenten Keyscan. PA7 ist dauerhaft low, um Space erkennen zu können.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Beim Drücken von Space oder einer Funktionstaste verändert sich das Verhalten überhaupt nicht.

  • Neuromancer zeigt dagegen einen klassischen vollen Scan wie Gates of the Ancients:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Auch hier werden alle PortA-Pins etwas nach demn IRQ kurz runtergezogen, um zu testen, ob irgendeine Taste gedrückt ist.

    Wenn Space oder F1 gedrückt wird, gibt es einen kompletten Keyscan:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Alle PortA-Pins werden nach dem Scan wieder auf high geschaltet . Etwas eigenartig sind die insgesamt drei Pulse auf PA1 (reproduzierbar, anscheinend kein Glitch).

  • Zak McKracken (EF) zeigt neben einer erhöhten Interruptaktivität (vermutlich wegen der Spritemultiplexer) ein ziemlich einmaliges Keyscan-Verhalten:

    Bitte melde dich an, um diesen Anhang zu sehen.  Bitte melde dich an, um diesen Anhang zu sehen.

    Die PortA-Pins sind also die meiste Zeit low und werden nur alle 20ms für 30-130µs oder so "high" geschaltet.

    Wenn man Space drückt, passiert das hier:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Die High-Pulse kommen also unverändert, aber jetzt bleiben die Portpins nur kurz alle low. Alle PortA-Pins bis auf PA7 bleiben jetzt bis zum nächsten Scan ~20ms high, nur PA7 wird nach einem weiteren kurzen High-Pulse auf Low geschaltet.

    Etwas ganz ähnliches passiert nach dem Drücken von F1 auf PA0:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Ist zumindest auch mal wieder was anderes...

  • Während es also ungefährlich ist, PortA als Ausgang zu konfigurieren...Wenn also Pins an PortB auf Ausgang konfiguriert und eingeschaltet werden, würde ein externer Kurzschluß gegen Masse (durch einen Joystick o.ä.) einen Kurzschlußstrom durch den Transistor fließen lassen.

    Heißt das, dass es doch einen Killerpoke gibt?

  • Heißt das, dass es doch einen Killerpoke gibt?

    Na ja, ganz ohne Interaktion (Tastendruck) oder Joystickbenutzung besteht erstmal eh keine Gefahr. Aber ich persönlich würde es nicht darauf anlegen und PortB auf Ausgang und High-Pegel programmieren. Eventuell reichen ja die Widerstände durch Leiterbahnen, Joystickkabel (und bei Shortboards noch die EMV-Filter), um den Strom so zu begrenzen, daß nichts Schlimmes passiert. Und so richtig niederohmig sind die ollen NMOS-Schaltungen wohl eh nicht.

    Aber potentiell erscheint es halt schon riskant, einen Transistor, der gegen 5V-schaltet auf gut Glück gegen Masse kurzzuschließen und darauf zu vertrauen, daß er den Strom schon aushalten wird.

  • außer der Low-Pegel kommt von PortB!?

    "Wenn Du das Unmögliche ausgeschlossen hast, dann ist das, was übrig bleibt, die Wahrheit, wie unwahrscheinlich sie auch ist." ;)

    Du kannst ja deine Logicanalyzer-Leitungen an je vier Pins von PA und PB anklemmen und dir eine Test-Taste aussuchen, die sich in diesem Matrixausschnitt befindet.

    Oh, und teste doch mal mit GEOS - ich glaube irgendwo mal gelesen zu haben, dass dessen Tastaturabfrage auch etwas ungewöhnlich wäre. Auf jeden Fall verwendet es einen Joystick in Port 1, der ja die normale Keyboardabfrage des Kernals deutlich stört.

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • Also ich muß mich dahingehend korrigieren, daß Koronis Rift keinen Keyscan hat. Es hat einen, aber auf Port B und nur für PB4:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bei gedrücktem Space bewegt sich dann PA7 über den Kontakt der Space-Taste runtergezogen:
    Bitte melde dich an, um diesen Anhang zu sehen.

    Dazu muß man sagen, daß Koronis-Rift mit dem Joystick an Port1 gespielt wird. Tatsächlich scheinen Spiele, die Port1 benutzen, potentiell eher einen Keyscan über PortB zu machen.

  • Ein noch besseres Beispiel ist Bruce Lee, das ebenfalls mit dem Joystick in Port 1 gespielt wird und sogar alle PB-Pins für den Scans nach unten zieht:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Wenn man Space drückt, passiert das:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Und bei F3 das hier:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Das ist irgendwie eigenartig. Es sieht fast so aus, als würde der allgemeine Keyscan (ist überhaupt eine Taste gedrückt) auf Port B gemacht und als ob dann auf PortA ein gezielter Scan durchgeführt würde.

    Auch interessant: im Menü macht Bruce Lee einen extrem schnelle Keyscan auf PortB

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Und um das nochmal mit allen 16 Pins nachdokumentiert zu haben.

    So sieht der Kernal-Scan aus, wenn man Space drückt:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Und so, wenn man F1 drückt:

    Bitte melde dich an, um diesen Anhang zu sehen.