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

  1.  
  2. ; lezione7x2.s     - Collsioni Sprite in Dual Playfield mode
  3. ; In questo esempio mostriamo le collisioni tra uno sprite e i due playfield.
  4. ; Lo sprite si muove dall'alto in basso. Se viene rilevata una collisione,
  5. ; viene cambiato il colore di sfondo (rosso o verde a seconda di cosa e'
  6. ; in collisione).
  7.  
  8.     SECTION    CiriCop,CODE
  9.  
  10. Inizio:
  11.     move.l    4.w,a6        ; Execbase
  12.     jsr    -$78(a6)    ; Disable
  13.     lea    GfxName(PC),a1    ; Nome lib
  14.     jsr    -$198(a6)    ; OpenLibrary
  15.     move.l    d0,GfxBase
  16.     move.l    d0,a6
  17.     move.l    $26(a6),OldCop    ; salviamo la vecchia COP
  18.  
  19. ; Usiamo 2 planes per ogni playfield
  20.  
  21. ;    Puntiamo le PIC
  22.  
  23.     MOVE.L    #PIC1,d0    ; puntiamo il playfield 1
  24.     LEA    BPLPOINTERS1,A1
  25.     MOVEQ    #2-1,D1
  26. POINTBP:
  27.     move.w    d0,6(a1)
  28.     swap    d0
  29.     move.w    d0,2(a1)
  30.     swap    d0
  31.     ADD.L    #40*256,d0
  32.     addq.w    #8,a1
  33.     dbra    d1,POINTBP
  34.  
  35.     MOVE.L    #PIC2,d0    ; puntiamo il playfield 2
  36.     LEA    BPLPOINTERS2,A1
  37.     MOVEQ    #2-1,D1
  38. POINTBP2:
  39.     move.w    d0,6(a1)
  40.     swap    d0
  41.     move.w    d0,2(a1)
  42.     swap    d0
  43.     ADD.L    #40*256,d0
  44.     addq.w    #8,a1
  45.     dbra    d1,POINTBP2
  46.  
  47. ;    Puntiamo lo sprite
  48.  
  49.     MOVE.L    #MIOSPRITE0,d0        ; indirizzo dello sprite in d0
  50.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  51.     move.w    d0,6(a1)
  52.     swap    d0
  53.     move.w    d0,2(a1)
  54.  
  55.     move.l    #COPPERLIST,$dff080    ; nostra COP
  56.     move.w    d0,$dff088        ; START COP
  57.     move.w    #0,$dff1fc        ; NO AGA!
  58.     move.w    #$c00,$dff106        ; NO AGA!
  59.  
  60.     move.w    #$0024,$dff104    ; BPLCON2
  61.                 ; con questo valore gli sprite sono tutti
  62.                 ; sopra entrambi i playfield
  63.  
  64. aspetta1:
  65.     cmp.b    #$ff,$dff006    ; Linea 255?
  66.     bne.s    aspetta1
  67. aspetta11:
  68.     cmp.b    #$ff,$dff006    ; Ancora Linea 255?
  69.     beq.s    aspetta11
  70.  
  71.     btst    #6,$bfe001
  72.     beq.s    esci
  73.  
  74.     bsr.s    MuoviSprite    ; Muove in basso lo sprite
  75.     bsr.w    CheckColl    ; Controlla collisione e provvede
  76.  
  77.     bra.s    aspetta1
  78.  
  79. esci    move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  80.     move.w    d0,$dff088        ; facciamo partire la vecchia cop
  81.  
  82.     move.l    4.w,a6
  83.     jsr    -$7e(a6)    ; Enable
  84.     move.l    gfxbase(PC),a1
  85.     jsr    -$19e(a6)    ; Closelibrary
  86.     rts
  87.  
  88. ;    Dati
  89.  
  90. GfxName:
  91.     dc.b    "graphics.library",0,0
  92.  
  93. GfxBase:
  94.     dc.l    0
  95.  
  96. OldCop:
  97.     dc.l    0
  98.  
  99. ; Questa routine muove lo sprite 0 in basso di un pixel ogni 2 fotogrammi
  100. ; Viene usato un flag.
  101.  
  102. Muovisprite:
  103.     not.w    flag
  104.     beq.s    FineMuovisprite
  105.  
  106.     addq.w    #1,altezza
  107.     cmp.w    #300,altezza    ; e` arrivato al bordo inferiore?
  108.     blo.s    no_bordo
  109.     move.w    #$2c,altezza    ; se si, rimetti lo sprite in alto
  110. no_bordo:
  111.     move.w    altezza(PC),d0
  112.     CLR.B    VHBITS0        ; azzera i bit 8 delle posizioni verticali
  113.     MOVE.b    d0,VSTART0    ; copia i bit da 0 a 7 in VSTART
  114.     BTST.l    #8,D0        ; la posizione e` maggiore di 255 ?
  115.     BEQ.S    NOBIGVSTART    ; se no vai oltre, infatti il bit e` stato gia`
  116.                 ; azzerato con la CLR.b VHBITS
  117.  
  118.     BSET.b    #2,VHBITS0    ; altrimenti metti a 1 il bit 8 della posizione
  119.                 ; verticale di partenza
  120. NOBIGVSTART:
  121.     ADDQ.w    #8,D0        ; Aggiungi la lunghezza dello sprite per
  122.                 ; determinare la posizione finale (VSTOP)
  123.     move.b    d0,VSTOP0    ; Muovi i bit da 0 a 7 in VSTOP
  124.     BTST.l    #8,D0        ; la posizione e` maggiore di 255 ?
  125.     BEQ.S    NOBIGVSTOP    ; se no vai oltre infatti il bit e` stato gia`
  126.                 ; azzerato con la CLR.b VHBITS
  127.     BSET.b    #1,VHBITS0    ; altrimenti metti a 1 il bit 8 della posizione
  128.                 ; verticale di fine dello sprite
  129. NOBIGVSTOP:
  130. FineMuovisprite:
  131.     rts
  132.  
  133.  
  134. ; Questa routine controlla se c'e` collisione.
  135. ; In caso affermativo, cambia il colore dello sfondo modificando nella copper
  136. ; list il valore assunto dal registro COLOR00, rosso o verde.
  137.  
  138. CheckColl:
  139.     move.w    $dff00e,d0    ; legge CLXDAT ($dff00e)
  140.                 ; una lettura di questo registro ne provoca
  141.                 ; anche la cancellazione, per cui conviene
  142.                 ; copiarselo in d0 e fare i test su d0
  143.     btst.l    #1,d0        ; il bit 1 indica la collisione tra sprite 0
  144.                 ; e playfield 1
  145.     beq.s    no_coll1        ; se non c'e` collisione salta
  146.  
  147.     move.w    #$f00,rileva_collisione ; "accende" il rivelatore (color0)
  148.                     ; modificando la copperlist (rosso)
  149.     bra.s    exitColl        ; esci
  150.  
  151. no_coll1:
  152.     btst.l    #5,d0        ; il bit 5 indica la collisione tra sprite 0
  153.                 ; e playfield 2
  154.     beq.s    no_coll2        ; se non c'e` collisione salta
  155.     move.w    #$0f0,rileva_collisione ; "accende" il rivelatore (color0)
  156.                     ; modificando la copperlist (verde)
  157.     bra.s    exitColl        ; esci
  158.  
  159. no_coll2:
  160.     move.w    #$000,rileva_collisione ; "spegne" il rivelatore (color0)
  161.                     ; modificando la copperlist (nero)
  162. exitColl:
  163.     rts
  164.  
  165. flag:
  166.     dc.w    0
  167. altezza:
  168.     dc.w    $2c
  169.  
  170.  
  171.     SECTION    GRAPHIC,DATA_C
  172.  
  173. COPPERLIST:
  174. SpritePointers:
  175.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  176.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  177.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  178.     dc.w    $13e,0
  179.  
  180.     dc.w    $8E,$2c81    ; DiwStrt
  181.     dc.w    $90,$2cc1    ; DiwStop
  182.     dc.w    $92,$38        ; DdfStart
  183.     dc.w    $94,$d0        ; DdfStop
  184.     dc.w    $102,0        ; BplCon1
  185.     dc.w    $108,0        ; Bpl1Mod
  186.     dc.w    $10a,0        ; Bpl2Mod
  187.  
  188.             ; 5432109876543210
  189.     dc.w    $100,%0100011000000000    ; bit 10 acceso = dual playfield
  190.                     ; uso 4 planes = 4 colori per playfield
  191.  
  192. BPLPOINTERS1:
  193.     dc.w $e0,0,$e2,0    ;primo bitplane playfield 1 (BPLPT1)
  194.     dc.w $e8,0,$ea,0    ;secondo bitplane playfield 1 (BPLPT3)
  195.  
  196.  
  197. BPLPOINTERS2:
  198.     dc.w $e4,0,$e6,0    ;primo bitplane playfield 2 (BPLPT2)
  199.     dc.w $ec,0,$ee,0    ;secondo bitplane playfield 2 (BPLPT4)
  200.  
  201. ; Questo e` il registro CLXCON (controlla il modo di rilevamento)
  202.  
  203. ; i bit da 0 a 5 sono i valori che devono essere assunti dai plane
  204. ; i bit da 6 a 11 indicano quali planes sono abilitati alle collisioni
  205. ; i bit da 12 a 15 indicano quali degli sprite dispari sono abilitati
  206. ; al rilevamento delle collisioni.
  207.  
  208.             ;5432109876543210
  209.     dc.w    $98,%0000001111001011    ; CLXCON
  210.  
  211. ; Questi valori indicano che i planes 1,2,3,4 sono attivi per le collisioni.
  212. ; Viene segnalata collisione con il playfield 1 quando lo sprite si sovrappone
  213. ; ad un pixel che ha:    plane 1 = 1 (bit 0)
  214. ;               plane 3 = 0 (bit 2)
  215. ; cioe` con il colore 1 del playfield 1
  216.  
  217. ; viene segnalata collisione con il playfield 2 quando lo sprite si sovrappone
  218. ; ad un pixel che ha:    plane 2 = 1 (bit 1)
  219. ;               plane 4 = 1 (bit 3)
  220. ; cioe` con il colore 3 del playfield 2
  221.  
  222.  
  223.     dc.w    $180    ; COLOR00
  224. rileva_collisione:
  225.     dc.w    0    ; IN QUESTO PUNTO la routine CheckColl modifica
  226.             ; la copper list scrivendo il colore giusto.
  227.  
  228.                             ; palette playfield 1
  229.     dc.w    $182,$005    ; colori da 0 a 7
  230.     dc.w    $184,$a40
  231.     dc.w    $186,$f80
  232.     dc.w    $188,$f00
  233.     dc.w    $18a,$0f0
  234.     dc.w    $18c,$00f
  235.     dc.w    $18e,$080
  236.  
  237.  
  238.                 ; palette playfield 2
  239.     dc.w    $192,$367    ; colori da 9 a 15
  240.     dc.w    $194,$0cc     ; il colore 8 e` trasparente, non va settato
  241.     dc.w    $196,$a0a 
  242.     dc.w    $198,$242 
  243.     dc.w    $19a,$282
  244.     dc.w    $19c,$861
  245.     dc.w    $19e,$ff0
  246.  
  247.  
  248.     dc.w    $1A2,$F00    ; palette degli sprites
  249.     dc.w    $1A4,$0F0
  250.     dc.w    $1A6,$FF0
  251.  
  252.     dc.w    $1AA,$FFF
  253.     dc.w    $1AC,$0BD
  254.     dc.w    $1AE,$D50
  255.  
  256.     dc.w    $1B2,$00F
  257.     dc.w    $1B4,$F0F
  258.     dc.w    $1B6,$BBB
  259.  
  260.     dc.w    $1BA,$8E0
  261.     dc.w    $1BC,$a70
  262.     dc.w    $1BE,$d00
  263.  
  264.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  265.  
  266. ;    I due playfields
  267.  
  268. PIC1:    incbin    "colldual1.raw"
  269. PIC2:    incbin    "colldual2.raw"
  270.  
  271. ; ************ Ecco lo sprite: OVVIAMENTE in CHIP RAM! ************
  272. MIOSPRITE0:
  273. VSTART0:
  274.     dc.b $2c
  275. HSTART0:
  276.     dc.b $80
  277. VSTOP0:
  278.     dc.b $2c+8
  279. VHBITS0
  280.     dc.b $00
  281.  dc.w    %0000001111000000,%0111110000111110
  282.  dc.w    %0000111111110000,%1111001110001111
  283.  dc.w    %0011111111111100,%1100010001000011
  284.  dc.w    %0111111111111110,%1000010001000001
  285.  dc.w    %0111111111111110,%1000010001000001
  286.  dc.w    %0011111111111100,%1100010001000011
  287.  dc.w    %0000111111110000,%1111001110001111
  288.  dc.w    %0000001111000000,%0111110000111110
  289.  dc.w    0,0
  290.  
  291.  
  292.     end
  293.  
  294. Questo esempio mostra come funzionano le collisioni tra sprite e i playfield
  295. di uno schermo (dualplayfield). Si controllano indipendentemente le
  296. collisioni con i 2 playfield usando 2 diversi bit del registro CLXDAT.
  297. Nel nostro esempio (usiamo lo sprite 0), il bit 1 controlla la collisione con
  298. il playfield 1 (piani dispari) e il bit 5 la collisione con il playfield 2
  299. (piani pari).
  300. Per quanto il registro CLXCON, fuunziona tutto come per il caso di schermo
  301. normale:
  302. i bit da 0 a 5 sono i valori che devono essere assunti dai plane
  303. i bit da 6 a 11 indicano quali planes sono abilitati alle collisioni
  304. i bit da 12 a 15 indicano quali degli sprite dispari sono abilitati
  305. al rilevamento delle collisioni.
  306. Rimane sempre possibile non abilitare alcuni planes per rilevare piu` colori
  307. contemporaneamente, come abbiamo illustrato con l'esempio lezione7w2.
  308. Potete provare modificando nella copperlist il valore assegnato a CLXCON.
  309.  
  310.