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