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

  1.  
  2. ; Listing7t3.s    Sterne mit verschiedener Geschwindigkeit
  3.  
  4. ;    In diesem Listing machen wir einen Sternenhimmel,
  5. ;    bei dem die Sterne verschiedene Geschwindigkeiten haben
  6.  
  7.         SECTION CipundCop,CODE
  8.  
  9. Anfang:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Name lib
  13.     jsr    -$198(a6)    ; OpenLibrary
  14.     move.l    d0,GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop
  17.  
  18.  
  19.     MOVE.L    #BITPLANE,d0
  20.     LEA    BPLPOINTERS,A1
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25. ;    Pointen auf die Sprites
  26.  
  27.     MOVE.L    #SPRITE,d0        ; Adresse des Sprite in d0
  28.     LEA    SpritePointers,a1    ; Pointer in der Copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     move.l    #COPPERLIST,$dff080    ; unsere COP
  34.     move.w    d0,$dff088        ; START COP
  35.     move.w    #0,$dff1fc        ; NO AGA!
  36.     move.w    #$c00,$dff106        ; NO AGA!
  37.  
  38. mouse:
  39.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  40.     bne.s    mouse
  41.  
  42.     bsr.s    BewegeSterne    ; diese Routine bewegt die Sterne
  43.  
  44. Warte:
  45.     cmpi.b    #$ff,$dff006    ; Zeile 255?
  46.     beq.s    Warte
  47.  
  48.     btst    #6,$bfe001    ; Maus gedrückt?
  49.     bne.s    mouse
  50.  
  51.     move.l    OldCop(PC),$dff080    ; Pointen auf die SystemCOP
  52.     move.w    d0,$dff088        ; starten die alte COP
  53.  
  54.     move.l    4.w,a6
  55.     jsr    -$7e(a6)    ; Enable
  56.     move.l    gfxbase(PC),a1
  57.     jsr    -$19e(a6)    ; Closelibrary
  58.     rts
  59.  
  60. ;    Daten
  61.  
  62. GfxName:
  63.     dc.b    "graphics.library",0,0
  64.  
  65. GfxBase:
  66.     dc.l    0
  67.  
  68. OldCop:
  69.     dc.l    0
  70.  
  71. ; Die Routine, die die Sterne bewegt ist in diesem Beispiel ein bißchen
  72. ; komplexer, aber einfach Anweisung nach Anweisung durchsehen, dann ist
  73. ; es nicht schwierig, sie zu verstehen.
  74. ; Bei jedem STERNEN_LOOP verstellt die Routine 3 Sterne, um genau zu sein
  75. ; einen schnellen, einen langsamen und einen ganz schnellen.
  76.  
  77. BewegeSterne:
  78.     lea    Sprite,A0        ; a0 pointet auf den Sprite
  79. STELLE_LOOP:
  80.  
  81. ; schnelle Sterne (2 Pixel pro Fotogramm)
  82.  
  83.     CMPI.B    #$f0,1(A0)        ; hat der Stern den rechten Rand
  84.                     ; des Bildschirmes erreicht?
  85.     BNE.S    nicht_Rand1        ; nein, dann überspringe
  86.     MOVE.B    #$30,1(A0)        ; ja, dann setz den Stern nach links
  87. nicht_Rand1:
  88.     ADDQ.B    #1,1(A0)        ; vertellt den Sprite um 2 Pixel
  89.     ADDQ.w    #8,A0            ; nächster Stern
  90.  
  91. ; langsame Sterne (1 Pixel pro Fotogramm)
  92.  
  93.     CMPI.B    #$f0,1(A0)        ; hat der Stern den rechten Rand
  94.                     ; des Bildschirmes erreicht?
  95.     BNE.S    nicht_Rand2        ; nein, dann überspringe
  96.     MOVE.B    #$30,1(A0)        ; ja, dann setz den Stern nach links
  97. nicht_Rand2:
  98.     BCHG    #0,3(A0)
  99.     BEQ.S    Gerade
  100.     ADDQ.B    #1,1(A0)        ; verstellt den Sprite um 2 Pixel
  101. Gerade:
  102.     ADDQ.w    #8,A0            ; nächster Stern
  103.  
  104. ; ganz schnelle Sterne (4 Pixel pro Fotogramm)
  105.  
  106.     CMPI.B    #$f0,1(A0)        ; hat der Stern den rechten Rand
  107.                     ; des Bildschirmes erreicht?
  108.     BNE.S    nicht_Rand3        ; nein, dann überspringe
  109.     MOVE.B    #$30,1(A0)        ; ja, dann setz den Stern nach links
  110. nicht_Rand3:
  111.     ADDQ.B    #2,1(A0)        ; verstell den Sprite um 4 Pixel
  112.     ADDQ.w    #8,A0            ; nächster Stern
  113.  
  114.     CMP.L    #SpriteEnd,A0        ; haben wie das Ende erreicht?
  115.     BLO.S    STELLE_LOOP        ; wenn nicht, wiederhole den Loop
  116.     RTS                ; Ende Routine
  117.  
  118.  
  119.     SECTION GRAPHIC,DATA_C
  120.  
  121. COPPERLIST:
  122. SpritePointers:
  123.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  124.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  125.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  126.     dc.w    $13e,0
  127.  
  128.     dc.w    $8E,$2c81    ; DiwStrt
  129.     dc.w    $90,$2cc1    ; DiwStop
  130.  
  131.     dc.w    $92,$38        ; DdfStart
  132.     dc.w    $94,$d0        ; DdfStop
  133.     dc.w    $102,0        ; BplCon1
  134.     dc.w    $104,0        ; BplCon2
  135.     dc.w    $108,0        ; Bpl1Mod
  136.     dc.w    $10a,0        ; Bpl2Mod
  137.  
  138.     dc.w    $100,%0001001000000000    ; Bit 12 an!! 1 Bitplane Lowres
  139.  
  140. BPLPOINTERS:
  141.     dc.w $e0,0,$e2,0    ;erstes    Bitplane
  142.  
  143.     dc.w    $180,$000    ; Color0    ; Hintergrund Schwarz
  144.     dc.w    $182,$123    ; Color1    ; Farbe 1 des Bitplane, die
  145.                         ; in diesem Fall leer ist,
  146.                         ; und deswegen nicht erscheint
  147.  
  148. ; der Sprite verwendet nur eine Farbe, COLOR17
  149.  
  150.     dc.w    $1A2,$ddd    ; COLOR17, - COLOR1 deso Sprite0 - weiß
  151.  
  152.     dc.w    $FFFF,$FFFE    ; Ende der Copperlist
  153.  
  154. ;    -    -    -    -    -    -    -
  155.  
  156. ; Wie ihr sehen könnt wurde dieser Sprite ganz schön oft wiederverwendet,
  157. ; um genau zu sein 127 Mal. Er besteht aus vielen Word-Kontrollpaaren, die
  158. ; von einem $1000,$0000 gefolgt werden, also den Daten, die einen einzelnen
  159. ; Stern ergeben. Die vertikalen Positionen gehen in Zweierschritten, es gibt
  160. ; also einen Stern alle zwei vertikalen Zeilen, bei einer immer anderen
  161. ; horizontalen Position. Die erste Wiederverwertung des Sprite ist
  162. ; $307a,$3100,$1000,$0000
  163. ; die zweite $3220,$3300,$1000,$0000
  164. ; und so weiter. Die verschiedenen VSTART gehen in Schritten zu 2, also $30,
  165. ; $32, $34, $36 ...
  166. ; Die HSTART sind zufällig positioniert ($7a, $20, $c0, $50,...)
  167. ; Die VSTOP befinden sich natürlich eine Zeile nach VSTART ($31, $33, $35,...),
  168. ; da die Sterne ja 1 Pixel hoch sind.
  169. ; Die Routine agiert bei jedem Fotogramm auf alle HSTART, und verstellt
  170. ; somit die Sterne nach vorne.
  171.  
  172. Sprite:
  173.     dc.w    $307A,$3100,$1000,$0000,$3220,$3300,$1000,$0000
  174.     dc.w    $34C0,$3500,$1000,$0000,$3650,$3700,$1000,$0000
  175.     dc.w    $3842,$3900,$1000,$0000,$3A6D,$3B00,$1000,$0000
  176.     dc.w    $3CA2,$3D00,$1000,$0000,$3E9C,$3F00,$1000,$0000
  177.     dc.w    $40DA,$4100,$1000,$0000,$4243,$4300,$1000,$0000
  178.     dc.w    $445A,$4500,$1000,$0000,$4615,$4700,$1000,$0000
  179.     dc.w    $4845,$4900,$1000,$0000,$4A68,$4B00,$1000,$0000
  180.     dc.w    $4CB8,$4D00,$1000,$0000,$4EB4,$4F00,$1000,$0000
  181.     dc.w    $5082,$5100,$1000,$0000,$5292,$5300,$1000,$0000
  182.     dc.w    $54D0,$5500,$1000,$0000,$56D3,$5700,$1000,$0000
  183.     dc.w    $58F0,$5900,$1000,$0000,$5A6A,$5B00,$1000,$0000
  184.     dc.w    $5CA5,$5D00,$1000,$0000,$5E46,$5F00,$1000,$0000
  185.     dc.w    $606A,$6100,$1000,$0000,$62A0,$6300,$1000,$0000
  186.     dc.w    $64D7,$6500,$1000,$0000,$667C,$6700,$1000,$0000
  187.     dc.w    $68C4,$6900,$1000,$0000,$6AC0,$6B00,$1000,$0000
  188.     dc.w    $6C4A,$6D00,$1000,$0000,$6EDA,$6F00,$1000,$0000
  189.     dc.w    $70D7,$7100,$1000,$0000,$7243,$7300,$1000,$0000
  190.     dc.w    $74A2,$7500,$1000,$0000,$7699,$7700,$1000,$0000
  191.     dc.w    $7872,$7900,$1000,$0000,$7A77,$7B00,$1000,$0000
  192.     dc.w    $7CC2,$7D00,$1000,$0000,$7E56,$7F00,$1000,$0000
  193.     dc.w    $805A,$8100,$1000,$0000,$82CC,$8300,$1000,$0000
  194.     dc.w    $848F,$8500,$1000,$0000,$8688,$8700,$1000,$0000
  195.     dc.w    $88B9,$8900,$1000,$0000,$8AAF,$8B00,$1000,$0000
  196.     dc.w    $8C48,$8D00,$1000,$0000,$8E68,$8F00,$1000,$0000
  197.     dc.w    $90DF,$9100,$1000,$0000,$924F,$9300,$1000,$0000
  198.     dc.w    $9424,$9500,$1000,$0000,$96D7,$9700,$1000,$0000
  199.     dc.w    $9859,$9900,$1000,$0000,$9A4F,$9B00,$1000,$0000
  200.     dc.w    $9C4A,$9D00,$1000,$0000,$9E5C,$9F00,$1000,$0000
  201.     dc.w    $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
  202.     dc.w    $A423,$A500,$1000,$0000,$A6FA,$A700,$1000,$0000
  203.     dc.w    $A86C,$A900,$1000,$0000,$AA44,$AB00,$1000,$0000
  204.     dc.w    $AC88,$AD00,$1000,$0000,$AE9A,$AF00,$1000,$0000
  205.     dc.w    $B06C,$B100,$1000,$0000,$B2D4,$B300,$1000,$0000
  206.     dc.w    $B42A,$B500,$1000,$0000,$B636,$B700,$1000,$0000
  207.     dc.w    $B875,$B900,$1000,$0000,$BA89,$BB00,$1000,$0000
  208.     dc.w    $BC45,$BD00,$1000,$0000,$BE24,$BF00,$1000,$0000
  209.     dc.w    $C0A3,$C100,$1000,$0000,$C29D,$C300,$1000,$0000     
  210.     dc.w    $C43F,$C500,$1000,$0000,$C634,$C700,$1000,$0000     
  211.     dc.w    $C87C,$C900,$1000,$0000,$CA1D,$CB00,$1000,$0000     
  212.     dc.w    $CC6B,$CD00,$1000,$0000,$CEAC,$CF00,$1000,$0000
  213.     dc.w    $D0CF,$D100,$1000,$0000,$D2FF,$D300,$1000,$0000     
  214.     dc.w    $D4A5,$D500,$1000,$0000,$D6D6,$D700,$1000,$0000     
  215.     dc.w    $D8EF,$D900,$1000,$0000,$DAE1,$DB00,$1000,$0000     
  216.     dc.w    $DCD9,$DD00,$1000,$0000,$DEA6,$DF00,$1000,$0000     
  217.     dc.w    $E055,$E100,$1000,$0000,$E237,$E300,$1000,$0000     
  218.     dc.w    $E47D,$E500,$1000,$0000,$E62E,$E700,$1000,$0000
  219.     dc.w    $E8AF,$E900,$1000,$0000,$EA46,$EB00,$1000,$0000
  220.     dc.w    $EC65,$ED00,$1000,$0000,$EE87,$EF00,$1000,$0000
  221.     dc.w    $F0D4,$F100,$1000,$0000,$F2F5,$F300,$1000,$0000
  222.     dc.w    $F4FA,$F500,$1000,$0000,$F62C,$F700,$1000,$0000
  223.     dc.w    $F84D,$F900,$1000,$0000,$FAAC,$FB00,$1000,$0000
  224.     dc.w    $FCB2,$FD00,$1000,$0000,$FE9A,$FF00,$1000,$0000
  225.     dc.w    $009A,$0106,$1000,$0000,$02DF,$0306,$1000,$0000
  226.     dc.w    $0446,$0506,$1000,$0000,$0688,$0706,$1000,$0000
  227.     dc.w    $0899,$0906,$1000,$0000,$0ADD,$0B06,$1000,$0000
  228.     dc.w    $0CEE,$0D06,$1000,$0000,$0EFF,$0F06,$1000,$0000
  229.     dc.w    $10CD,$1106,$1000,$0000,$1267,$1306,$1000,$0000
  230.     dc.w    $1443,$1506,$1000,$0000,$1664,$1706,$1000,$0000
  231.     dc.w    $1823,$1906,$1000,$0000,$1A6D,$1B06,$1000,$0000
  232.     dc.w    $1C4F,$1D06,$1000,$0000,$1E5F,$1F06,$1000,$0000
  233.     dc.w    $2055,$2106,$1000,$0000,$2267,$2306,$1000,$0000
  234.     dc.w    $2445,$2506,$1000,$0000,$2623,$2706,$1000,$0000
  235.     dc.w    $2834,$2906,$1000,$0000,$2AF0,$2B06,$1000,$0000
  236.  
  237. SpriteEnd
  238.     dc.w    $0000,$0000 ; Endlich ist der wiederverwertete Sprite fertig
  239.  
  240.      SECTION LEERESPLANE,BSS_C ; Ein auf 0 gesetztes Bitplane, wir
  241.                    ; müssen es verwenden, denn ohne Bitplane
  242.                    ; ist es nicht möglich, die Sprites
  243.                    ; zu aktivieren
  244. BITPLANE:
  245.     ds.b    40*256        ; Bitplane auf 0 Lowres
  246.  
  247.     end
  248.  
  249. In  diesem  Listing  verstellen  wir  die  Sterne  mit  verschiedener
  250. Geschwindigkeit, um einen besseren Effekt zu  erzielen.  Wir  geben  ihnen
  251. drei  verschiedene  Geschwindigkeiten.  Die Routine BewegeSterne verstellt
  252. bei jedem Durchgang drei Sterne. Der erste wird um 2 Pixel verstellt,  wie
  253. wir  im  ersten  Beispiel zu diesem Thema gesehen haben, der zweite um ein
  254. einziges Pixel und der dritte um ganze 4 Pixel, indem wir  einfach  2  zum
  255. Byte  HSTART  dazuzählen.  Die  Routine kontrolliert erst nach dem dritten
  256. Stern, ob wir das Ende erreicht haben.
  257.  
  258.  
  259.