Durch eine Exklusiv-Oder-Verknüpfung der
Signale OldH (entspricht dem alten Wert
von H, wobei H=HQ war) und H erhält man
folgende Aussagetabelle:
OldH H Ergebnis
------------------
0 0 0
0 1 1
1 0 1
1 1 0
Vergleichen wir nun diese Werte mit den
oben aufgezählten Richtungsbedingungen,
so sieht man, daß das Ergebnis immer
dann 0 wird, wenn eine Linksbewegung
durchgeführt werden muß, und ebenso daß
es immer 1 wird, wenn eine Rechtsbewe-
gung durchzuführen ist. Dadurch haben
wir uns eine Menge Vergleichsbefehle
gespart. Wir müssen jetzt lediglich das
Ergebnis der EOR-Operation prüfen, um
die Bewegungsrichtung zu bestimmen. Ent-
sprechend wird mit dem Vertikal-Signal
verfahren.
Kommen wir nun zu der fertigen Steuer-
routine. Hierbei müssen wir auf vier
wichtige Dinge achten:
1) Das Programm zur Mausabfrage MUSS in
jedem Fall in der Hauptschleife des
Rechners laufen, da sich die Signale
der Maus jederzeit ändern können.
Eine zyklische Abfrage aus dem IRQ,
so wie das z.B. beim Joystick möglich
ist, wäre also undenkbar, da sie un-
ter Umständen das eine oder andere
Signal verpassen würde und somit die
Interpretation desselben von unserer
Mausabfrage falsch sein könnte. Die
Maus würde ruckeln und sich gegebe-
nenfalls sogar in die umgekehrte
Richtung bewegen.
2) Desweiteren sollte ich Sie darauf
aufmerksam machen, daß die Tastatur
in der Zeit, in der die Maus ange-
schlossen ist nicht zu benutzen ist,
da sie IMMER ein Signal sendet (es
sei denn V, VQ, H und HQ sind zufäl-
lig gerade alle auf 0) und somit die
Tastaturabfrage stört (wie wir wissen
benutzt diese ja die selben Datenre-
gister der CIA wie die Joyports).
Wenn Sie also das Beispielprogram
"AMIGA-MAUS1" auf dieser MD auspro-
bieren wollen, sollten Sie immer da-
ran denken, das Programm ZUERST zu
laden und mit RUN zu starten und dann
erst die Maus einzustecken!
3) Durch die ständige Abfrage müssen wir
ebenfalls daran denken, das Maussig-
nal zu "entprellen". Das heißt, daß
wir prüfen müssen, ob die Maus nun
gerade bewegt wird oder nicht. In
jedem Fall werden wir nämlich ein und
dasselbe Signal mehrmals lesen. Für
uns sind jedoch immer nur die Sig-
naländerungen von Bedeutung, weshalb
wir prüfen müssen, ob das neu gelese-
ne Signal nun gleich, oder verschie-
den vom letzten Signal ist. Bei
Gleichheit wird der Wert einfach ig-
noriert und wieder zur Leseschleife
zurückverzweigt.
4) Als Letztes will ich Ihnen nun noch
die Belegung der Maussignale erkl-
ären. Die Maus hat ja, wie der Joy-
sick auch, einen 9-poligen Gameport-
stecker, dessen Signale sich glückli-
cherweise so auf die 9 Pins vertei-
len, daß wir sie (fast) alle über die
CIA abfragen können. Die Belegung ist
hierbei wiefolgt:
Pin Funktion
------------
1 V-Impluse
2 H-Impulse
3 VQ-Impulse
4 HQ-Impulse
5 Knopf 3 (unbenutzt, da nicht vor-
handen)
6 Knopf 1 (links)
7 +5 Volt (Betriebsspannung)
8 GND (Masse)
9 Knopf 2 (rechts)
Die Pins 1-4 und 6 der Joyports sind
ja, wie Sie aus dem letzten Kursteil
noch wissen sollten, mit den Bits 0-4
der Datenports der CIA1 verbunden.
Demnach können wir also problemlos
die Richtung der Maus abfragen, sowie
die linke Maustaste. Die rechte Mau-
staste hängt an einem der A/D-Wandler
des SID und soll uns deshalb hier
nicht interessieren.
Der Einfachheit halber habe ich die
Abfrage über Joyport2 programmiert,
die Signale der Maus erscheinen also
im Datenregister A der CIA1 (Reg.0 -
Adresse $DC00). Dies ist deshalb ein-
facher, weil dieser Port schon von
der Tastaturabfrage her auf "Eingang"
geschaltet ist.
Die benötigten Signale finden wir an
folgenden Bitpositionen im Datenregi-
ster A:
Bit Signal
----------
0 V
1 H
2 VQ
3 HQ
4 Linke Maustaste
Kommen wir nun zu unserem Beispielpro-
gramm "AMIGA-MAUS1", das zusammen mit
seinem Quellcode ("AMIGA-MAUS1.SRC") auf
dieser MD zu finden ist. Starten Sie es
bitte mit RUN und schließen Sie dann
eine orginal AMIGA-Maus am Joyport2 an
um den Mauspfeil über den Bildschirm zu
bewegen. Mit der linken Maustaste wird
das Programm abgebrochen.
Hier nun die Dokumentation des Pro-
gramms:
****************************************
start lda #00 Bildschirm-
sta 53280 farben
lda #11 auf schwarz/grau
sta 53281 setzen.
lda #<(text) Text ab Label
ldy #>(text) "TEXT"
jsr strout ausgeben.
lda #01 Spritefarbe auf
sta vic+39 weiß setzen.
lda #150 Sprite in den
sta vic Bildschirm
sta vic+1 positionieren.
lda #36 Sprite-Pointer
sta 2040 setzen.
lda #01 Und Sprite 0
sta vic+21 einschalten
****************************************
loop2 lda $dc00 Joyport2 lesen
eor #$ff und invertieren
and #$1f Bits 0-4 isolie-
ren
cmp #16 Vergleiche mit 1
bcc l1 Wenn kleiner,
dann Bewegung
rts Sonst wurde Knop
gedrückt, also
Ende
***
l1 ldx #00 Alle
stx h Puls-
stx hq Register
stx v werden
stx vq gelöscht
lsr V-Bit in V-Reg
rol v hineinrollen
lsr H-Bit in H-Reg
rol h hineinrollen
lsr VQ-Bit in VQ-Reg
rol vq hineinrollen
lsr HQ-Bit in HQ-Reg
rol hq hineinrollen
****************************************
horizon lda h H mit HQ
eor hq verknüpfen
cmp hmem und prüfen, ob
gleich altem Wer
beq vertical Ja, also entprel
len
sta hmem Sonst merken und
cmp #00 prüfen, ob =0
bne l2 Nein, also Bewe-
gung ausführen
lda h Sonst war H=HQ,
deshalb Bitmuste
sta oldh in OLDH merken
jmp vertical und weiter
***
l2 lda oldh OLDH und H
verknüfpfen,
eor h um die Richtung
herauszufinden
bne l7 =1, also Rechts!
jmp moveleft =0, also Links!
l7 jmp moveright
****************************************
vertical lda v V mit VQ
eor vq verknüpfen
cmp vmem und prüfen, ob
gleich altem Wer
beq loop2 Ja, also entprel
len
sta vmem Sonst merken und
cmp #00 prüfen, ob =0
bne l8 Nein, also Bewe-
gung ausführen
lda v Sonst war V=VQ,
deshalb Bitmuste
sta oldv in OLDV merken
jmp loop2 und zurück
***
l8 lda oldv OLDV und V
verknüpfen
eor v um die Richtung
herauszufinden
bne l9 =1, also Hoch!
jmp moveup =0, also Runter!
l9 jmp movedown
****************************************
Zum besseren Verständnis noch einig
Erklärungen zum Source-Code:
1) Die Routinen MOVELEFT, MOVERIGHT, MO
VEUP und MOVEDOWN sind Unterroutinen
die das Sprite 0, das den Mauspfei
repräsentiert, entprechend der gefor
derten Richtung bewegen. Ich habe si
hier nicht aufgeführt, da sie nicht
mit der CIA zu tun haben. Sie könne
Sie sich jedoch im Source-Code vo
"AMIGA-MAUS1" ansehen.
2) Die Labels H, HQ, V, VQ, OLDH, OLDV
HMEM, und VMEM stehen für Speicherzel
len, in denen bestimmte Werte zwi
schengespeichert werden.
3) Beim Vergleich, ob H gleich HQ (bzw.
gleich VQ) ist habe ich ebenfalls di
EOR-Verknüfung benutzt, da so das Ent
prellen der Maussignale vereinfach
wird. HMEM (bzw. VMEM) ändern sic
immer abwechselnd von 0 auf 1 und um
gekehrt.
4) Ab dem Label "TEXT" steht der Text
der beim Aufruf von "AMIGA-MAUS1" aus
gedruckt wird.
5) Beachten Sie bitte, daß die Eingangs
werte immer invertiert werden, da de
CIA sie uns invertiert im Datenregi
ster angibt (sollten Sie noch vo
letztem Kursteil her wissen)
Desweiteren wird der Wert dann noc
AND-Verknüpft um die Bits 0-4 zu iso
lieren. Dadurch wird es möglich di
Maustaste durch einen einfachen Ver
gleich mit dem Wert 16 abzufragen
Sonst würde das Programm nämlich auc
bei dem Druck auf eine Taste, die di
Bits über dem 4. Bit setzt abbrechen!
Das war es dann mal wieder für diese
Monat. Behalten Sie die AMIGA-Maus, je
doch noch bis nächsten Monat. Wir werde
uns dann um den Userport kümmern und ein
Mausabfrage programmieren, die die Nach
teile der oben aufgeführten (nämlich da
die Tastatur unbenutzbar ist, und da
nicht aus dem Interrupt heraus abgefrag
werden kann) verbessert.
Bis dahin, wünsche ich ein "funny Mou
sing-Around",
Ihr Uli Basters (ub