
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.