home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti9 / lezione15f6.s < prev    next >
Text File  |  1995-04-28  |  12KB  |  372 lines

  1.  
  2. ; Lezione15f6.s        Premere il tasto destro per attivare BRDRSPRT, che
  3. ;            permette la visualizzazione dello sprite fuori dalla
  4. ;            finestra video, definita di proposito piu' stretta
  5. ;            del normale.
  6.  
  7.     SECTION    AgaRulez,CODE
  8.  
  9. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  10.  
  11. *****************************************************************************
  12.     include    "startup2.s"    ; Salva Copperlist Etc.
  13. *****************************************************************************
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001110100000    ; copper, bitplane, sprite DMA
  17.  
  18. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  19.  
  20. START:
  21.  
  22. ;    Puntiamo la PIC "vuota"
  23.  
  24.     MOVE.L    #BITPLANE,d0    ; dove puntare
  25.     LEA    BPLPOINTERS,A1    ; puntatori COP
  26.     move.w    d0,6(a1)
  27.     swap    d0
  28.     move.w    d0,2(a1)
  29.  
  30. ;    Puntiamo tutti gli sprite allo sprite nullo
  31.  
  32.     MOVE.L    #SpriteNullo,d0        ; indirizzo dello sprite in d0
  33.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  34.     MOVEQ    #8-1,d1            ; tutti gli 8 sprite
  35. NulLoop:
  36.     move.w    d0,6(a1)
  37.     swap    d0
  38.     move.w    d0,2(a1)
  39.     swap    d0
  40.     addq.w    #8,a1
  41.     dbra    d1,NulLoop
  42.  
  43. ;    Puntiamo lo sprite
  44.  
  45.     MOVE.L    #MIOSPRITE64,d0        ; indirizzo dello sprite in d0
  46.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  47.     move.w    d0,6(a1)
  48.     swap    d0
  49.     move.w    d0,2(a1)
  50.  
  51.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  52.     move.l    #CopList,$80(a5)    ; Puntiamo la nostra COP
  53.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  54.     move.w    #0,$1fc(a5)        ; Fmode azzerato, burst normale
  55.     move.w    #$c00,$106(a5)        ; BPLCON3 resettato
  56.     move.w    #$11,$10c(a5)        ; BPLCON4 resettato
  57.  
  58.     move.b    $dff00a,mouse_y
  59.     move.b    $dff00b,mouse_x
  60.  
  61. mouse:
  62.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  63.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  64. Waity1:
  65.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  66.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  67.     CMPI.L    D2,D0        ; aspetta la linea $120
  68.     BNE.S    Waity1
  69.  
  70.     bsr.s    LeggiMouse    ; questa legge il mouse
  71.     move.w    sprite_y(pc),d0 ; prepara i parametri per la routine
  72.     move.w    sprite_x(pc),d1 ; universale
  73.     lea    miosprite64,a1    ; indirizzo sprite
  74.     moveq    #52,d2        ; altezza sprite
  75.     bsr.w    UniMuoviSprite64F ; chiama la routine universale
  76.  
  77.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  78.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  79. Aspetta:
  80.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  81.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  82.     CMPI.L    D2,D0        ; aspetta la linea $120
  83.     BEQ.S    Aspetta
  84.  
  85.     btst.b    #2,$dff016    ; Tasto destro premuto?
  86.     bne.s    NonScambiareRes    ; Se no non cambiare
  87.  
  88.     bchg.b    #1,BplCon3    ; Se si, cambia il BRDRSPRT.
  89.  
  90. NonScambiareRes:
  91.     btst.b    #6,$bfe001    ; mouse premuto?
  92.     bne.s    mouse
  93.     rts
  94.  
  95. ; Questa routine legge il mouse e aggiorna i valori contenuti nelle
  96. ; variabili sprite_x e sprite_y
  97.  
  98. LeggiMouse:
  99.     move.b    $dff00a,d1    ; JOY0DAT posizione verticale mouse
  100.     move.b    d1,d0        ; copia in d0
  101.     sub.b    mouse_y(PC),d0    ; sottrai vecchia posizione mouse
  102.     beq.s    no_vert        ; se la differenza = 0, il mouse e` fermo
  103.     ext.w    d0        ; trasforma il byte in word
  104.                 ; (vedi alla fine del listato)
  105.     add.w    d0,sprite_y    ; modifica posizione sprite
  106. no_vert:
  107.       move.b    d1,mouse_y    ; salva posizione mouse per la prossima volta
  108.  
  109.     move.b    $dff00b,d1    ; posizione orizzontale mouse
  110.     move.b    d1,d0        ; copia in d0
  111.     sub.b    mouse_x(PC),d0    ; sottrai vecchia posizione
  112.     beq.s    no_oriz        ; se la differenza = 0, il mouse e` fermo
  113.     ext.w    d0        ; trasforma il byte in word
  114.                 ; (vedi alla fine del listato)
  115.     add.w    d0,sprite_x    ; modifica pos. sprite
  116. no_oriz
  117.       move.b    d1,mouse_x    ; salva posizione mouse per la prossima volta
  118.     RTS
  119.  
  120. SPRITE_Y:    dc.w    0    ; qui viene memorizzata la Y dello sprite
  121. SPRITE_X:    dc.w    0    ; qui viene memorizzata la X dello sprite
  122. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  123. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  124.  
  125.  
  126. ; Routine universale di posizionamento degli sprite larghi 64 pixel, con
  127. ; posizione X da 0 a 1280, che usa il nuovo scroll AGA ad 1/4 di pixel
  128.  
  129. ;
  130. ;    Parametri in entrata di UniMuoviSprite64F:
  131. ;
  132. ;    a1 = Indirizzo dello sprite
  133. ;    d0 = posizione verticale Y dello sprite sullo schermo (0-1280)
  134. ;    d1 = posizione orizzontale X dello sprite sullo schermo (0-320)
  135. ;    d2 = altezza dello sprite
  136. ;
  137.  
  138. UniMuoviSprite64F:
  139. ; posizionamento verticale
  140.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  141.  
  142. ; a1 contiene l'indirizzo dello sprite
  143.     MOVE.b    d0,(a1)        ; copia il byte in VSTART
  144.     btst.l    #8,d0
  145.     beq.s    NonVSTARTSET
  146.     bset.b    #2,3+4+2(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  147.     bra.s    ToVSTOP
  148. NonVSTARTSET:
  149.     bclr.b    #2,3+4+2(a1)    ; Azzera il bit 8 di VSTART (numero < $FF)
  150. ToVSTOP:
  151.     ADD.w    D2,D0        ; Aggiungi l'altezza dello sprite per
  152.                 ; determinare la posizione finale (VSTOP)
  153.     move.b    d0,2+4+2(a1)    ; Muovi il valore giusto in VSTOP
  154.     btst.l    #8,d0
  155.     beq.s    NonVSTOPSET
  156.     bset.b    #1,3+4+2(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  157.     bra.w    VstopFIN
  158. NonVSTOPSET:
  159.     bclr.b    #1,3+4+2(a1)    ; Azzera il bit 8 di VSTOP (numero < $FF)
  160. VstopFIN:
  161.  
  162. ; posizionamento orizzontale - qua ci sono le modifiche!!!
  163.  
  164.     add.w    #128*4,D1        ; 128*4 - per centrare lo sprite.
  165.     btst.l    #0,D1        ; bit basso 0 della coordinata X azzerato?
  166.     beq.s    BitBassoZERO
  167.     bset.b    #3,3+4+2(a1)    ; SH0 - Settiamo il bit piu' basso di HSTART
  168.     bra.w    PlaceCoords1
  169.  
  170. BitBassoZERO:
  171.     bclr.b    #3,3+4+2(a1)    ; Azzeriamo il bit basso di HSTART
  172. PlaceCoords1:
  173.     btst.l    #1,D1        ; bit basso 1 della coordinata X azzerato?
  174.     beq.s    BitBassoZERO1
  175.     bset.b    #4,3+4+2(a1)    ; SH1 - Settiamo il bit basso di HSTART
  176.     bra.w    PlaceCoords2
  177.  
  178. BitBassoZERO1:
  179.     bclr.b    #4,3+4+2(a1)    ; SH1 - Azzeriamo il bit basso di HSTART
  180. PlaceCoords2:
  181.     btst.l    #2,D1        ; bit basso 2 della coordinata X azzerato?
  182.     beq.s    BitBassoZERO2
  183.     bset.b    #0,3+4+2(a1)    ; SH2 - Settiamo il bit basso di HSTART
  184.     bra.w    PlaceCoords3
  185.  
  186. BitBassoZERO2:
  187.     bclr.b    #0,3+4+2(a1)    ; SH2 - Azzeriamo il bit basso di HSTART
  188. PlaceCoords3:
  189.     lsr.w    #3,D1        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  190.                 ; il valore di HSTART, per "trasformarlo" nel
  191.                 ; valore fa porre nel byte HSTART, senza cioe'
  192.                 ; i 3 bit bassi.
  193.     move.b    D1,1(a1)    ; Poniamo il valore XX nel byte HSTART
  194.     rts
  195.  
  196. ;*****************************************************************************
  197. ;*                COPPERLIST                     *
  198. ;*****************************************************************************
  199.  
  200.     CNOP    0,8    ; Allineo a 64 bit
  201.  
  202.     section    coppera,data_C
  203.  
  204. COPLIST:
  205. SpritePointers:
  206.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  207.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  208.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  209.     dc.w    $13e,0
  210.  
  211.     dc.w    $8E,$5c81    ; DiwStrt
  212.     dc.w    $90,$fcc1    ; DiwStop
  213.  
  214.     dc.w    $92,$0038    ; DdfStart
  215.     dc.w    $94,$00d0    ; DdfStop
  216.     dc.w    $102,0        ; BplCon1
  217.     dc.w    $104,0        ; BplCon2
  218.     dc.w    $108,-8        ; Bpl1Mod (burst 64bit, modulo=modulo-8)
  219.     dc.w    $10a,-8        ; Bpl2Mod (come sopra)
  220.  
  221.             ; 5432109876543210
  222.     dc.w    $100,%0001001000000001    ; 1 bitplane LORES 320x256.
  223.  
  224.     dc.w    $1fc,%1111    ; Burst mode a 64 bit, sprite larghi 64 pixel
  225.  
  226.  
  227. BPLPOINTERS:
  228.     dc.w $e0,0,$e2,0    ; primo     bitplane
  229.     dc.w $e4,0,$e6,0    ; secondo       "
  230.     dc.w $e8,0,$ea,0    ; terzo           "
  231.     dc.w $ec,0,$ee,0    ; quarto       "
  232.     dc.w $f0,0,$f2,0    ; quinto       "
  233.     dc.w $f4,0,$f6,0    ; sesto           "
  234.     dc.w $f8,0,$fA,0    ; settimo       "
  235.     dc.w $fC,0,$fE,0    ; ottavo       "
  236.  
  237. ; Da notare che i colori dello sprite sono a 24 bit, anche se sono solo 3.
  238.  
  239.     DC.W    $106,$c00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE ALTI
  240. COLP0:
  241.     dc.w    $180,$000    ; color0    ; sfondo nero
  242.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  243.                         ; in questo caso e' vuoto,
  244.                         ; per cui non compare.
  245.  
  246.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  247.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  248.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  249.  
  250.  
  251.     DC.W    $106,$e00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE BASSI
  252. COLP0B:
  253.     dc.w    $180,$000    ; color0    ; sfondo nero
  254.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  255.                         ; in questo caso e' vuoto,
  256.                         ; per cui non compare.
  257.  
  258.     dc.w    $1A2,$462    ; color17, nibble bassi
  259.     dc.w    $1A4,$2e4    ; color18, nibble bassi
  260.     dc.w    $1A6,$672    ; color19, nibble bassi
  261.  
  262.     dc.w    $106    ; BPLCON3
  263.     dc.b    0
  264. BplCon3:
  265.            ; 76543210
  266.     dc.b    %00000000    ; bit 7: sprites hires o lowres. Se si
  267.                 ; settano sia il bit 7 che il bit 6 lo sprite
  268.                 ; e' in superhires (1280x256), ma viene troppo
  269.                 ; "stretto", credo sia inutile, basta hires!
  270.  
  271.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  272.  
  273.  
  274. ;*****************************************************************************
  275. ;************ Ecco gli sprite: OVVIAMENTE devono essere in CHIP RAM! *********
  276. ;*****************************************************************************
  277.  
  278.     cnop    0,8
  279.  
  280. SpriteNullo:            ; Sprite nullo da puntare in copperlist
  281.     dc.l    0,0,0,0        ; negli eventuali puntatori inutilizzati
  282.  
  283.  
  284.     cnop    0,8
  285.  
  286. MIOSPRITE64:        ; lunghezza 13*4 linee
  287. VSTART:
  288.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  289. HSTART:
  290.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  291.     dc.w 0        ; Word + longword aggiunte per raggiungere la doppia
  292.     dc.l 0        ; longword nello sprite largo 64 pixel (2 long!)
  293. VSTOP:
  294.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  295. VHBITS:
  296.     dc.b $00    ; bit
  297.     dc.w 0        ; Word + longword aggiunte per raggiungere la doppia
  298.     dc.l 0        ; longword nello sprite largo 64 pixel (2 long!)
  299.  
  300.     dc.l    $00000000,$00000000,$00003000,$000c0000 ; Salvato con PicCon
  301.     dc.l    $00000000,$00000000,$00003800,$001c0000
  302.     dc.l    $00000000,$00000000,$00001c00,$00380000
  303.     dc.l    $00000000,$00000000,$00000e00,$00700000
  304.     dc.l    $00000000,$00000000,$00000700,$00e00000
  305.     dc.l    $00000000,$00000000,$00000380,$01c00000
  306.     dc.l    $00000000,$00000000,$000001c0,$03800000
  307.     dc.l    $00000000,$00000000,$000000e0,$07000000
  308.     dc.l    $00000000,$00000000,$00000070,$0e000000
  309.     dc.l    $00000000,$00000000,$00000038,$1c000000
  310.     dc.l    $00000000,$00000000,$00000038,$1c000000
  311.     dc.l    $00000000,$00000000,$0000001c,$38000000
  312.     dc.l    $0000000f,$f0000000,$000f001f,$f800f000
  313.     dc.l    $0000003f,$fc000000,$003f003f,$fc00fc00
  314.     dc.l    $0000007f,$fe000000,$007c007f,$fe003e00
  315.     dc.l    $000000ff,$ff000000,$00f800ff,$ff001f00
  316.     dc.l    $000001ff,$ff800000,$01f001ff,$ff800f80
  317.     dc.l    $000003ff,$ffc00000,$03e003ff,$ffc007c0
  318.     dc.l    $000007ff,$ffe00000,$07c007ff,$ffe003e0
  319.     dc.l    $00000fff,$fff00000,$0f800fff,$fff001f0
  320.     dc.l    $00001fff,$fff80000,$1f001c3f,$fc3800f8
  321.     dc.l    $00003fff,$fffc0000,$3e00381f,$f81c007c
  322.     dc.l    $00003fff,$fffc0000,$7c00300f,$f00c003e
  323.     dc.l    $00007fff,$fffe0000,$fc00700f,$f00e003f
  324.     dc.l    $00007f8f,$f1fe0000,$fffff00f,$f00fffff
  325.     dc.l    $00007f0f,$f0fe0000,$fffff00f,$f00fffff
  326.     dc.l    $00007f0f,$f0fe0000,$fffff80f,$f01fffff
  327.     dc.l    $00007f1f,$f8fe0000,$7ffffc1f,$f83ffffe
  328.     dc.l    $00003fff,$fffc0000,$00003fff,$fffc0000
  329.     dc.l    $00003fff,$fffc0000,$00003fff,$fffc0000
  330.     dc.l    $00001fff,$fff80000,$00007fff,$fffe0000
  331.     dc.l    $00001fff,$fff80000,$0000ffff,$ffff0000
  332.     dc.l    $00000fff,$fff00000,$0001ff80,$01ff8000
  333.     dc.l    $00000fff,$fff00000,$0003ffc0,$03ffc000
  334.     dc.l    $000007ff,$ffe00000,$0007ffe0,$07ffe000
  335.     dc.l    $000003ff,$ffc00000,$0007fff0,$0fffe000
  336.     dc.l    $000001ff,$ff800000,$000ff1ff,$ff8ff000
  337.     dc.l    $000001ff,$ff800000,$001fe1ff,$ff87f800
  338.     dc.l    $000000ff,$ff000000,$003fc0ff,$ff03fc00
  339.     dc.l    $0000007f,$fe000000,$003fc07f,$fe03fc00
  340.     dc.l    $0000003f,$fc000000,$007f803f,$fc01fe00
  341.     dc.l    $0000001f,$f8000000,$007f801f,$f801fe00
  342.     dc.l    $0000000f,$f0000000,$00ff000f,$f000ff00
  343.     dc.l    $00000003,$c0000000,$00ff0003,$c000ff00
  344.     dc.l    $00000000,$00000000,$03fe0000,$00007fc0
  345.     dc.l    $00000000,$00000000,$0ffe0000,$00007ff0
  346.     dc.l    $00000000,$00000000,$3ffe0000,$00007ffc
  347.     dc.l    $00000000,$00000000,$7fff0000,$0000fffe
  348.     dc.l    $00000000,$00000000,$ffff0000,$0000ffff
  349.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  350.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  351.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  352.  
  353.     dc.l    0,0,0,0        ; Fine dello sprite (2 doppie longword).
  354.  
  355.     cnop    0,8
  356.  
  357.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  358.                     ; perche' per vedere gli sprite
  359.                     ; e' necessario che ci siano bitplanes
  360.                     ; abilitati
  361. BITPLANE:
  362.     ds.b    40*256        ; bitplane azzerato lowres
  363.  
  364.     end
  365.  
  366. Basta settare il bit magico, e gli sprite si possono muovere veramente in modo
  367. indipendente dallo schermo, dato che non vengono "tagliati" dalla fine della
  368. finestra video, e possono essere visualizzata anche se i bitplanes sono
  369. disabilitati! Una liberazione degli sprites dalla schiavitu' del bplcon0 e dei
  370. diwstart/diwstop!
  371.  
  372.