Magic Disk 64

home to index to text: MD9105-KURSE-CIA-KURS_TEIL_7-2.txt
MD9105-KURSE-CIA-KURS_TEIL_7-2.hires.png

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

Valid HTML 4.0 Transitional Valid CSS!