wenn die "normale" Shift-Taste den gleichen Fehler auslöst
Naja, sowohl Shift-Lock als auch die linke Shift-Taste gehen auf die gleichen Pads, sind also faktisch die gleiche Taste. Das einzige, was man hieraus schonmal ableiten kann, ist, dass es nicht am Schalter in der Shift-Lock-Taste hängt.
Die Tastatur "an sich" ist eigentlich - man möge es mir verzeihen - dumm wie ein Stück Brot. Technisch wird dort nichts anderes getan, als die Verbindung zwischen 2 Pads mechanisch und damit auch elektrisch zu schließen. Die Pads sind jeweils in verschiedenen Reihungen an die Pins Richtung internem Keyboard-Connector angeschlossen, und diese Pins gehen wiederum quasi unmodifiziert an die beiden Ports A (PA0-PA7) und B (PB0-PB7). Ohne zu sehr ins Detail zu gehen, ein paar Grundlagen zur Tastaturabfrage beim C64:
- Unter jeder Taste sitzen 2 Pads, wovon eines mit einem Pin / Bit an CIA Port A, das andere mit einem Pin / Bit an CIA Port B verbunden ist.
- Die Pins / Bits beider Ports werden durch einen internen Pullup auf High gezogen, solange der Pin keine Verbindung zu irgendwas Definiertem hat, also "floatet".
- Die Datenrichtung kann über die beiden Ports DDRA und DDRB bitweise zwischen Eingang (nur Lesen) und Ausgang (Lesen und Schreiben) umgeschaltet werden.
- Das Keyboard wird per Interrupt 60x pro Sekunde abgefragt, egal, ob was gedrückt wurde oder nicht (also: Polling).
Grundsätzlich läuft bei einem Tastendruck etwa Folgendes ab:
- Ein Pin von Port A wird mit einem Pin von Port B kurzgeschlossen. Erstmal passiert da nix Dramatisches, weil erst im Interrupt geprüft wird, welche Taste das auslöst. Das Folgende passiert im Interrupt:
- DDRA steht komplett (PA0-7) auf Ausgang. DDRB bleibt auf Eingang.
- Port A wird mit #%00000000 initialisiert, damit sind alle Pins auf Low.
- Port B wird gelesen. Kommt als Ergebnis #%11111111, dann ist zum Abfragezeitpunkt keine Taste gedrückt, keine Decodierung nötig. Warum? Weil die in Port A geschriebenen Nullen wie GND wirken. Tastendruck würde dann zumindest einen der Pins an Port B mit irgendeinem dieser Pins an Port A kurzschließen und damit diesen Pin an Port B ebenfalls auf "0" / Low ziehen. Ist beim Lesen von Port B nach obiger Vorbereitung von Port A also alles auf "1", dann ist kein Kurzschluss vorhanden -> keine Taste gedrückt. -> Abbruch der Tasturabfrage.
- Wurde eine Taste gedrückt, ist ein Bit des gelesenen Port B -Bytes "0". Die Decodierung startet.
- Bit / Pin #0 von Port A wird auf "0" gesetzt, der Rest auf "1". Damit wird quasi zuerstmal NUR alles in "Spalte 0" geprüft.
- Port B wird erneut ausgelesen. Dann werden alle 8 Bits dieses Ergebnisses auf "0" oder "1" nacheinander getestet. Ist ein Bit ="0", ist der Kurzschluss und damit die gedrückte Taste gefunden: Nummer dieses Bits ist die "Zeile" in der Decodiermatrix, die Spalte ist über den in Port A geschriebenen Wert bekannt, wo im Loop immer nur EIN Bit auf "0" gesetzt wird. -> Taste erkannt, raus aus der Prüfung, zur Auswertung.
- Sind alle Bits im Port B auf "1", dann war die gedrückte Taste nicht in Spalte 0 der Matrix.
- Durch Bitrotation (SEC, ROL A) wird das "0"-Bit in die nächste zu prüfende "Spalte" der Matrix verschoben, das resultierende Byte in Port A geschrieben, und erneut wird Port B auf eine Reaktion (ein Pin / Bit statt "1" nun "0") geprüft. -> Loop
- Spätestens mit "Spalte" #7 und "Zeile" #7 sollte dann nach max. 64 Durchläufen (8 Zeilen x 8 Spalten) die "0"-Reaktion gefunden sein. Ein Zähler innerhalb der Schleifenkonstruktion liefert dann den Matrixcode der gedrückten Taste.
Klingt kompliziert - isses auch, zumindest beim Erklärversuch...
Das heißt aber auch:
Ist die CIA defekt, dann müssten *mehrere* Tasten (da an jedem Pin 8 Tasten hängen) einen Fehler / ein Problem erzeugen. "Shift links" verbindet (genau wie "Shift lock") die Pads "B" und "3" der Tastatur miteinander, also "B" -> Port B Bit 1 ("row1" = Pin 11 an CIA #1) mit "3" -> Port A Bit 7 ("column7" = Pin 8 an CIA #1). Auf Reihe "B" liegen nun auch noch E, S, Z, 4, A, W und 3, auf Spalte "3" liegen noch N, V, X, "run/stop", "/", das Komma und "Cursor hoch/ runter". Deshalb sollte bei CIA-Defekt je nach Portbit auch jede der anderen Tasten der genannten Tastengruppen zum gleichen Ergebnis führen. Ist dagegen wirklich NUR Links-Shift / Shift-lock betroffen, müsste der Fehler im Bereich des Keys selbst liegen, denke ich.
Durch die simple Natur dieser elektrischen Verbindung (nur Kurzschluss der Port-Pins; die Tastatur bekommt nichtmal 5V vom Rechner, der Pin ist nicht genutzt) kann ich mir kaum vorstellen, dass der Rechner "elektrisch" abstürzt, wenn die anderen Tasten nicht Gleiches auslösen. Und im ROM-Listing zur Tastaturabfrage hab ich auf die Schnelle nur einen "No-Return-Loop" gesehen - wenn der gelesene Wert von Port B sich beim Vergleich mit einem direkt danach per CMP erneut ausgelesenen Wert unterscheidet, wird unendlich geloopt, bis der Wert konstant bleibt. Kippelt also ein Portbit in rasender Geschwindigkeit, kann das zu einem Lockout innerhalb der Interrupt-Routine führen. Unwahrscheinlich...
Ich würde Shift-lock nochmal ablöten und schauen, ob ohne den Lock-Schalter auch bei "Shift links" wieder der Cursor verschwindet.
Mal weiter analysieren, was mir noch so einfällt...
Just my 2 cents, again...