Magic Disk 64

home to index to text: MD9109-KURSE-CIA_TEIL_2.txt
MD9109-KURSE-CIA_TEIL_2.hires.png

Ich möchte Ihnen nun die einzelnen Signale 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 werden (+5 V), 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 kennengelernt, 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 interaktiven seriellen Datenübertragung benutzt und sollen uns ebenfalls nachher noch beschäftigen.

* Die Leitungen PC2( Pin 8) und FLAG2( Pin B) sind negierte Signale ( deshalb auch der Strich über den beiden Worten) . 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 angeschlossen ist. Dieses Signal stammt von der Portleitung 3, Port A ( PA3) der CIA2 .

* An den Pins 10 und 11 liegt eine Wechselspannung von 9 Volt an. Da es sich um Wechselspannung handelt benötigt man natürlich 2 Anschlüsse ( Wechselspannung wird im Gegensatz zu Gleichspannung 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 Portleitung, nämlich das 2 . Bit von Port A. Auch diese Leitung kann als I/ O- Leitung genutzt werden ( z. B. für Steuersignale einer Parallelschnittstelle) Soviel also zu den Leitungen am Userport. Wie Sie sehen bedient Haputsächlich die CIA2 den Datenverkehr an dieser Schnittstelle. Von CIA1 finden wir nur zwei Leitungen ( CNT1 und SP1) . Doch gerade 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 unterbinden. 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 ungenutzt, 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 Userport 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 wiefolgt:

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 Pinnummern versehen sein, so daß man keine Fehler machen kann. Achten Sie aber bitte 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 diesem 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 Joyports des C64 herausschauen!
Wenn dann alles geklappt hat können Sie Ihren Adapterstecker ausprobieren. Stekken Sie ihn am Userport, bei abgeschaltetem Rechner, ein ( bitte wieder darauf achten, daß Sie ihn nicht verkehrt hineinstecken, 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 benutzen. 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 Programm kann mit der linken UND - im Gegensatz zu unserer alten Abfrage - mit der rechten Maustaste abgebrochen werden. 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 Signal 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 jedoch, 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 Routine, die etwas anderes tun soll als die Maus abzufragen, die Abfrage unterbrochen werden. Und das ist verbunden mit hohem organisatorischem Aufwand.
Deshalb wollen wir nun versuchen, eine Abfrage über Interrupts zu programmieren. Es IST möglich - ich habe mir da eine pfiffige Routine für Sie ausgedacht.
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 Regelfall 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 programmiert hat, immer dann um 1 heruntergezä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 abfallen, damit der Timer durch eine neue Flanke ein weiteres Mal erniedrigt werden 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 wechseln, egal ob es nun das H-, HQ-, Voder VQ-Signal ist. Wir können also diese Signale als Timertrigger verwenden, und zwar so, daß der Timer immer alle Flanken der Maus mitzählt. Dadurch können wir genau erfahren, um wieviele Einheiten die Maus bewegt wurde! Das einzige 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, dennoch reicht es zum Auslösen eines Interrupts bei jeder Bewegung.
Wenn wir einen Timer nämlich mit dem Wert 0 initialisieren, genügt ein einziger Impuls von der CNT-Leitung, um einen Interrupt auszulösen. Dieser muß nun feststellen, welche Bewegungsrichtung ausgeführt wurde. Der Witz ist, daß diese 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 Signale ü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 dazugehö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 Linksbewegung 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 Signalen verfahren. Hierbei liegt das V-Signal dann an der anderen CNT-Leitung an. Für unser Beispiel habe ich die Belegungen 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) feststellen, welcher Timer der Interruptauslö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 Maustasten abfragen. Der Einfachheit halber habe ich die Horizontalbewegungsabfrage ebenfalls über Timer B der CIA2 programmiert, weshalb wir also Timer A zur Abfrage der Maustasten benutzen wollen.

Valid HTML 4.0 Transitional Valid CSS!