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

  1.  
  2. ; Listing3c3.s    ; BALKEN, DER SINKT, ERSTELLT MIT EINEM MOVE&WAIT DES COPPER
  3.         ; (UM IHN ZUM SINKEN ZU BRINGEN RECHTE MAUSTASTE)
  4.  
  5.  
  6.  
  7.     SECTION VerlaufCOP,CODE    ; auch Fast ist    OK
  8.  
  9. Anfang:
  10.     move.l    4.w,a6         ; Execbase in a6
  11.     jsr    -$78(a6)     ; Disable - stoppt das Multitasking
  12.     lea    GfxName,a1   ; Adresse des Namen der zu öffnenden Library in a1
  13.     jsr    -$198(a6)    ; OpenLibrary, Routine der EXEC, die Libraris
  14.                  ; öffnet, und als Resultat in d0 die Basisadresse
  15.                 ; derselben Bibliothek liefert, ab welcher
  16.                 ; die Offsets (Distanzen) zu machen sind
  17.     move.l    d0,GfxBase    ; speichere diese Adresse in GfxBase
  18.     move.l    d0,a6
  19.     move.l    $26(a6),OldCop    ; hier speichern wir die Adresse der Copperlist
  20.                   ; des Betriebssystemes (immer auf $26 nach
  21.                    ; GfxBase)
  22.     move.l    #COPPERLIST,$dff080  ; COP1LC - "Zeiger" auf unsere COP
  23.                     ; (deren Adresse)
  24.     move.w    d0,$dff088        ; COPJMP1 - Starten unsere COP
  25. mouse:    
  26.     cmpi.b    #$ff,$dff006    ; VHPOSR - sind wir bei Zeile 255 angekommen?
  27.     bne.s    mouse        ; Wenn nicht, geh nicht weiter
  28.  
  29.     btst    #2,$dff016    ; POTINP - Rechte Maustaste gedrückt?
  30.     bne.s    Warte        ; Wenn nicht, führe BEWEGECOPPER nicht aus
  31.  
  32.     bsr.s    BewegeCopper    ; Diese Subroutine läßt das WAIT sinken!
  33.                 ; Sie wird einmal pro Frame ausgeführt.
  34.  
  35.  
  36. Warte:
  37.     cmpi.b    #$ff,$dff006    ; VHPOSR:
  38.                  ; Sind wir noch auf $FF? Wenn ja, warte auf die
  39.     beq.s    Warte         ; nächste Zeile (00). Ansonsten wird BewegeCopper
  40.  
  41.  
  42.     btst    #6,$bfe001    ; linke Maustaste gedrückt?
  43.     bne.s    mouse        ; wenn nicht, zurück zu mouse:
  44.  
  45.     move.l    OldCop(PC),$dff080    ; COP1LC - "Zeiger" auf die Orginal-COP
  46.     move.w    d0,$dff088        ; COPJMP1 - und starten sie
  47.  
  48.     move.l    4.w,a6
  49.     jsr    -$7e(a6)    ; Enable - stellt Multitasking wieder her
  50.     move.l    GfxBase(PC),a1    ; Basis der Library, die es zu schließen gilt
  51.                 ; (Libraries werden geöffnet UND geschlossen!!)
  52.     jsr    -$19e(a6)    ; Closelibrary - schließt die Graphics lib
  53.     rts    
  54.  
  55. ;    Mit dieser Routine bewege ich einen Balken aus 10 Wait nach unten
  56.  
  57.  
  58.  
  59. BewegeCopper:
  60.     cmpi.b    #$fc,BALKEN    ; sind wir bei Zeile $fc angekommen?
  61.     beq.s    Beendet        ; wenn ja, dann sind wir unten und stoppen
  62.     addq.b    #1,BALKEN    ; WAIT 1 verändert
  63.     addq.b    #1,BALKEN2    ; WAIT 2 verändert
  64.     addq.b    #1,BALKEN3    ; WAIT 3 verändert
  65.     addq.b    #1,BALKEN4    ; WAIT 4 verändert
  66.     addq.b    #1,BALKEN5    ; WAIT 5 verändert
  67.     addq.b    #1,BALKEN6    ; WAIT 6 verändert
  68.     addq.b    #1,BALKEN7    ; WAIT 7 verändert
  69.     addq.b    #1,BALKEN8    ; WAIT 8 verändert
  70.     addq.b    #1,BALKEN9    ; WAIT 9 verändert
  71.     addq.b    #1,BALKEN10    ; WAIT 10 verändert
  72. Beendet:
  73.     rts
  74.  
  75.  
  76. ;    DATEN...
  77.  
  78.  
  79. GfxName:
  80.     dc.b    "graphics.library",0,0    ; Bemerkung: um Charakter in den
  81.                     ; Speicher zu geben, verwenden wir
  82.                     ; immer das dc.b und setzen sie
  83.                     ; unter "" oder ´´, Abschluß mit ,0
  84.  
  85.  
  86. GfxBase:       ; Hier hinein kommt die Basisadresse der graphics.library,
  87.     dc.l    0  ; ab hier werden die Offsets gemacht
  88.  
  89.  
  90.  
  91. OldCop:         ; Hier hinein kommt die Adresse der Orginal-Copperlist des
  92.     dc.l    0    ; Betriebssystemes
  93.  
  94.  
  95.     SECTION MyMagicCop,DATA_C ; Dieser Befehl veranlaßt das Betriebssystem,
  96.                 ; das folgende Datensegment in die CHIP-RAM
  97.                 ; zu laden, obligatorisch.
  98.                 ; Die Cpperlist MÜSSEN in die CHIP RAM!
  99.  
  100. COPPERLIST:
  101.     dc.w    $100,$200    ; BPLCON0 - nur Hintergrundfarbe
  102.     dc.w    $180,$000    ; COLOR0 - Beginne die Cop mit Farbe SCHWARZ
  103.  
  104. BALKEN:
  105.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile  $79
  106.     dc.w    $180,$300    ; COLOR0 - Beginne den roten BALKEN: Rot auf 3
  107. BALKEN2:
  108.     dc.w    $7a07,$FFFE    ; WAIT - nächste Zeile
  109.     dc.w    $180,$600    ; COLOR0 - Rot a 6
  110. BALKEN3:
  111.     dc.w    $7b07,$FFFE
  112.     dc.w    $180,$900    ; Rot auf 9
  113. BALKEN4:
  114.     dc.w    $7c07,$FFFE
  115.     dc.w    $180,$c00    ; Rot auf 12
  116. BALKEN5:
  117.     dc.w    $7d07,$FFFE
  118.     dc.w    $180,$f00    ; Rot auf 15 (al massimo)
  119. BALKEN6:
  120.     dc.w    $7e07,$FFFE
  121.     dc.w    $180,$c00    ; Rot auf 12
  122. BALKEN7:
  123.     dc.w    $7f07,$FFFE
  124.     dc.w    $180,$900    ; Rot auf  9
  125. BALKEN8:
  126.     dc.w    $8007,$FFFE
  127.     dc.w    $180,$600    ; Rot auf  6
  128. BALKEN9:
  129.     dc.w    $8107,$FFFE
  130.     dc.w    $180,$300    ; Rot auf  3
  131. BALKEN10:
  132.     dc.w    $8207,$FFFE
  133.     dc.w    $180,$000    ; Farbe SCHWARZ
  134.  
  135.     dc.w    $FFFF,$FFFE    ; ENDE DER COPPERLIST
  136.  
  137.     end
  138.  
  139. Um den Balken sinken zu lassen, müßen wir nur die Copperlist verändern, in
  140. diesem  Beispiel  alle  Wait, die den Balken zusammensetzen. Geändert wird
  141. das erste Byte, also das, das die vertikale Zeile definiert:
  142.  
  143. BALKEN:
  144.     dc.w    $7907,$FFFE    ; WAIT - Warte auf Zeile  $79
  145.     dc.w    $180,$300    ; COLOR0 - Beginne den roten BALKEN: Rot auf 3
  146. BALKEN2:
  147.     dc.w    $7a07,$FFFE    ; WAIT - nächste Zeile
  148.     dc.w    $180,$600    ; COLOR0 - Rot a 6
  149.     ...
  150.  
  151. Wenn man nun ein Label vor dieses Byte gibt, ändert man dieses, indem  man
  152. auf das Label selbst zugreift, hier BALKEN:
  153.  
  154. *******************************************************************************
  155.  
  156. Ich rate euch, viele Änderungen vorzunehmen,  auch  die  zufälligsten  und
  157. verwegensten,   um   mit  dem  COPPER  vertraut  zu  werden:  Hier  einige
  158. Ratschläge:
  159.  
  160. Änderung1: Probiert ; vor den ersten fünf ADDQ.b zu geben:
  161.  
  162. ;    addq.b    #1,BALKEN    ; WAIT 1 verändert
  163. ;    addq.b    #1,BALKEN2    ; WAIT 2 verändert
  164. ;    addq.b    #1,BALKEN3    ; WAIT 3 verändert
  165. ;    addq.b    #1,BALKEN4    ; WAIT 4 verändert
  166. ;    addq.b    #1,BALKEN5    ; WAIT 5 verändert
  167.     addq.b    #1,BALKEN6    ; WAIT 6 verändert
  168.     addq.b    #1,BALKEN7    ; WAIT 7 verändert
  169.     ....
  170.  
  171. Es wird einen "Vorhang fällt"-Effekt geben,  denn  der  Untergang  beginnt
  172. hier bei der Mitte des Balkens, und da die letzte Farbe gilt bis sie nicht
  173. geändert wird, in diesem Fall ist  die  letzte  Farbe  vor  dem  Wait  des
  174. unteren  Teiles  des  Balkens  der bis zum Schluß reicht rot, schaut es so
  175. aus, als ob der Balken sich strecken würde bis er am Ende des  Bildschirms
  176. ankommt. (A.d.Ü: !?!?!?). Entfernt die ; und kommt zu Änderung2:
  177.  
  178. Änderung2: Für einen "ZOOM"-Effekt modifiziert folgenderweise:
  179.  
  180.     
  181.     addq.b    #1,BALKEN
  182.     addq.b    #2,BALKEN2
  183.     addq.b    #3,BALKEN3
  184.     addq.b    #4,BALKEN4
  185.     addq.b    #5,BALKEN5
  186.     addq.b    #6,BALKEN6
  187.     addq.b    #7,BALKEN7
  188.     addq.b    #8,BALKEN8
  189.     addq.b    #8,BALKEN9
  190.     addq.b    #8,BALKEN10
  191.  
  192. (Verwendet Amiga+b+c+i)
  193.  
  194. Habt  ihr  verstanden,  wieso  sich  der  Balken  ausdehnt?  Weil, anstatt
  195. gleichzeitig nach unten zu  gehen,  die  verschiedenen  Wait  verschiedene
  196. "Geschwindigkeiten"  haben.  Darum  distanzieren  sich die unteren von den
  197. oberen.
  198.  
  199. Änderung3: Diesmal "dehnen" wir den Balken nicht nach unten,  sondern  von
  200. der Mitte aus:
  201.  
  202.     subq.b    #5,BALKEN
  203.     subq.b    #4,BALKEN2
  204.     subq.b    #3,BALKEN3
  205.     subq.b    #2,BALKEN4
  206.     subq.b    #1,BALKEN5
  207.     addq.b    #1,BALKEN6
  208.     addq.b    #2,BALKEN7
  209.     addq.b    #3,BALKEN8
  210.     addq.b    #4,BALKEN9
  211.     addq.b    #5,BALKEN10
  212.     
  213. Wir  haben  die  ersten  fünf  addq in subq abgeändert, und somit wird der
  214. obere Teil des Balken statt zu sinken steigen. Alles wird ähnlich vor sich
  215. gehen,  wie  beim  Zoom-Effekt, nur eine Hälfte nach oben, die andere nach
  216. unten.
  217.  
  218.  
  219.