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.