Die Entwickler des C64 haben nun 2 Vorraussetzungen geschaffen, die eine Matritzenabfrage der Tastatur ermöglichen:
1) Jede einzelne Taste der Tastatur kann
man sich als einen Ein/ Aus-Schalter
vorstellen, der nur solange einen
Strom durchschaltet, wie die Taste
gedrückt ist.
2) Der Strom, der durchgeschaltet wird
kommt - jetzt halten Sie sich fest - von Port A der CIA1 . Die Bits dieses
Ports sind alle auf " Ausgang" geschaltet und gesetzt. Wie Sie aus der
obigen Grafik erkennen konnten, sind
die Leitungen der einzelnen Bits von
Port A in der Waagerechten für jeweils acht Tasten durchgeschleift.
Wird nun eine Taste gedrückt, so
schaltet sie ein Signal senkrecht
durch, wo widerum acht Tasten miteinander verbunden sind. Port B dient
nun als Eingang für widerum acht solcher Signale. Mit Port A sind also die waagerechten, mit Port B die senkrechten Tasten vesorgt. Öber eine
Kreuzpeilung kann man nun genau feststellen, welche Taste gerade gedrückt
wird.
Hierzu eine genaue Bescheibung:
Die Tastaturabfrage des Betriebssystems
legt nun zunächst an allen Bits von
Port A Eins-Signale an. Wird keine Taste
gedrückt, so ist auch nichts in Port B
zu sehen. Alle seine Bits sind auf Null
( das heißt für uns auf 1, weil die Eingangsbits ja von der CIA invertiert werden) .
Nun brauchen Sie die Tabelle von eben.
Wird jetzt nämlich eine Taste gedrückt, als Beipiel nehme ich mal die Taste " J", so wird das Eins-Signal von Port A, Bit4, an Port B, Bit2 durchgeschaltet.
Die Tastaturabfrageroutine erkennt so, daß überhaupt eine Taste gedrückt wurde, da der Inhalt von Port B jetzt ja nicht
mehr Null ist. Nun beginnt sie, alle Bits einzeln durchzutesten, indem sie
der Reihe nach die Bits von 0 bis 7 von
Port A auf Eins setzt und prüft, ob Bit2 von Port B immer noch gesetzt ist. Bei
Bit0 ist das nicht der Fall, ebenso bei
Bit1,2, und 3 . Wenn sie jetzt Bit4 von
Port A auf Eins legt, so erscheint es an
Bit2 von Port B wieder. Die Taste wäre
lokalisiert! Nun sucht die Abfrageroutine sich noch aus einer Tabelle im Betriebssystem den ensprechenden Tastencode heraus, speichert ihn zwischen und schreibt ihn zusätzlich in den Tastaturpuffer, von wo aus die Ausgaberoutine
des Betriebssystems das Zeichen auf dem
Bildschirm ausgibt.
Als Beipiel habe ich Ihnen einmal ein
kleines Programm vorbereitet. Es wartet, bis eine der SHIFT-Tasten gedrückt wird
und kehrt dann wieder zum aufrufenden
Programm zurück. Dabei müssen wir jedoch
darauf achten, daß die SHIFT-Tasten bei
der Tastatur unterschieden werden in linke und rechte Taste. Unser kleines
Progrämmchen muß also zwei Abfragen machen, damit es erkennt, wann wir SHIFT
gedrückt haben. Zunächst möchte ich Ihnen jedoch den Source-Code des Programms
hier auflisten. Sie finden ihn auch wie
immer auf dieser MD unter dem Namen
" WAITSHIFT. SRC" . Das lauffähige Assemblerprogramm heißt " WAITSHIFT. OBJ" und
muß absolut (",8,1") geladen werden. Es
liegt ab Adresse $ C000( dez.49152) und
muß mit SYS49152 gestartet werden. Nun
aber zum Listing:
**************************************** start sei System-IRQ sperren lda #$42 waagerechte Reihen mit SHIFT left und right (Bits 1 und sta cia1+2 auf "Ausgang" scha ten. lda #$00 Alle Bits von Port sta cia1+3 auf "Eingang" scha ten. loop1 lda #$fc Bit 1 auf "Eins" legen sta cia1+0 und ab ins PRA. lda cia1+1 Jetzt PRB prüfen.. cmp #$7f ...wenn SHIFT-LEFT gedrückt, dann ist Bit7 gelöscht! beq end Jau, is so, also Ende. lda #$bf Sonst Bit 6 auf "Eins" setzen sta cia1+0 und wieder ins PRA lda cia1+1 PRB holen... cmp #$ef ...wenn SHIFT-RIGH gedrückt, dann ist Bit4 gelöscht! bne loop1 Is nich, also noch mal von vorne!
end lda #$ ff DDRA muß für Sys-I
sta cia1+2 rückgesetzt werden cli System-IRQs wieder frei geben. rts Unn Tschüß! ****************************************
Kommen wir nun zur Dokumentation:
Wie Sie aus der Tastentabelle entnehm
können, sind die SHIFT-Tasten folgenderm
ß en codiert: SHIFT-LEFT wird durch Bi
von PRA angesprochen und schaltet zu Bi
von PRB durch. Ebenso bekommt SHIFT-RIG
sein Signal von Bit6 von PRA und schalt
nach Bit4 von PRB durch. Möchten wir n
also ganz gezielt diese Tasten abfrage
so müssen wir zunächst genau das Bit v
PRA setzen, das die entsprechende Tas
ansteuert. Dann muß geprüft werden, ob d
Bit, das von dieser, und NUR von dies
Taste durchgeschaltet wird auch auf 1 is
Ist dies der Fall, so war die Tas
tatsächlich gedrückt.
Zuvor müssen wir jedoch noch ein paar Vo
bereitungen treffen. Dies geschieht in d ersten 5 Zeilen von WAITSHIFT. Zunäch
müssen wir den System-IRQ sperren, da d
ja sonst die Tastatur für uns abfragt, u
uns nur stören würde. Da er über CI
läuft, genügt es, mit SEI alle IRQs unterbinden. Anschließend müssen die D
tenrichtungsregister der beiden Ports f
unsere Zwecke ausgerichtet werden. Hier
schreiben wir zunächst den Wert $42 DDRA.$42 entspricht dem Binärwe
01000010 . Hier sind die Bits 1 und 6 g
stetzt, womit wir sie auf Ausgang scha
ten. Alle anderen sind Eingang. Dadur
legen wir fest, daß Signale nun nur no
von den Tasten die in diesen Reihen ( der Tabelle) liegen kommen. In DDRB kom
eine 0 . Es würde zwar genügen, wenn w
nur die Bits 4 und 7 als Eingang schalt
ten, jedoch habe ich mich der Einfachhe
halber für diese Kombination entschiede
da sie nicht zuletzt einfacher und eben
effektiv ist.
Nun beginnt erst die eigentliche Abfrag
Begonnen wird mit der linken SHIFT-Tast Durch den Wert $ FC, den wir in PRA schre
beb, legen wir Bit2 auf Eins (000000 invertiert ergibt 11111101) . Es liegt n
ein Pegel dort an, der zu den Tast
SHIFT-LEFT, E, S, Z,4, A, W und 3 durc
geschaltet ist. Wird nun eine dieser T
sten gedrückt, so erscheint die Eins v
Bit2 an einem der 8 Bits von PRB wiede
Für die SHIFT-LEFT- Taste wäre das Bit7 .
wir die Signal-Invertierung beachten mü
sen, muß in PRB beim Auslesen also d
Wert $7 F ($7 F=01111111, das ist ein inve
tiertes 10000000=$80) stehen. Das wi
sogleich durch den CMP-Befehl überprüf
War es tatsächlich der Fall, so wird a
Ende der Routine verzweigt, wenn nich
dann müssen wir nun die rechte SHIFT-Tas
abfragen.
Dies erfolgt auf demselben Wege wie vo
her. Nur legen wir diesmal Bit6 von P
auf 1 und untersuchen, ob es an PRB wied
erscheint. Ist dies auch nicht der Fal
so werden beide Tasten nochmals überprüf
solange, bis eine Taste gedrückt wird.
Zum Schluß muß WAITSHIFT noch den alt
Wert ( ALLE Bits als Ausgang) in DD
zurückschreiben, damit die Tastaturabfra
des System-IRQs auch wieder alle Tast
abfragen kann. Nun können wir die IRQs m
CLI wieder freigeben und die Routine bee
den.
Nun wissen Sie also, wie man die Tastat
hardwaremäßig abfragt. Das kann sehr hi
freich bei der Programmierung von ein
Spielsteuerung sein, da diese Art der A
frage es einem ermöglicht mehrere Tast
gleichzeitig abzufragen. Bei einem Rennw
genspiel zum Beispiel, oder bei einer ei
fachen Auto-Simulation kann so zum Be
spiel eine Taste für die Kupplung des A
tos herhalten und eine andere für den Ga
der eingelegt werden soll. Nur wenn d
Kupplung gedrückt ist, kann der Gang ei
gelegt werden. Dadurch bekommt das Spi
gewissermaßen einen " seriösen Touch" . . .
Damit soll es dann für diesen Monat gen sein in Sachen Geheimdienst. Nächstea M
geht es weiter mit der Ein-/ Ausgab
Programmierung. Wir wollen uns dann eine Joystickabfrage kümmern und noch e
was über ein spezielles Ein-/ Ausgab
register der CIA erfahen. Bis dahin vi
Spaß beim Tastendrücken,
Ihr Uli Baster