home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / vari / mstars.s < prev    next >
Encoding:
Text File  |  1995-12-06  |  7.0 KB  |  232 lines

  1.  
  2. ; Animazione degli sprite per fare delle stelle "magic"
  3. ; Original version: Autore sconosciuto
  4. ; Fixed version: Randy/Ram Jam
  5.  
  6.     SECTION    stars6,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001110100000    ; copper,bitplane,sprites
  16.  
  17. Waitdisk    EQU    10
  18.  
  19. START:
  20.  
  21. ; Puntiamo il biplane azzerato
  22.  
  23.     MOVE.L    #PLANE,d0
  24.     LEA    BPLPOINTERS,A1
  25.     move.w    d0,6(a1)
  26.     swap    d0
  27.     move.w    d0,2(a1)
  28.  
  29.     lea    $dff000,a5
  30.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  31.                     ; e sprites.
  32.     move.l    #COPPERSTELL,$80(a5)    ; Puntiamo la nostra COP
  33.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  34.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  35.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  36.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  37.  
  38. mouse:
  39.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  40.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  41. Waity1:
  42.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  43.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  44.     CMPI.L    D2,D0        ; aspetta la linea $010
  45.     BNE.S    Waity1
  46. Waity2:
  47.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  48.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  49.     CMPI.L    D2,D0        ; aspetta la linea $010
  50.     Beq.S    Waity2
  51.  
  52.     btst    #2,$16(A5)    ; Tasto destro premuto?
  53.     beq.s    NonStell
  54.  
  55.     bsr.s    Stellozze
  56.  
  57. NonStell:
  58.     btst    #6,$bfe001    ; tasti sin. mouse premuto?
  59.     bne.s    mouse
  60.     rts
  61.  
  62. *****************************************************************************
  63. ; Routine che punta gli sprites giusti per fare l'effetto "stelle magiche"
  64. *****************************************************************************
  65.  
  66. WaitTime    =    2    ; 0 = max velocita'
  67.  
  68. Stellozze:
  69.     MOVEQ    #8-1,D0        ; numero sprites: 8
  70.     LEA    SpritePosXYTab(PC),A0    ; Questo indirizzo e' usato per due
  71.                     ; tabelle: con offset positivi si
  72.                     ; accede alla tabella delle posizioni
  73.                     ; XY in formato "words di controllo",
  74.                     ; mentre con offsets negativi si
  75.                     ; accede alla tab .b usata per fare
  76.                     ; l'animazione simil-casuale
  77.  
  78.     LEA    COPSPR,A1    ; puntatori agli sprites in COPPERLIST
  79. FaiUnoSpriteLoop:
  80.  
  81. ; Rallentiamo un poco l'esecuzione...
  82.  
  83.     SUBQ.B    #1,-8(A0,D0.W)    ; sottrai 1 al wait time
  84.     BPL.S    NonAncZero    ; non e' = 0 ancora?
  85.     MOVE.B    #WaitTime,-8(A0,D0.W)    ; rimetti il wait time
  86.  
  87. ; Ora ci occupiamo di ciclare i valori e i frames dalla anitab
  88.  
  89.     MOVEQ    #0,D1
  90.     MOVEQ    #0,D2
  91.     MOVE.B    -16(A0,D0.W),D1    ; val1
  92.     MOVE.B    -24(A0,D0.W),D2    ; val2
  93.     ADDQ.W    #1,D1        ; val1+1
  94.     CMP.B    #13,D1        ; siamo a 13? (massimo fotogramma)
  95.     BLT.S    NonMax1        ; se non ancora, ok
  96.     MOVEQ    #0,D1        ; se si, riparti da zero
  97.     ADDQ.W    #1,D2
  98.     CMP.B    #45,D2        ; Siamo a 45? (massima coppia di word di
  99.                 ; controllo della SpritePosXYTab)
  100.     BLT.S    NonMax2        ; se non ancora, ok
  101.     MOVEQ    #0,D2        ; si?, riparti da zero! (o andiamo fuori tab)
  102. NonMax2:
  103.     MOVE.B    D2,-24(A0,D0.W)    ; salva il valore (pos XY attuale dalla tab)
  104. NonMax1:
  105.     MOVE.B    D1,-16(A0,D0.W)    ; salva il valore
  106.  
  107. ; Ora dobbiamo trovare il frame (sprite) giusto
  108.  
  109.     MULU.W    #68,D1        ; fotogramma attuale * lungh. 1 fotogramma,
  110.                 ; e otteniamo l'offset dall'inizio dello
  111.                 ; spriteanim giusto
  112.     MOVE.W    D0,D3        ; numero sprite attuale in d3
  113.     MULU.W    #13*68,D3    ; * lunghezza 1 spriteanim = offset per lo
  114.                 ; spriteanim giusto
  115.     ADD.L    #AnimSprites-2,D1 ; offset fotogramma + indirizzo AnimSprites
  116.     ADD.L    D3,D1        ; + offset sprite anim = indirizzo giusto!!!
  117.  
  118. ; Abbiamo in d1 l'indirizzo dello sprite giusto... dobbiamo pero' cambiargli
  119. ; la posizione X ed Y (HSTART/VSTART), prendendo tali valori dalla tab
  120. ; SpritePosXYTab, che li contiene gia' in forma di 2 word di controllo belle
  121. ; pronte. In d2 abbiamo quale val il tab prendere... d2*4 per l'offset!
  122.  
  123.     MOVE.L    D1,A2        ; copio address dello sprite giusto in a2
  124.     ADD.W    D2,D2        ;\ d2*4, infatti ogni elemento della tabella
  125.     ADD.W    D2,D2        ;/       e' lungo 2 words (4 bytes)
  126.     MOVE.L    0(A0,D2.W),(A2) ; SpritePosXYTab + offset ok nelle 2 word di
  127.                 ; controllo dello sprite giusto.
  128.  
  129. ; Ora abbiamo in d1 l'indirizzo dello sprite giusto da puntare.... puntiamolo!
  130.  
  131.     MOVE.W    D0,D3        ; numero sprite attuale in d3...
  132.     ASL.W    #3,D3        ; d3 * 8, per trovare l'ofsset dal primo
  133.                 ; puntatore in copperlist, infatti ogni
  134.                 ; puntatore occupa 8 bytes.....
  135.     MOVE.W    D1,6(A1,D3.W)    ; punta word alta address sprite in cop,
  136.                 ; infatti: a1(primo puntatore)+d3(offset dal
  137.     SWAP    D1        ; (primo puntatore)=address puntatore giusto!
  138.     MOVE.W    D1,2(A1,D3.W)    ; punta word bassa
  139. NonAncZero:
  140.     DBRA    D0,FaiUnoSpriteLoop
  141.     RTS
  142.  
  143.  
  144.  
  145. ; 24 bytes (3*8)
  146.  
  147. Anitab:
  148.     dc.b    34,8,28,41,19,16,42,26    ; tabella con valori scombinati per
  149.     dc.b    0,7,7,1,6,7,11,4    ; permettere l'animazione "simil"
  150.     dc.b    1,1,0,0,2,2,2,1        ; casuale delle stelle.
  151. SpritePosXYTab:
  152.     DC.W    $2770,$3600,$434B,$5200,$7F43,$8E00    ; tabella con le word
  153.     DC.W    $874B,$9600,$8655,$9500,$6F62,$7E00    ; di controllo con le
  154.     DC.W    $4362,$5200,$416C,$5000,$6060,$6F00    ; varie posizioni X Y
  155.     DC.W    $6569,$7400,$6B66,$7A00,$4A70,$5900    ; per gli sprite.
  156.     DC.W    $646F,$7300,$3978,$4800,$577D,$6600    ; nota: 45 coppie
  157.     DC.W    $6078,$6F00,$3687,$4500,$3891,$4700
  158.     DC.W    $438B,$5200,$538D,$6200,$5D87,$6C00
  159.     DC.W    $2C91,$3B00,$2E96,$3D00,$4F92,$5E00
  160.     DC.W    $5E96,$6D00,$3A9A,$4900,$39A1,$4800
  161.     DC.W    $46A8,$5500,$599E,$6800,$61A2,$7000
  162.     DC.W    $5AA5,$6900,$43AB,$5200,$44B3,$5300
  163.     DC.W    $65B0,$7400,$4FB8,$5E00,$6DBC,$7C00
  164.     DC.W    $28B8,$3700,$33BE,$4200,$3EC4,$4D00
  165.     DC.W    $49CA,$5800,$49BB,$5800,$72BF,$8100
  166.     DC.W    $7CC5,$8B00,$82D5,$9100,$86CE,$9500
  167.  
  168. *****************************************************************************
  169.  
  170.     section    copper,data_C
  171.  
  172. COPPERSTELL:
  173.     dc.w    $8e,$2c81    ; diwstart
  174.     dc.w    $90,$2cc1    ; diwstop
  175.     dc.w    $92,$38        ; ddfstart
  176.     dc.w    $94,$d0        ; ddfstop
  177.  
  178. COPSPR:
  179.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0,$12a,0,$12c,0,$12e,0
  180.     dc.w    $130,0,$132,0,$134,0,$136,0,$138,0,$13a,0,$13c,0,$13e,0
  181.  
  182.     dc.w    $108,0    ; bpl1mod
  183.     dc.w    $10a,0    ; bpl2mod
  184.     dc.w    $102,0    ; bplcon1
  185.     dc.w    $104,0    ; bplcon2
  186.  
  187. BPLPOINTERS:
  188.     dc.w    $e0,0,$e2,0    ; plane 1
  189.  
  190.     dc.w    $100,$1200    ; bplcon0 - 1 plane lowres
  191.  
  192.     dc.w    $180,0        ; color0 - nero
  193.     dc.w    $182,$fff    ; color1 - bianco
  194.  
  195.     DC.W    $180,$000,$182,$000
  196.  
  197. ; Colori degli sprite - da color17 a color31
  198.  
  199.     DC.W    $1A2,$F00,$1A4,$A00,$1A6,$600
  200.     DC.W    $1A8,$000,$1AA,$0F0,$1AC,$0A0
  201.     DC.W    $1AE,$060,$1B0,$000,$1B2,$00F
  202.     DC.W    $1B4,$00A,$1B6,$006,$1B8,$000
  203.     DC.W    $1BA,$FFF,$1BC,$AAA,$1BE,$666
  204.  
  205.     dc.w    $ffff,$fffe    ; fine copperlist
  206.  
  207. *****************************************************************************
  208.  
  209. ; 68*13*8    ossia 68 bytes ogni fotogramma * 13 fotogrammi * 8 spriteanim
  210.  
  211.     dc.w    0    ; scriviamo anche qua! la word alta... e' tutto
  212.             ; sfasato di 1 word.. non chiedetemi perche'!
  213. AnimSprites:
  214.     incbin    "spranim1"    ; 13 fotogrammi
  215.     incbin    "spranim2"    ; 13 fotogrammi
  216.     incbin    "spranim3"    ; 13 fotogrammi
  217.     incbin    "spranim4"    ; 13 fotogrammi
  218.     incbin    "spranim5"    ; 13 fotogrammi
  219.     incbin    "spranim6"    ; 13 fotogrammi
  220.     incbin    "spranim7"    ; 13 fotogrammi
  221.     incbin    "spranim8"    ; 13 fotogrammi
  222.  
  223. ; ****************************************************************************
  224.  
  225.     section    grafica,bss_C
  226.  
  227. plane:
  228.     ds.b    40*256    ; 1 plane lowres "nero" come sfondo.
  229.  
  230.     end
  231.  
  232.