home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / assembler-kurs / listings / listing3c4.s < prev    next >
Text File  |  1977-12-31  |  6KB  |  193 lines

  1.  
  2. ; Listing3c4.s    ; BALKEN, DER SINKT, ERSTELLT MIT EINEM MOVE&WAIT DES COPPER
  3.         ; (UM IHN ZUM SINKEN ZU BRINGEN RECHT MAUSTASTE)
  4.  
  5. ;    In diesem Listing wird ein schattierter Balken aus 10 Wait sinken.
  6. ;    Die Differenz zu Listing3c3.s liegt darin, daß hier nur ein
  7. ;    Label verwendet wird, und dann mit Offsets gearbeitet wird.
  8.  
  9.  
  10.     SECTION VerlaufCOP,CODE    ; auch Fast ist    OK
  11.  
  12. Anfang:
  13.     move.l    4.w,a6        ; Execbase in a6
  14.     jsr    -$78(a6)    ; Disable - stoppt das Multitasking
  15.     lea    GfxName,a1  ; Adresse des Namen der zu öffnenden Library in a1
  16.     jsr    -$198(a6)   ; OpenLibrary, Routine der EXEC, die Libraris
  17.                 ; öffnet, und als Resultat in d0 die Basisadresse
  18.                 ; derselben Bibliothek liefert, ab welcher
  19.                 ; die Offsets (Distanzen) zu machen sind
  20.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  21.     move.l    d0,a6
  22.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  23.                   ; des Betriebssystemes (immer auf $26 nach
  24.                     ; GfxBase)
  25.     move.l    #COPPERLIST,$dff080  ; COP1LC - "Zeiger" auf unsere COP
  26.                      ; (deren Adresse)
  27.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  28. mouse:    
  29.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  30.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  31.  
  32.     btst    #2,$dff016    ; POTINP - Rechte Maustaste gedrückt?
  33.     bne.s    Warte        ; Wenn nicht, führe BEWEGECOPPER nicht aus
  34.  
  35.     bsr.s    BewegeCopper    ; Diese Subroutine läßt das WAIT sinken!
  36.                 ; Sie wird einmal pro Frame ausgeführt.
  37.  
  38. Warte:
  39.     cmpi.b    #$ff,$dff006    ; VHPOSR:
  40.                ; Sind wir noch auf $FF? Wenn ja, warte auf die
  41.     beq.s    Warte       ; nächste Zeile (00). Ansonsten wird BewegeCopper
  42.  
  43.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  44.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  45.  
  46.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  47.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  48.  
  49.     move.l    4.w,a6
  50.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  51.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  52.                 ; (Libraries werden geöffnet UND geschlossen!!)
  53.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  54.     rts
  55.  
  56. ;    Mit dieser Routine bewege ich einen Balken aus 10 Wait nach unten
  57.  
  58. BewegeCopper:
  59.     LEA    BALKEN,a0    ; in a0 kommt die Adresse von Balken
  60.     cmpi.b    #$fc,8*9(a0)    ; kontrolliere das letzt Wait, das den
  61.     beq.s    Beendet     ; untersten Teil des Balken definiert
  62.  
  63.     addq.b    #1,(a0)       ; WAIT 1 geändert (indirekt, ohne Distanz)
  64.     addq.b    #1,8(a0)   ; nun ändern wir die anderen Wait: das Offset
  65.     addq.b    #1,8*2(a0) ; zwischen einem Wait und dem anderen beträgt
  66.     addq.b    #1,8*3(a0) ; 8 Byte, denn dc.w $xx07,$FFFE,$180,$xxxx
  67.     addq.b    #1,8*4(a0) ; ist ein Long, und wenn wir also ab der Adrsse
  68.     addq.b    #1,8*5(a0) ; des ersten Wait ein Offset von 8 Byte machen,
  69.     addq.b    #1,8*6(a0) ; dann ändern wir das folgende dc.w $xx07,$FFFE.
  70.     addq.b    #1,8*7(a0) ; Hier müßen wir alle 9 Wait des Balkens ändern
  71.     addq.b    #1,8*8(a0) ; um ihn zum Sinken zu bringen!
  72.     addq.b    #1,8*9(a0) ; letztes Wait! (das BALKEN10 des vorigen Listings)
  73.  
  74.  
  75. Beendet:
  76.     rts    ; P.S: Mit diesem RTS kehren wir zum Mouse-Zyklus zurück,
  77.         ; der das Timing übernimmt
  78.  
  79. ;    Bemerkung: * steht für "multipliziere", / für "dividiere"
  80.  
  81.  
  82.  
  83. ;    DATEN...
  84.  
  85.  
  86. GfxName:
  87.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  88.                     ; Speicher zu geben, verwenden wir
  89.                     ; immer das dc.b und setzen sie
  90.                     ; unter "" oder ´´, Abschluß mit ,0
  91.  
  92.  
  93. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  94.     dc.l    0  ; ab hier werden die Offsets gemacht
  95.  
  96.  
  97.  
  98. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  99.     dc.l    0    ; Betriebssystemes
  100.  
  101.  
  102.     SECTION MyMagicCop,DATA_C ; Dieser Befehl veranlaßt das Betriebssystem,
  103.                 ; das folgende Datensegment in die CHIP-RAM
  104.                 ; zu laden, obligatorisch.
  105.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  106.  
  107. COPPERLIST:
  108.     dc.w    $100,$200    ; BPLCON0 - nur Hintergrundfarbe
  109.     dc.w    $180,$000    ; COLOR0 - Beginne die Cop mit Farbe SCHWARZ
  110.  
  111. BALKEN:
  112.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile  $79
  113.     dc.w    $180,$300    ; COLOR0 - Beginne den roten BALKEN: Rot auf 3
  114.     dc.w    $7a07,$FFFE    ; WAIT - nächste Zeile
  115.     dc.w    $180,$600    ; COLOR0 - Rot a 6
  116.     dc.w    $7b07,$FFFE
  117.     dc.w    $180,$900    ; Rot auf 9
  118.     dc.w    $7c07,$FFFE
  119.     dc.w    $180,$c00    ; Rot auf 12
  120.     dc.w    $7d07,$FFFE
  121.     dc.w    $180,$f00    ; Rot auf 15 (al massimo)
  122.     dc.w    $7e07,$FFFE
  123.     dc.w    $180,$c00    ; Rot auf 12
  124.     dc.w    $7f07,$FFFE
  125.     dc.w    $180,$900    ; Rot auf  9
  126.     dc.w    $8007,$FFFE
  127.     dc.w    $180,$600    ; Rot auf  6
  128.     dc.w    $8107,$FFFE
  129.     dc.w    $180,$300    ; Rot auf  3
  130.     dc.w    $8207,$FFFE
  131.     dc.w    $180,$000    ; Farbe SCHWARZ
  132.  
  133.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  134.  
  135.     end
  136.  
  137. Um den Balken sinken zu lassen, müßen wir nur die Copperlist verändern, in
  138. diesem Beispiel alle Wait, die den Balken  zusammensetzen.  Geändert  wird
  139. das erste Byte, also das, das die vertikale Zeile definiert:
  140.  
  141. BALKEN:
  142.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile  $79
  143.     dc.w    $180,$300    ; COLOR0 - Beginne den roten BALKEN: Rot auf 3
  144.     dc.w    $7a07,$FFFE    ; WAIT - nächste Zeile
  145.     dc.w    $180,$600    ; COLOR0 - Rot a 6
  146.     ...
  147.  
  148. Wenn man nun ein Label vor dieses Byte gibt, ändert man dieses, indem  man
  149. auf  das Label selbst zugreift, hier BALKEN. Aber unser Balken besteht aus
  150. 9 wait+color0, deswegen müßen wir alle 9 verändern, wenn wir  ihn  bewegen
  151. wollen.  Verändert  werden  natürlich  nur  die  Wait,  die  Color0  (dc.w
  152. $180,$xxx) bleiben unverändert. Um alle 9 Wait zu erreichen, ohne  überall
  153. Labels  zu  setzen,  verwenden  wir Offsets. Das geht auch schneller. Dazu
  154. geben wir in ein Register (a0) die Adresse des  ersten  Wait,  und  ändern
  155. alle anderen durch Adressierungsdistanzen (Offset):
  156.  
  157.     LEA    BALKEN,a0
  158.  
  159.     cmp.i    #$fc,8*9(a0)    ; kontrolliere das letzt Wait, das den
  160.     beq.s    Beendet     ; untersten Teil des Balken definiert
  161.  
  162.     addq.b    #1,(a0)     ; ändere BALKEN:
  163.     addq.b    #1,8(a0)    ; ändere das Byte, das 2 Long nach BALKEN: ist
  164.     addq.b    #1,8*2(a0)    ; ändere das Byte, das 4 Long nach BALKEN: ist
  165.     addq.b    #1,8*3(a0)    ; ändere das Byte, das 6 Long nach BALKEN: ist
  166.     addq.b    #1,8*4(a0)
  167.     addq.b    #1,8*5(a0)
  168.     addq.b    #1,8*6(a0)
  169.     addq.b    #1,8*7(a0)
  170.     addq.b    #1,8*8(a0)
  171.     addq.b    #1,8*9(a0)
  172. Beendet:
  173.     rts    ; P.S: Mit diesem RTS kehren wir zum Mouse-Zyklus zurück,
  174.     
  175. Bemerkung: Probiert ein "D BewegeCopper", und verifiziert daß die 8*2,
  176. 8*3... als
  177.  
  178.     ADDQ.B    #1,$8(A0)
  179.     ADDQ.B    #1,$10(A0)
  180.     ADDQ.B    #1,$18(A0)
  181.     ADDQ.B    #1,$20(A0)
  182.     ADDQ.B    #1,$28(A0)
  183.  
  184. assembliert werden, also mit dem Resultat aus 8*2 (=10 -> $10), 8*3 ($18)...
  185.  
  186. Als letzte Änderung, probiert das $fc in der Zeile
  187.  
  188.     cmpi.b    #$fc,8*9(a0)
  189.  
  190. durch einen kleineren Wert zu ersetzen, und kontrolliert,  ob  der  Balken
  191. auch wirklich nur bis zur angegebenen Zeile sinkt.
  192.  
  193.