Bevor ich Jens' Beitrag gelesen hab, hab ich selbst den Gedanken weitergesponnen.
Das Ganze wird nicht portweise, sondern leitungsweise gemacht, dadurch kann jede Leitung einzeln in eine andere Richtung geschaltet sein. Ich gehe davon aus, dass, wenn ich an beiden "Enden" (Also Zeile oder Spalte) der Matrix eine 0 lese, sich eine gedrückte Taste nicht auswirkt. Wenn ich an einem Ende keine 0 mehr lese, wurde wohl gerade die Richtung auf dieser Leitung umgedreht und ich schalte das andere Ende auch wieder auf Input. Und ich gehe davon aus, dass Bits, die von der CIA gelesen werden und die ich nicht auf Low ziehe, auf High liegen.
Endlosschleife
Alle Leitungen lesen
Die Bits setzen/wegmaskieren, die ich selbst gerade auf Ausgang habe
Alle Bits auswerten, die Low sind
Wenn das andere Ende der Matrix noch auf Input steht und nicht Low ist
Anderes Ende der Matrix entsprechend auf Low ziehen (Ausgang)
Bits die auf Input stehen und nicht mehr Low sind
Anderes Ende der Matrix wieder auf Lesen schalten
PS2-Protokoll weiterfahren (Zustandsmaschine)
Bei Tastenänderung
Daten für o.g. Mechanismus vorbereiten (z.B. Tabellen)
Und von vorn
Alles anzeigen
Die Hauptaufgabe dabei ist, die Daten so geschickt abzulegen, dass die ganze Schleife in wenigen µs durchlaufen kann. Da man manche Operationen meistens abkürzen kann und oft mehrere Leitungen bzw. Bits mit logischen Operationen auf einmal behandeln kann, sollte das klappen. Die Codegröße ist ja auch nicht sooo ausschlaggebend, weil der Controller sonst nichts zu tun hat.
Nun muss ich zugeben, dass ich nur ahne, was eine Ghostkey ist und keinen Schimmer habe, wie sie normalerweise detektiert werden. Deshalb weiß ich auch nicht, ob und warum dieser Algorithmus nicht immer funktionieren würde.
Aber immerhin könnte man eine Menge verquerer Tastaturabfragen mit einem primitiven Controller unterstützen. Auf IRQs würde ich ggfs. sogar verzichten. Den Overhead könnte man sich wahrscheinlich sparen, wenn das PS2-Protokoll wirklich so langsam ist, dass man es in der Hauptschleife mit abfrühstücken könnte.
Hinweis: Leitungen, die auf Eingang stehen und immernoch auf Low sind, rufen bei unveränderter Tastensituation keine Änderung am anderen Ende hervor.
Hin- und Hergeschaltet wird vom Controller aus natürlich immer nur Input<=>Low.
Wenn ihr erkennt, dass mit dieser Lösung etwas definitiv nicht funktioniert, bitte schreibt ein ganz konkretes Beispiel. Das vermeidet Missverständnisse.
Gruß,
Thomas