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 Rechtsbewegung 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 Steuerroutine. 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 unter 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 gegebenenfalls 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ällig gerade alle auf 0) und somit die
Tastaturabfrage stört ( wie wir wissen
benutzt diese ja die selben Datenregister der CIA wie die Joyports) .
Wenn Sie also das Beispielprogram
" AMIGA-MAUS1" auf dieser MD ausprobieren wollen, sollten Sie immer daran 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 Maussignal 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 Signaländerungen von Bedeutung, weshalb
wir prüfen müssen, ob das neu gelesene Signal nun gleich, oder verschie- den vom letzten Signal ist. Bei
Gleichheit wird der Wert einfach ignoriert 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 Joysick auch, einen 9- poligen Gameportstecker, dessen Signale sich glücklicherweise so auf die 9 Pins verteilen, 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 Maustaste 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 einfacher, weil dieser Port schon von
der Tastaturabfrage her auf " Eingang" geschaltet ist.
Die benötigten Signale finden wir an
folgenden Bitpositionen im Datenregister A:
Bit Signal
0 V 1 H 2 VQ 3 HQ 4 Linke Maustaste
Kommen wir nun zu unserem Beispielprogramm " 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 Programms:
**************************************** 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