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

  1.  
  2. ; Lezione15f.s        Sprite in HIRES, largo 16 pixel. Usare il tasto destro
  3. ;            del mouse per scambiare tra LowRes e HighRes
  4.  
  5.     SECTION    AgaRulez,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup2.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001110100000    ; copper, bitplane, sprite DMA
  15.  
  16. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  17.  
  18. START:
  19.  
  20. ;    Puntiamo la PIC "vuota"
  21.  
  22.     MOVE.L    #BITPLANE,d0    ; dove puntare
  23.     LEA    BPLPOINTERS,A1    ; puntatori COP
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.  
  28. ;    Puntiamo tutti gli sprite allo sprite nullo
  29.  
  30.     MOVE.L    #SpriteNullo,d0        ; indirizzo dello sprite in d0
  31.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  32.     MOVEQ    #8-1,d1            ; tutti gli 8 sprite
  33. NulLoop:
  34.     move.w    d0,6(a1)
  35.     swap    d0
  36.     move.w    d0,2(a1)
  37.     swap    d0
  38.     addq.w    #8,a1
  39.     dbra    d1,NulLoop
  40.  
  41. ;    Puntiamo lo sprite
  42.  
  43.     MOVE.L    #MIOSPRITE,d0        ; indirizzo dello sprite in d0
  44.     LEA    SpritePointers,a1    ; Puntatori in copperlist
  45.     move.w    d0,6(a1)
  46.     swap    d0
  47.     move.w    d0,2(a1)
  48.  
  49.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  50.     move.l    #CopList,$80(a5)    ; Puntiamo la nostra COP
  51.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  52.     move.w    #0,$1fc(a5)        ; Fmode azzerato, burst normale
  53.     move.w    #$c00,$106(a5)        ; BPLCON3 resettato
  54.     move.w    #$11,$10c(a5)        ; BPLCON4 resettato
  55.  
  56.     move.b    $dff00a,mouse_y
  57.     move.b    $dff00b,mouse_x
  58.  
  59. mouse:
  60.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  61.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  62. Waity1:
  63.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  64.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  65.     CMPI.L    D2,D0        ; aspetta la linea $120
  66.     BNE.S    Waity1
  67.  
  68.     bsr.s    LeggiMouse    ; questa legge il mouse
  69.     move.w    sprite_y(pc),d0 ; prepara i parametri per la routine
  70.     move.w    sprite_x(pc),d1 ; universale
  71.     lea    miosprite,a1    ; indirizzo sprite
  72.     moveq    #13,d2        ; altezza sprite
  73.     bsr.w    UniMuoviSprite    ; chiama la routine universale
  74.  
  75.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  76.     MOVE.L    #$12000,d2    ; linea da aspettare = $120
  77. Aspetta:
  78.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  79.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  80.     CMPI.L    D2,D0        ; aspetta la linea $120
  81.     BEQ.S    Aspetta
  82.  
  83.     btst.b    #2,$dff016    ; Tasto destro premuto?
  84.     bne.s    NonScambiareRes    ; Se no non cambiare risuluzione allo sprite
  85.  
  86.     bchg.b    #7,BplCon3    ; Se si, cambia da LowRes a Hires o viceversa.
  87.  
  88. NonScambiareRes:
  89.     btst.b    #6,$bfe001    ; mouse premuto?
  90.     bne.s    mouse
  91.     rts
  92.  
  93. ; Questa routine legge il mouse e aggiorna i valori contenuti nelle
  94. ; variabili sprite_x e sprite_y
  95.  
  96. LeggiMouse:
  97.     move.b    $dff00a,d1    ; JOY0DAT posizione verticale mouse
  98.     move.b    d1,d0        ; copia in d0
  99.     sub.b    mouse_y(PC),d0    ; sottrai vecchia posizione mouse
  100.     beq.s    no_vert        ; se la differenza = 0, il mouse e` fermo
  101.     ext.w    d0        ; trasforma il byte in word
  102.                 ; (vedi alla fine del listato)
  103.     add.w    d0,sprite_y    ; modifica posizione sprite
  104. no_vert:
  105.       move.b    d1,mouse_y    ; salva posizione mouse per la prossima volta
  106.  
  107.     move.b    $dff00b,d1    ; posizione orizzontale mouse
  108.     move.b    d1,d0        ; copia in d0
  109.     sub.b    mouse_x(PC),d0    ; sottrai vecchia posizione
  110.     beq.s    no_oriz        ; se la differenza = 0, il mouse e` fermo
  111.     ext.w    d0        ; trasforma il byte in word
  112.                 ; (vedi alla fine del listato)
  113.     add.w    d0,sprite_x    ; modifica pos. sprite
  114. no_oriz
  115.       move.b    d1,mouse_x    ; salva posizione mouse per la prossima volta
  116.     RTS
  117.  
  118. SPRITE_Y:    dc.w    0    ; qui viene memorizzata la Y dello sprite
  119. SPRITE_X:    dc.w    0    ; qui viene memorizzata la X dello sprite
  120. MOUSE_Y:    dc.b    0    ; qui viene memorizzata la Y del mouse
  121. MOUSE_X:    dc.b    0    ; qui viene memorizzata la X del mouse
  122.  
  123.  
  124. ; Routine universale di posizionamento degli sprite.
  125.  
  126. ;
  127. ;    Parametri in entrata di UniMuoviSprite:
  128. ;
  129. ;    a1 = Indirizzo dello sprite
  130. ;    d0 = posizione verticale Y dello sprite sullo schermo (0-255)
  131. ;    d1 = posizione orizzontale X dello sprite sullo schermo (0-320)
  132. ;    d2 = altezza dello sprite
  133. ;
  134.  
  135. UniMuoviSprite:
  136. ; posizionamento verticale
  137.     ADD.W    #$2c,d0        ; aggiungi l'offset dell'inizio dello schermo
  138.  
  139. ; a1 contiene l'indirizzo dello sprite
  140.     MOVE.b    d0,(a1)        ; copia il byte in VSTART
  141.     btst.l    #8,d0
  142.     beq.s    NonVSTARTSET
  143.     bset.b    #2,3(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  144.     bra.s    ToVSTOP
  145. NonVSTARTSET:
  146.     bclr.b    #2,3(a1)    ; Azzera il bit 8 di VSTART (numero < $FF)
  147. ToVSTOP:
  148.     ADD.w    D2,D0        ; Aggiungi l'altezza dello sprite per
  149.                 ; determinare la posizione finale (VSTOP)
  150.     move.b    d0,2(a1)    ; Muovi il valore giusto in VSTOP
  151.     btst.l    #8,d0
  152.     beq.s    NonVSTOPSET
  153.     bset.b    #1,3(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  154.     bra.w    VstopFIN
  155. NonVSTOPSET:
  156.     bclr.b    #1,3(a1)    ; Azzera il bit 8 di VSTOP (numero < $FF)
  157. VstopFIN:
  158.  
  159. ; posizionamento orizzontale
  160.     add.w    #128,D1        ; 128 - per centrare lo sprite.
  161.     btst    #0,D1        ; bit basso della coordinata X azzerato?
  162.     beq.s    BitBassoZERO
  163.     bset    #0,3(a1)    ; Settiamo il bit basso di HSTART
  164.     bra.s    PlaceCoords
  165.  
  166. BitBassoZERO:
  167.     bclr    #0,3(a1)    ; Azzeriamo il bit basso di HSTART
  168. PlaceCoords:
  169.     lsr.w    #1,D1        ; SHIFTIAMO, ossia spostiamo di 1 bit a destra
  170.                 ; il valore di HSTART, per "trasformarlo" nel
  171.                 ; valore fa porre nel byte HSTART, senza cioe'
  172.                 ; il bit basso.
  173.     move.b    D1,1(a1)    ; Poniamo il valore XX nel byte HSTART
  174.     rts
  175.  
  176. ;*****************************************************************************
  177. ;*                COPPERLIST                     *
  178. ;*****************************************************************************
  179.  
  180.     CNOP    0,8    ; Allineo a 64 bit
  181.  
  182.     section    coppera,data_C
  183.  
  184. COPLIST:
  185. SpritePointers:
  186.     dc.w    $120,0,$122,0,$124,0,$126,0,$128,0 ; SPRITE
  187.     dc.w    $12a,0,$12c,0,$12e,0,$130,0,$132,0
  188.     dc.w    $134,0,$136,0,$138,0,$13a,0,$13c,0
  189.     dc.w    $13e,0
  190.  
  191.     dc.w    $8E,$2c81    ; DiwStrt
  192.     dc.w    $90,$2cc1    ; DiwStop
  193.  
  194.     dc.w    $92,$0038    ; DdfStart
  195.     dc.w    $94,$00d0    ; DdfStop
  196.     dc.w    $102,0        ; BplCon1
  197.     dc.w    $104,0        ; BplCon2
  198.     dc.w    $108,-8        ; Bpl1Mod (burst 64bit, modulo=modulo-8)
  199.     dc.w    $10a,-8        ; Bpl2Mod (come sopra)
  200.  
  201.             ; 5432109876543210
  202.     dc.w    $100,%0001001000000001    ; 1 bitplane LORES 320x256.
  203.  
  204.     dc.w    $1fc,3        ; Burst mode a 64 bit
  205.  
  206. BPLPOINTERS:
  207.     dc.w $e0,0,$e2,0    ; primo     bitplane
  208.     dc.w $e4,0,$e6,0    ; secondo       "
  209.     dc.w $e8,0,$ea,0    ; terzo           "
  210.     dc.w $ec,0,$ee,0    ; quarto       "
  211.     dc.w $f0,0,$f2,0    ; quinto       "
  212.     dc.w $f4,0,$f6,0    ; sesto           "
  213.     dc.w $f8,0,$fA,0    ; settimo       "
  214.     dc.w $fC,0,$fE,0    ; ottavo       "
  215.  
  216. ; Da notare che i colori dello sprite sono a 24 bit, anche se sono solo 3.
  217.  
  218.     DC.W    $106,$c00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE ALTI
  219. COLP0:
  220.     dc.w    $180,$000    ; color0    ; sfondo nero
  221.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  222.                         ; in questo caso e' vuoto,
  223.                         ; per cui non compare.
  224.  
  225.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  226.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  227.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  228.  
  229.  
  230.     DC.W    $106,$e00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE BASSI
  231. COLP0B:
  232.     dc.w    $180,$000    ; color0    ; sfondo nero
  233.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  234.                         ; in questo caso e' vuoto,
  235.                         ; per cui non compare.
  236.  
  237.     dc.w    $1A2,$462    ; color17, nibble bassi
  238.     dc.w    $1A4,$2e4    ; color18, nibble bassi
  239.     dc.w    $1A6,$672    ; color19, nibble bassi
  240.  
  241.     dc.w    $106    ; BPLCON3
  242.     dc.b    0
  243. BplCon3:
  244.            ; 76543210
  245.     dc.b    %10000000    ; bit 7: sprites hires o lowres. Se si
  246.                 ; settano sia il bit 7 che il bit 6 lo sprite
  247.                 ; e' in superhires (1280x256), ma viene troppo
  248.                 ; "stretto", credo sia inutile, basta hires!
  249.  
  250.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  251.  
  252.  
  253. ;*****************************************************************************
  254. ;************ Ecco gli sprite: OVVIAMENTE devono essere in CHIP RAM! *********
  255. ;*****************************************************************************
  256.  
  257.     cnop    0,8
  258.  
  259. SpriteNullo:            ; Sprite nullo da puntare in copperlist
  260.     dc.l    0,0,0,0        ; negli eventuali puntatori inutilizzati
  261.  
  262.  
  263.     cnop    0,8
  264.  
  265. MIOSPRITE:        ; lunghezza 13 linee
  266. VSTART:
  267.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  268. HSTART:
  269.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  270. VSTOP:
  271.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  272. VHBITS:
  273.     dc.b $00    ; bit
  274.  
  275.  dc.w    %0000000000000000,%0000110000110000 ; Formato binario per modifiche
  276.  dc.w    %0000000000000000,%0000011001100000
  277.  dc.w    %0000000000000000,%0000001001000000
  278.  dc.w    %0000000110000000,%0011000110001100 ;BINARIO 00=COLORE 0 (TRASPARENTE)
  279.  dc.w    %0000011111100000,%0110011111100110 ;BINARIO 10=COLORE 1 (ROSSO)
  280.  dc.w    %0000011111100000,%1100100110010011 ;BINARIO 01=COLORE 2 (VERDE)
  281.  dc.w    %0000110110110000,%1111100110011111 ;BINARIO 11=COLORE 3 (GIALLO)
  282.  dc.w    %0000011111100000,%0000011111100000
  283.  dc.w    %0000011111100000,%0001111001111000
  284.  dc.w    %0000001111000000,%0011101111011100
  285.  dc.w    %0000000110000000,%0011000110001100
  286.  dc.w    %0000000000000000,%1111000000001111
  287.  dc.w    %0000000000000000,%1111000000001111
  288.  dc.w    0,0    ; 2 word azzerate definiscono la fine dello sprite.
  289.  
  290.  
  291.     cnop    0,8
  292.  
  293.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  294.                     ; perche' per vedere gli sprite
  295.                     ; e' necessario che ci siano bitplanes
  296.                     ; abilitati
  297. BITPLANE:
  298.     ds.b    40*256        ; bitplane azzerato lowres
  299.  
  300.     end
  301.  
  302. In questo listato si notano gia' 2 cose sugli sprite AGA: una cosa e' come
  303. selezionarne la risoluzione, tra LowRes, Hires o SuperHires. In realta' la
  304. risoluzione SuperHires e' inutile, perche' lo sprite viene troppo piccolo.
  305. Un'altra cosa e' che la palette dello sprite e' a 24 bit, come i bitplanes,
  306. per cui si mettono prima i nibble alti, poi i nibble bassi.
  307.  
  308.