Magic Disk 64

home to index to html: MD9109-KURSE-CIA_TEIL_2.html
MD9109-KURSE-CIA_TEIL_2.hires.png
Ich möchte Ihnen nun die einzelnen  Sig-
nale genauer erklären:                  
* Wie Sie sehen ist Masse (GND)  viermal
  am  Userport  zu finden nämlich an den
  Pins 1,12,A und N. Auf diese Weise ist
  sichergestellt, daß man immer  an  den
  äußeren   Pins   den   Gegenpol  einer
  Gleichspannung findet.                
* Die oben genannte Gleichspannung  sind
  wohl  in  der Regel die +5 Volt an Pin
  2, die man  als  Betriebsspannung  für
  Hardwareerweitungen benutzen kann. Die
  dort  herausgeführte  Leitung  ist mit
  maximal 100 mA belastbar.             
* Pin 3 enthält  die  RESET-Leitung  des
  Rechners.  Durch  sie kann der gesamte
  C64  wieder  in  den  Einschaltzustand
  zurückversetzt  werden.  Da das Signal
  invertiert ist (Strich über  dem  Wort
  "RESET"), muß kein Pegel angelegt wer-
  den (+5V), um  den  Reset  auszulösen,
  sonden  man  muß  diesen Pin mit Masse
  verbinden.                            
* Die  Leitungen  CNT1  (Pin4)  und CNT2
  (Pin6) sind die CNT-Leitungen von CIA1
  und CIA2. Wir  haben  diese  Leitungen
  schon  bei den Timerinterrupts kennen-
  gelernt, da man sie zur Timersteuerung
  heranziehen  kann.  Sie  spielen  eine
  große  Rolle  bei  unserer Mausabfrage
  nacher.                               
* Die Leitungen SP1 (Pin 5) und SP2 (Pin
  7)  sind die SP-Leitungen von CIA1 und
  CIA2. Diese Leitungen werden zur inte-
  raktiven   seriellen  Datenübertragung
  benutzt und sollen uns ebenfalls nach-
  her noch beschäftigen.                
* Die  Leitungen  PC2  (Pin 8) und FLAG2
  (Pin B) sind negierte Signale (deshalb
  auch der Strich über den  beiden  Wor-
  ten). Sie sind die Handshake-Leitungen
  von CIA2. Ein "Handshake" ist wichtig,
  um  bei  einer  Datenübertragung  eine
  Verbindung korrekt aufzubauen. PC2 ist
  dabei der Handshake-Ausgang, FLAG2 der
  Handshake-Eingang.                    
* Die Leitung  "ATN  IN"  ist  ein  hier
  ebenfalls   zu  findendes  Signal  vom
  IEC-Bus, an dem die Floppy angeschlos-
  sen  ist. Dieses Signal stammt von der
  Portleitung 3, Port A (PA3) der CIA2. 
* An den Pins 10 und 11 liegt eine Wech-
  selspannung von 9 Volt an. Da es  sich
  um  Wechselspannung  handelt  benötigt
  man natürlich 2  Anschlüsse  (Wechsel-
  spannung  wird im Gegensatz zu Gleich-
  spannung nicht mit Masse  am  Gegenpol
  angeschlossen).                       
* Die Pins C-L entsprechen dem  gesamten
  Port  B  der CIA2. Dadurch wird es mö-
  glich eine "echte"  parallele  Datenü-
  bertragung   zu  realisieren  (CENTRO-
  NICS), wie  sie  von  vielen  Druckern
  verlangt   wird.  Gleichzeitig  dienen
  diese  Leitungen  dem   Datenaustausch
  verschiedenster  Art  zwischen dem C64
  und  einer  angeschlossenen  Hardware.
  Auch wir werden diese Leitungen später
  benutzen.                             
* Pin  M beinhaltet ebenfalls eine Port-
  leitung, nämlich das 2. Bit  von  Port
  A.  Auch  diese  Leitung kann als I/O-
  Leitung  genutzt  werden   (z.B.   für
  Steuersignale  einer  Parallelschnitt-
  stelle)                               
Soviel also zu den  Leitungen  am  User-
port.  Wie  Sie sehen bedient Haputsäch-
lich die CIA2 den Datenverkehr an dieser
Schnittstelle. Von CIA1 finden  wir  nur
zwei  Leitungen (CNT1 und SP1). Doch ge-
rade diese Leitungen, zusammen  mit  den
äquivalenten  Leitungen  von  CIA2 (CNT2
und SP2) spielen bei unserer Mausabfrage
später noch eine große Rolle.           
Kommen  wir  nun  also  zu  der  Abfrage
selbst.  Wie  versprochen, wollen wir ja
die drei oben genannten Nachteile unter-
binden.  Um  es einmal langsam anzugehen
wollen wir zunächst einmal die  Tastatur
wieder  benutzbar machen. Wie Sie ja nun
wissen, sind die Portleitungen der  CIA2
am  Userport  herausgeführt.  Diese sind
glücklicherweise vom Betriebssystem  un-
genutzt, weshalb wir an diesen Leitungen
getrost  Signale  einleiten können, ohne
dabei den die "normale"  Rechnerumgebung
zu  stören.  Da  die Tastaturabfrage von
CIA1 erledigt wird stören die  am  User-
port   angeschlossenen  Maussignale  sie
also in keinster Weise. Zudem können wir
haargenau  dieselbe  Abfrageroutine  wie
beim  letzten  Mal  benutzen, jedoch mit
dem Unterschied, daß sie  sich  nun  die
Mausdaten aus Port B von CIA2 holen muß.
Wir  müssen  also lediglich einen Befehl
des Programms von letztem Monat  ändern,
nämlich das ehemalige "LDA $DC00" in ein
LDA  "$DD01"  und schon funktioniert die
Abfrage!                                
Zusätzlich  brauchen wir jetzt natürlich
noch einen  Adapterstecker,  der  jedoch
einfach  nachzubauen  ist. Alles was Sie
dazu brauchen ist:                      
1) Ein Userportstecker                  
2) Eine Joyportbuchse                   
3) Etwas Kabel                          
4) und  ein  kleines  bisschen Erfahrung
   mit dem Lötkolben.                   
Bis auf Punkt 4 ist alles für  ein  paar
Mark im Elektronikfachhandel erhältlich.
Wenn Sie alles zusammen haben, verbinden
Sie bitte Pins der beiden  Stecker  wie-
folgt:                                  
Joyport Userport Signal                 
----------------------------------------
   1  -->  C     Vertical Pulse         
   2  -->  D     Horizontal Pulse       
   3  -->  E     Vertical Quadrature    
   4  -->  F     Horizontal Quadrature  
   6  -->  H     Linker Mausbutton      
   7  -->  2     Betriebsspannung +5V   
   8  -->  1     GND                    
   9  -->  J     Rechter Mausbutton     
Die  Signalnamen  sollten  Sie  noch aus
letztem Kursteil kennen.                
Achten Sie beim Löten bitte darauf, daß 
Sie  die  richtige  Symmetrie  benutzen.
Beim Userport sind  die  Leitungen  näm-
lich, wenn man von vorne auf den STECKER
schaut  genau spiegelverkehrt (Pins 1-12
und A-N von rechts nach links).  Schauen
Sie hinten auf die Lötpins des Steckers,
so  stimmt  die  Belegung wieder, so wie
Sie in der obigen Grafik aufgeführt war.
Ähnliches gilt für die  Joyportbuchse  -
wenn  Sie  von  vorne auf sie draufsehen
ist Pin 1 links oben und  Pin  9  rechts
unten.  Von hinten ist Pin 1 rechts oben
und Pin 9  links  unten.  In  der  Regel
sollten aber beide Stecker auch mit Pin-
nummern versehen sein, so daß man  keine
Fehler machen kann. Achten Sie aber bit-
te doch darauf und prüfen  Sie  vor  dem
ersten  Anschluß  nocheinmal  alle  Pins
nach, da Sie  sich  bei  einer  falschen
Belegung  durchaus  den  Rechner  kaputt
machen können!!! Wir übernehmen in  die-
sem Fall keinerlei Ersatzansprüche!     
Worauf Sie ebenfalls achten sollten  ist
das  sie eine Joyport-BUCHSE benötigen -
nicht etwa einen STECKER. Das heißt, daß
das Ding, welches Sie sich kaufen  genau
denen  entsprechen  muß, die an den Joy-
ports des C64 herausschauen!            
Wenn  dann alles geklappt hat können Sie
Ihren Adapterstecker ausprobieren. Stek-
ken  Sie ihn am Userport, bei abgeschal-
tetem Rechner, ein (bitte wieder  darauf
achten,  daß  Sie ihn nicht verkehrt hi-
neinstecken, da  sonst  derselbe  Effekt
wie  oben  auftritt)  und  schließen Sie
eine orginal AMIGA-Maus an  der  anderen
Seite  an. Wie Sie sehen, können Sie die
Tastatur immer noch ganz  normal  benut-
zen.  Laden Sie nun das Programm "AMIGA-
MAUS2" von dieser MD und starten Sie  es
mit  RUN. Sie können jetzt den Mauspfeil
über den Bildschirm  bewegen.  Das  Pro-
gramm  kann  mit der linken UND - im Ge-
gensatz zu unserer alten Abfrage  -  mit
der  rechten  Maustaste abgebrochen wer-
den. Damit hätten wir also schon  einmal
zwei  Nachteile  beseitigt, nämlich der,
daß die Tastatur unbenutzbar war und der
daß die rechte Maustaste nicht abgefragt
werden konnte. Letztere  hatten  wir  ja
beim  Bau  des Adaptersteckers mit Pin J
des Userports verbunden, womit ihr  Sig-
nal an der Leitung PB5 von CIA2 anliegt.
Diese  Leitung entspricht nun dem 5. Bit
von PortB der CIA2, womit wir die  Taste
problemlos abfragen könnten!            
Falls  es Sie interessiert - der Source-
Code von "AMIGA-MAUS2" ist ebenfalls auf
dieser  MD  unter  dem   Namen   "AMIGA-
MAUS2.SRC"  enthalten. Er entspricht je-
doch, abesehen von der oben beschiebenen
Änderung haargenau dem von "AMIGA-MAUS1"
Nun  gut  -  über den Userport haben wir
die Maus und  die  Tastatur  vollständig
benutzbar  gemacht,  jedoch ist es schon
hinderlich, wenn die  Abfrage  immer  in
der Hauptschleife des Rechners läuft. So
muß bei einem Programm, das mit der Maus
bedient wird, bei jeder einzelnen Routi-
ne, die etwas anderes tun soll  als  die
Maus  abzufragen,  die Abfrage unterbro-
chen werden. Und das ist  verbunden  mit
hohem organisatorischem Aufwand.        
Deshalb wollen wir nun  versuchen,  eine
Abfrage  über  Interrupts zu programmie-
ren. Es IST möglich - ich  habe  mir  da
eine  pfiffige  Routine  für  Sie ausge-
dacht.                                  
Wie ich oben schon erwähnte sollen dabei
die Leitungen CNT1 und CNT2 am  Userport
eine  wichtige Rolle spielen. Vielleicht
erinnern Sie sich ja noch an die  ersten
Teile des CIA-Kurses, in denen ich Ihnen
die Timerprogrammierung erklärte. Damals
hatten  wir  festgestellt, daß die Timer
der CIAs Interrupts auslösen können. Bei
CIA1 waren das IRQs, bei CIA2 die  NMIs.
Dabei konnte man verschiedene Ereignisse
als  Timertrigger  einstellen. Im Regel-
fall war das  der  Systemtakt;  bei  der
Timerkopplung  war  es der Unterlauf von
Timer A. Und  nun  kommts:  wir  konnten
ebenso  ein  Signal  an  der CNT-Leitung
einer CIA als  Timertrigger  einstellen.
Und  genau  das ist der Punkt an dem wir
ansetzen wollen.                        
Genauer gesagt wird ein Timer,  wenn  er
die  CNT-Leitung  als  Timertrigger pro-
grammiert hat, immer dann um 1 herunter-
gezählt,  wenn  an  der CNT-Leitung eine
steigende Flanke anliegt. Wenn also  der
Pegel an dieser Leitung gerade von 0 auf
1  umspringt. Danach nicht mehr, solange
die Leitung auch auf  1  liegen  bleiben
sollte. Sie muß erst wieder auf 0 abfal-
len, damit der  Timer  durch  eine  neue
Flanke  ein weiteres Mal erniedrigt wer-
den kann. Vergleichen wir das einmal mit
den Signalen, die uns die  Maus  liefert
(letzten  Monat hatte ich das ja genauer
erklärt), so stellen wir fest,  daß  die
Maussignale auch immer von 0 auf 1 wech-
seln, egal ob es nun  das  H-,  HQ-,  V-
oder VQ-Signal ist. Wir können also die-
se Signale als  Timertrigger  verwenden,
und  zwar  so,  daß der Timer immer alle
Flanken der Maus mitzählt. Dadurch  kön-
nen wir genau erfahren, um wieviele Ein-
heiten die Maus bewegt wurde! Das einzi-
ge  Problem  dabei  ist die Richtungsbe-
stimmung, weil ja in  beiden  Richtungen
dieselben    Signale    erzeugt   werden
(beschränkt man sich auf nur EIN Signal,
z.B. das H-Signal). Das heißt,  daß  wir
bei  JEDER  Bewegung,  die  stattfindet,
auch das entsprechende Quadrature-Signal
überprüfen müssen um die genaue Richtung
bestimmen zu können.  Das  reine  Zählen
der  Impulse nutzt uns also nichts, den-
noch reicht es zum Auslösen eines Inter-
rupts bei jeder Bewegung.               
Wenn  wir  einen  Timer  nämlich mit dem
Wert 0 initialisieren, genügt ein einzi-
ger Impuls von der CNT-Leitung, um einen
Interrupt  auszulösen.  Dieser  muß  nun
feststellen,  welche   Bewegungsrichtung
ausgeführt wurde. Der Witz ist, daß die-
se Abfrage sogar noch einfacher ist, als
die von der ersten und  zweiten  Version
von  AMIGA-MAUS.  Weil wir nämlich nicht
zwei zeitlich voneinander versetzte Sig-
nale  überprüfen  müssen.  Zur  besseren
Erläuterung will  ich  Ihnen  nocheinmal
die Signalfolgen der Bewegungsrichtungen
auflisten:                              
Linksbewegung :  H  - ...11001100...    
                 HQ -    10011001       
                         ↑   ↑          
                         Interrupt      
Rechtsbewegung:  H  - ...11001100...    
                 HQ -    01100110       
                         ↑   ↑          
                         Interrupt      
Gehen wir nun davon  aus,  daß  wir  das
H-Signal  an  der  CNT-Leitung  anliegen
haben, und daß einer der Timer der dazu-
gehörigen  CIA diese Leitung als Trigger
hat und zudem mit 0  initialisiert  ist,
so  wird jedesmal, wenn das H-Signal auf
1 springt ein Interrupt ausgelöst,  weil
der Timer unterläuft. Diese Stellen habe
ich in obiger Auflistung markiert ("↑").
Wenn  Sie  genauer hinsehen, so erkennen
Sie, daß das HQ-Signal bei einer  Links-
bewegung  zum  Zeitpunkt  des Interrupts
immer 1, bei einer Rechtsbewegung  immer
0  ist.  Um nun die Bewegungsrichtung zu
bestimmen  brauchen  wir  lediglich  das
HQ-Signal  an einem der Porteingänge von
PortB am Userport anzuschließen und  bei
Auftreten  eines  Interrupts auszulesen.
Ist es 0, so müssen  wir  den  Mauspfeil
nach  rechts  bewegen,  ist es 1, so muß
der Mauspfeil nach links.  Wir  brauchen
also noch nicht einmal das letzte Signal
zur   Bestimmung  heranzuziehen.  Ebenso
wird übrigens mit den vertikalen  Signa-
len  verfahren.  Hierbei  liegt  das  V-
Signal dann an der  anderen  CNT-Leitung
an.  Für unser Beispiel habe ich die Be-
legungen wievolgt belegt:               
* V-Signal  an CNT1 - löst also IRQs aus
  (weil an CIA1).                       
* H-Signal  an CNT2 - löst also NMIs aus
  (weil an CIA2).                       
* VQ und HQ wie bei Adapterstecker1     
Bei den V-Signalen müssen wir noch etwas
beachten:  Da  der  Systeminterrupt über
einen  Systemtaktgetriggerten  Timer   A
läuft,  und wir diesen ja weiterbenutzen
möchten, müssen wir die  Auswertung  des
V-Signals  über  Timer  B programmieren.
Wenn jetzt ein IRQ auftritt,  so  müssen
wir  erst  anhand  der gesetzten Bits im
"Interrupt-Control-Register" (ICR) fest-
stellen,  welcher  Timer  der Interrupt-
auslöser war. War es Timer  A,  so  wird
auf den Systeminterrupt weiterverzweigt,
war  es Timer B, so wird auf die Abfrage
der Vertikalbewegung gesprungen.        
Ähnlich verhält sich  dies  bei  den  H-
Signalen.  Weil  wir  die  Maustasten ja
ebenfalls noch Abfragen  wollen,  müssen
wir den zweiten freien Timer der NMI-CIA
zyklische  Interrupts  auslösen  lassen,
die in regelmäßigen Abständen  die  Mau-
stasten abfragen. Der Einfachheit halber
habe  ich die Horizontalbewegungsabfrage
ebenfalls über Timer B der CIA2 program-
miert,  weshalb wir also Timer A zur Ab-
frage der Maustasten benutzen wollen.   
Valid HTML 4.0 Transitional Valid CSS!