home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti3 / lezione7t3.s < prev    next >
Text File  |  1995-09-29  |  8KB  |  250 lines

  1.  
  2. ; Lezione7t3.s    stelle a diverse velocita`
  3.  
  4. ;    In questo listato facciamo un cielo stellato
  5. ;    con stelle che hanno diverse velocita`
  6.  
  7.     SECTION    CiriCop,CODE
  8.  
  9. Inizio:
  10.     move.l    4.w,a6        ; Execbase
  11.     jsr    -$78(a6)    ; Disable
  12.     lea    GfxName(PC),a1    ; Nome 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. ;    Puntiamo gli sprite
  26.  
  27.     MOVE.L    #SPRITE,d0        ; indirizzo dello sprite in d0
  28.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  29.     move.w    d0,6(a1)
  30.     swap    d0
  31.     move.w    d0,2(a1)
  32.  
  33.     move.l    #COPPERLIST,$dff080    ; nostra 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    ; Linea 255?
  40.     bne.s    mouse
  41.  
  42.     bsr.s    MuoviStelle    ; questa routine muove le stelle
  43.  
  44. Aspetta:
  45.     cmpi.b    #$ff,$dff006    ; linea 255?
  46.     beq.s    Aspetta
  47.  
  48.     btst    #6,$bfe001    ; mouse premuto?
  49.     bne.s    mouse
  50.  
  51.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  52.     move.w    d0,$dff088        ; facciamo partire la vecchia 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. ;    Dati
  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. ; La routine che muove le stelle e' un poco piu' complessa in questo esempio,
  72. ; ma basta seguirla istruzione per istruzione e non e' difficile comprenderla.
  73. ; Per ogni STELLE_LOOP la routine muove 3 stelle, per la precisione 1 veloce,
  74. ; 1 lenta e 1 velocissima.
  75.  
  76. MuoviStelle:
  77.     lea    Sprite,A0        ; a0 punta allo sprite
  78. STELLE_LOOP:
  79.  
  80. ; stelle veloci (2 pixel per fotogramma)
  81.  
  82.     CMPI.B    #$f0,1(A0)        ; la stella ha raggiunto il bordo
  83.                     ; destro dello schermo ?
  84.     BNE.S    no_bordo1        ; no, allora salta
  85.     MOVE.B    #$30,1(A0)        ; si, rimetti la stella a sinistra
  86. no_bordo1:
  87.     ADDQ.B  #1,1(A0)        ; sposta di 2 pixel lo sprite
  88.     ADDQ.w    #8,A0            ; prossima stella
  89.  
  90. ; stelle lente (1 pixel per fotogramma)
  91.  
  92.      CMPI.B    #$f0,1(A0)        ; la stella ha raggiunto il bordo
  93.                     ; destro dello schermo ?
  94.     BNE.S    no_bordo2        ; no, allora salta
  95.     MOVE.B    #$30,1(A0)        ; si, rimetti la stella a sinistra
  96. no_bordo2:
  97.     BCHG    #0,3(A0)
  98.     BEQ.S    pari
  99.     ADDQ.B  #1,1(A0)        ; sposta di 2 pixel lo sprite
  100. pari:
  101.     ADDQ.w    #8,A0            ; prossima stella
  102.  
  103. ; stelle velocissime (4 pixel per fotogramma)
  104.  
  105.     CMPI.B    #$f0,1(A0)        ; la stella ha raggiunto il bordo
  106.                     ; destro dello schermo ?
  107.     BNE.S    no_bordo3        ; no, allora salta
  108.     MOVE.B    #$30,1(A0)        ; si, rimetti la stella a sinistra
  109. no_bordo3:
  110.     ADDQ.B  #2,1(A0)        ; sposta di 4 pixel lo sprite
  111.     ADDQ.w    #8,A0            ; prossima stella
  112.  
  113.     CMP.L    #SpriteEnd,A0        ; abbiamo raggiunto la fine?
  114.     BLO.S    STELLE_LOOP        ; se no rifai il loop
  115.     RTS                ; fine routine
  116.  
  117.  
  118.     SECTION    GRAPHIC,DATA_C
  119.  
  120. COPPERLIST:
  121. SpritePointers:
  122.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  123.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  124.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  125.     dc.w    $13e,0
  126.  
  127.     dc.w    $8E,$2c81    ; DiwStrt
  128.     dc.w    $90,$2cc1    ; DiwStop
  129.  
  130.     dc.w    $92,$38        ; DdfStart
  131.     dc.w    $94,$d0        ; DdfStop
  132.     dc.w    $102,0        ; BplCon1
  133.     dc.w    $104,0        ; BplCon2
  134.     dc.w    $108,0        ; Bpl1Mod
  135.     dc.w    $10a,0        ; Bpl2Mod
  136.  
  137.             ; 5432109876543210
  138.     dc.w    $100,%0001001000000000
  139.  
  140. BPLPOINTERS:
  141.     dc.w $e0,0,$e2,0    ;primo     bitplane
  142.  
  143.     dc.w    $180,$000    ; color0    ; sfondo nero
  144.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  145.                         ; in questo caso e' vuoto,
  146.                         ; per cui non compare.
  147. ; lo sprite usa un solo colore, il 17
  148.  
  149.     dc.w    $1A2,$ddd    ; color17, - COLOR1 dello sprite0 - bianco
  150.  
  151.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  152.  
  153. ;    -    -    -    -    -    -    -    
  154.  
  155. ; Come potete notare, questo sprite e' riutilizzato un bel po' di volte, per
  156. ; la precisione 127. E' composto di tante coppie di word di controllo seguite
  157. ; da un $1000,$0000, ossia la linea di dati che compone ogni singola stella.
  158. ; Le posizioni verticali vanno di 2 in 2, per cui c'e' una stella ogni 2
  159. ; linee verticali, ad una posizione orizzontale diversa per ogni stella.
  160. ; il primo utilizzo dello sprite e' $307a,$3100,$1000,$0000
  161. ; il secondo e' $3220,$3300,$1000,$0000
  162. ; E cosi' via. I vari VSTART vanno di 2 in 2, infatti sono $30,$32,$34,$36...
  163. ; Gli HSTART sono posizionati casualmente ($7a,$20,$c0,$50...)
  164. ; I Vstop sono chiaramente 1 linea dopo lo start ($31,$33,$35..) essendo le
  165. ; stelle alte 1 pixel.
  166. ; La routine agisce ogni fotogramma su tutti gli HSTART spostando avanti le
  167. ; stelle.
  168.  
  169. Sprite:
  170.     dc.w    $307A,$3100,$1000,$0000,$3220,$3300,$1000,$0000
  171.     dc.w    $34C0,$3500,$1000,$0000,$3650,$3700,$1000,$0000
  172.     dc.w    $3842,$3900,$1000,$0000,$3A6D,$3B00,$1000,$0000
  173.     dc.w    $3CA2,$3D00,$1000,$0000,$3E9C,$3F00,$1000,$0000
  174.     dc.w    $40DA,$4100,$1000,$0000,$4243,$4300,$1000,$0000
  175.     dc.w    $445A,$4500,$1000,$0000,$4615,$4700,$1000,$0000
  176.     dc.w    $4845,$4900,$1000,$0000,$4A68,$4B00,$1000,$0000
  177.     dc.w    $4CB8,$4D00,$1000,$0000,$4EB4,$4F00,$1000,$0000
  178.     dc.w    $5082,$5100,$1000,$0000,$5292,$5300,$1000,$0000
  179.     dc.w    $54D0,$5500,$1000,$0000,$56D3,$5700,$1000,$0000
  180.     dc.w    $58F0,$5900,$1000,$0000,$5A6A,$5B00,$1000,$0000
  181.     dc.w    $5CA5,$5D00,$1000,$0000,$5E46,$5F00,$1000,$0000
  182.     dc.w    $606A,$6100,$1000,$0000,$62A0,$6300,$1000,$0000
  183.     dc.w    $64D7,$6500,$1000,$0000,$667C,$6700,$1000,$0000
  184.     dc.w    $68C4,$6900,$1000,$0000,$6AC0,$6B00,$1000,$0000
  185.     dc.w    $6C4A,$6D00,$1000,$0000,$6EDA,$6F00,$1000,$0000
  186.     dc.w    $70D7,$7100,$1000,$0000,$7243,$7300,$1000,$0000
  187.     dc.w    $74A2,$7500,$1000,$0000,$7699,$7700,$1000,$0000
  188.     dc.w    $7872,$7900,$1000,$0000,$7A77,$7B00,$1000,$0000
  189.     dc.w    $7CC2,$7D00,$1000,$0000,$7E56,$7F00,$1000,$0000
  190.     dc.w    $805A,$8100,$1000,$0000,$82CC,$8300,$1000,$0000
  191.     dc.w    $848F,$8500,$1000,$0000,$8688,$8700,$1000,$0000
  192.     dc.w    $88B9,$8900,$1000,$0000,$8AAF,$8B00,$1000,$0000
  193.     dc.w    $8C48,$8D00,$1000,$0000,$8E68,$8F00,$1000,$0000
  194.     dc.w    $90DF,$9100,$1000,$0000,$924F,$9300,$1000,$0000
  195.     dc.w    $9424,$9500,$1000,$0000,$96D7,$9700,$1000,$0000
  196.     dc.w    $9859,$9900,$1000,$0000,$9A4F,$9B00,$1000,$0000
  197.     dc.w    $9C4A,$9D00,$1000,$0000,$9E5C,$9F00,$1000,$0000
  198.     dc.w    $A046,$A100,$1000,$0000,$A2A6,$A300,$1000,$0000
  199.     dc.w    $A423,$A500,$1000,$0000,$A6FA,$A700,$1000,$0000
  200.     dc.w    $A86C,$A900,$1000,$0000,$AA44,$AB00,$1000,$0000
  201.     dc.w    $AC88,$AD00,$1000,$0000,$AE9A,$AF00,$1000,$0000
  202.     dc.w    $B06C,$B100,$1000,$0000,$B2D4,$B300,$1000,$0000
  203.     dc.w    $B42A,$B500,$1000,$0000,$B636,$B700,$1000,$0000
  204.     dc.w    $B875,$B900,$1000,$0000,$BA89,$BB00,$1000,$0000
  205.     dc.w    $BC45,$BD00,$1000,$0000,$BE24,$BF00,$1000,$0000
  206.     dc.w    $C0A3,$C100,$1000,$0000,$C29D,$C300,$1000,$0000        
  207.     dc.w    $C43F,$C500,$1000,$0000,$C634,$C700,$1000,$0000        
  208.     dc.w    $C87C,$C900,$1000,$0000,$CA1D,$CB00,$1000,$0000        
  209.     dc.w    $CC6B,$CD00,$1000,$0000,$CEAC,$CF00,$1000,$0000
  210.     dc.w    $D0CF,$D100,$1000,$0000,$D2FF,$D300,$1000,$0000        
  211.     dc.w    $D4A5,$D500,$1000,$0000,$D6D6,$D700,$1000,$0000        
  212.     dc.w    $D8EF,$D900,$1000,$0000,$DAE1,$DB00,$1000,$0000        
  213.     dc.w    $DCD9,$DD00,$1000,$0000,$DEA6,$DF00,$1000,$0000        
  214.     dc.w    $E055,$E100,$1000,$0000,$E237,$E300,$1000,$0000        
  215.     dc.w    $E47D,$E500,$1000,$0000,$E62E,$E700,$1000,$0000
  216.     dc.w    $E8AF,$E900,$1000,$0000,$EA46,$EB00,$1000,$0000
  217.     dc.w    $EC65,$ED00,$1000,$0000,$EE87,$EF00,$1000,$0000
  218.     dc.w    $F0D4,$F100,$1000,$0000,$F2F5,$F300,$1000,$0000
  219.     dc.w    $F4FA,$F500,$1000,$0000,$F62C,$F700,$1000,$0000
  220.     dc.w    $F84D,$F900,$1000,$0000,$FAAC,$FB00,$1000,$0000
  221.     dc.w    $FCB2,$FD00,$1000,$0000,$FE9A,$FF00,$1000,$0000
  222.     dc.w    $009A,$0106,$1000,$0000,$02DF,$0306,$1000,$0000
  223.     dc.w    $0446,$0506,$1000,$0000,$0688,$0706,$1000,$0000
  224.     dc.w    $0899,$0906,$1000,$0000,$0ADD,$0B06,$1000,$0000
  225.     dc.w    $0CEE,$0D06,$1000,$0000,$0EFF,$0F06,$1000,$0000
  226.     dc.w    $10CD,$1106,$1000,$0000,$1267,$1306,$1000,$0000
  227.     dc.w    $1443,$1506,$1000,$0000,$1664,$1706,$1000,$0000
  228.     dc.w    $1823,$1906,$1000,$0000,$1A6D,$1B06,$1000,$0000
  229.     dc.w    $1C4F,$1D06,$1000,$0000,$1E5F,$1F06,$1000,$0000
  230.     dc.w    $2055,$2106,$1000,$0000,$2267,$2306,$1000,$0000
  231.     dc.w    $2445,$2506,$1000,$0000,$2623,$2706,$1000,$0000
  232.     dc.w    $2834,$2906,$1000,$0000,$2AF0,$2B06,$1000,$0000
  233. SpriteEnd:
  234.     dc.w     $0000,$0000    ; Fine dello sprite
  235.  
  236.  
  237.     SECTION    PLANEVUOTO,BSS_C
  238. BITPLANE:
  239.     ds.b    40*256
  240.  
  241.     end
  242.  
  243. In questo listato facciamo muovere le stelle a velocita` diversa, in modo da
  244. creare un effetto migliore. Diamo alle stelle tre velocita` diverse.
  245. La routine MuoviStelle sposta tre stelle per ogni ciclo. La prima stella viene
  246. spostata di 2 pixel come abbiamo visto nel primo esempio, la seconda stella
  247. di 1 solo pixel, mentre la terza viene spostata di 4 pixel, aggiungendo
  248. 2 al byte HSTART. La routine controlla se abbiamo raggiunto l'ultima stella
  249. solo dopo averne spostate 3.
  250.