
Die Entwickler des C64 haben nun 2 Vor-
raussetzungen geschaffen, die eine Ma-
tritzenabfrage 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" ge-
schaltet und gesetzt. Wie Sie aus der
obigen Grafik erkennen konnten, sind
die Leitungen der einzelnen Bits von
Port A in der Waagerechten für je-
weils acht Tasten durchgeschleift.
Wird nun eine Taste gedrückt, so
schaltet sie ein Signal senkrecht
durch, wo widerum acht Tasten mitei-
nander verbunden sind. Port B dient
nun als Eingang für widerum acht sol-
cher Signale. Mit Port A sind also
die waagerechten, mit Port B die sen-
krechten Tasten vesorgt. Öber eine
Kreuzpeilung kann man nun genau fest-
stellen, 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 Ein-
gangsbits ja von der CIA invertiert wer-
den).
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 Abfragerouti-
ne sich noch aus einer Tabelle im Be-
triebssystem den ensprechenden Tastenco-
de heraus, speichert ihn zwischen und
schreibt ihn zusätzlich in den Tastatur-
puffer, 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 ma-
chen, damit es erkennt, wann wir SHIFT
gedrückt haben. Zunächst möchte ich Ih-
nen 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 Assem-
blerprogramm 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 $7F ($7F=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