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.