Magic Disk 64

home to index to html: MD9108-KURSE-CIA_TEIL_3.html
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



Valid HTML 4.0 Transitional Valid CSS!