Magic Disk 64

home to index to text: MD9108-KURSE-CIA_TEIL_3.txt

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

Valid HTML 4.0 Transitional Valid CSS!