Tastaturmatrix

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Wie die Tastatur ‚funktioniert‚

Nach PETSCII und Char-ROM sollte man noch wissen, wie Tastatureingaben ausgelesen werden können.

Der C64 besitzt 66 Tasten, davon sind 64 in einer 8×8 Matrix organisiert (s. unten).

Die beiden ‚fehlenden‚ Tasten sind:

  • <SHIFT LOCK> : Diese ist parallel zur linken Shift-Taste  <L.SHIFT> geschaltet und ermöglicht durchs Einrasten ein dauer Großschreiben (so wie Caps-Lock beim PC)
     
  • <RESTORE> : Die Taste läßt sich nicht so einfach (nur über Umwege) abfragen! Sie ist direkt mit der NMI-Leitung (None Maskable Interrupt / nicht maskierbarer Interrupt) des Prozessors verbunden. Ein NMI läßt sich nicht durch den SEI-Befehl unterdrücken, man kann höchstens die Einsprungadresse verbiegen und so den Interrupt ‚umgehen‚.

 

Enter the Matrix 😉

Um unter Assembler Tastatureingaben abzufragen, kann man entwerder auf Systemroutinen (z. B. das GET vom Basic oder auf die Kernal-Funktion SCAN KEYBOARD) zurückgreifen oder man programmiert es selbst.

Schauen wir uns dazu erstmal die Tastaturmatrix an:

Die Tastaturmatrix des C64 inkl. Joystickports
Die Tastaturmatrix des C64 inkl. Joystickports

Als erstes fällt auf, dass wir zum Abfragen zwei Register ($DC00 Port A / $DC01 Port B) vom CIA-1 benötigen. Außerdem sehen wir, dass neben den Tasten auch die beiden Joystickports über diese Matrix abgefragt werden (was durchaus zu Problemen führen kann).
Was wir in der Grafik nicht sehen können ist, dass alle nicht gedrückten Tasten einen High-Pegel aufweisen, sie liefern also eine 1 !! Um zu erkennen, ob eine Taste gedrückt wurde müssen wir diese also auf 0 prüfen!!

Möchten wir auf eine spezielle Taste (nehmen wir mal <HOME>) warten, können wir z. B. so vorgehen:

Wir setzten das Bit PA6 in  $DC00 auf 0, da sich unsere gesuchte Taste in dieser Spalte befindet. Anschließend prüfen wir, ob in  $DC01 PB3 auf 0 steht, da sich  <HOME> genau an der Kreuzung von PA6 und PB3 befindet.

An der Kreuzung von PA6 und PB3 befindet sich die HOME-Taste.
An der Kreuzung von PA6 und PB3 befindet sich die HOME-Taste.

Ist dass der Fall, dann wurde unsere Taste gedrückt, anderenfalls prüfen wir solange weiter, bis sie gedrückt wurde.

Hier ein kleines Assembler Beispiel:

Die Tastaturabfrage des C64 macht übrigens nichts anderes. Sie schaltet einzeln jedes BIT in  $DC00 einmal auf 0 und prüft dann über  $DC01 welche BITs gelöscht sind. Falls ihr euch dafür interessiert, die entsprechende Kernal-Routine findet ihr ab $EA87.

 

In der Grafik könnt ihr sehen, dass auch die Joystickports auf PA (Joy-2) und PB (Joy-1) gemappt sind. Dies kann dazu führen, dass ihr Probleme bekommt, wenn ihr Tasten und Joysticks gleichzeitig abfragen möchtet. Bei der Tastaturroutine des KERNALs könnt ihr das z. B. sehen. Startet Vice wählt als Joystick den im Port-1 aus und drückt den Stick dann immer nach unten. Auf dem BS erscheinen verschiedene Zeichen, die auf PB1 zu finden sind.
Außerdem gibt es Schwierigkeiten, wenn ihr mehrere Tasten gleichzeitig erkennen wollt. Dies wird von Emulatoren bisher nicht simuliert, einzig im CCS64 könnt ihr das mal testen, indem ihr Cursor links und Cursor runter gleichzeitig drückt und dann wiederholt

Ein Phantom-Tastendruck
Ein Phantom-Tastendruck

die linke Shift Taste betätigt. Es erscheint dann hin und wieder das Pik-Symbol, dass <SHIFT>+‘A‚ entspricht. Auf einem ‚echten‚ C64 könnt ihr dieses Verhalten für alle Tasten reproduzieren, die sich an den Ecken eines gedachten Rechtecks auf der Tastaturmatrix befinden. Haltet ihr zwei davon zusammen gedrückt und betätigt dann die dritte erscheint ab und zu das Zeichen, dass sich an der 4. Ecke befindet.
Dieses Verhalten hat übrigens einen technischen Grund und ist kein Softwarefehler. Durch eine Diode je Taste hätte man es verhindern können.

 

Keyscan mit dem Kernal
Normalerweise fragt der C64 60mal in der Sekunde die Tastatur ab. Solange der dazugehörige Interrupt aktiv ist, könnt ihr die aktuelle Taste auch über eine Zeropage-Adresse in Erfahrung bringen. Dazu müsst ihr nur schauen, was in der Adresse $CB steht. Dort legt die Keyscanroutine des Kernals nämlich die Matrixkoordinate der aktuell gedrückten Taste ab.

Exkurs: Was fängt das Betriebssystem mit dem Wert aus  $CB an?
Jede der 64 möglichen Tasten kann bis zu 4 verschiedene Zeichen erzeugen. Wie ihr wisst, ändert sich die Ausgabe abhängig davon, ob ihr SHIFTCONTROL oder die Taste mit dem COMMODORE LOGO zusätzlich drückt. Um jetzt eine Matrixkoordinate in ein Zeichen unzuwandeln, nutzt der Kernal vier Hilfstabellen. Diese findet ihr ab $EB81. In jeder Tabelle sind 64 Zeichen abgelegt – für jede Zusatztaste eine.

  • $EB81 : weder SHIFTCONTROL noch die Taste mit dem COMMODORE LOGO sind gedrückt
  • $EBC2 :  SHIFT wurde zusätzlich gedrückt
  • $EC03 : COMMODORE LOGO wurde zusätzlich gedrückt
  • $EC78 : CONTROL wurde zusätzlich gedrückt

Um nun auf diese Tabellen einfach zugreifen zu können, wird auf der Zeropage bei $F5 und $F6 die Adresse der benötigten Tabelle, abhängig von der gedrückten Zusatztaste, abgelegt.

 

Steht bei  $CB der Wert #$40 bzw. 64 dezimal, dann ist aktuell keine Taste gedrückt. Die Werte für die einzelnen Tasten findet ihr in der folgenden Grafik:

Matrixkoordinaten (Hex / Dez)
Matrixkoordinaten (Hex / Dez)

Wie euch evtl. aufgefallen ist, werden einige Tasten nicht dort abgelegt:
SHIFT, CONTROL und die Taste mit dem COMMODORE LOGO. Diese vier (es gibt ja links und rechts eine SHIFT-Taste!) werden abweichend behandelt und lassen sich daher nicht über  $CB auswerten! Den Status dieser Tasten findet ihr bei  $28D. Allerdings könnt ihr dort nicht erkennen, welche SHIFT-Taste gedrückt wurde! In den unteren drei BITs steht welche Taste es war…

  • %000 = weder SHIFT, CONTROL noch die Taste mit dem COMMODORE LOGO sind gedrückt
  • %001 = eine der SHIFT-Tasten ist gedrückt
  • %010 = die Taste mit dem  COMMODORE LOGO wurde gedrückt
  • %100CONTROL wurde gedrückt
  • %011, %101, %110 und %111 : Werden mehrere Tasten gleichzeitig betätigt, dann addieren sich die Werte

 

Die Abfrage gestaltet sich nun relativ einfach, ich beschänke mich hier mal auf $CB

Zu Beginn warten wir, falls aktuell eine Taste gedrückt ist, bis diese losgelassen wird. Dies soll verhindern, dass das Programm evtl. versehentlich direkt wieder beendet wird. Dann lassen wir den Rahmen so lange blinken, bis  SPACE  gedrückt wird. Ist dies der Fall, geht es zurück ins BASIC.


Schrott!!Naja...Geht so...Ganz gut...SUPER! (3 Bewertungen | Ø 5,00 von 5 | 100,00%)

Loading...


 

<<<zurück |

weitersagen ...
Tweet about this on TwitterShare on FacebookShare on Google+Share on LinkedIn

Schreibe einen Kommentar


Beachtet bitte, dass ich eure Kommentare erst manuell freigegeben muß, bevor sie auf der Seite erscheinen! Da ich nicht pausenlos am Rechner sitze, kann es schon mal etwas dauern, bis ein Kommentar für alle sichtbar ist.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Protected by WP Anti Spam