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