Magic Disk 64

home to index to html: MD9105-KURSE-CIA-KURS_TEIL_7-2.html
MD9105-KURSE-CIA-KURS_TEIL_7-2.hires.png
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



Valid HTML 4.0 Transitional Valid CSS!