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

  1.  
  2. ; Lezione15f2.s        Sprite largo 32 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    #MIOSPRITE32,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    miosprite32,a1    ; indirizzo sprite
  72.     moveq    #26,d2        ; altezza sprite
  73.     bsr.w    UniMuoviSprite32 ; 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 larghi 32 pixel.
  125.  
  126. ;
  127. ;    Parametri in entrata di UniMuoviSprite32:
  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. UniMuoviSprite32:
  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+2(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  144.     bra.s    ToVSTOP
  145. NonVSTARTSET:
  146.     bclr.b    #2,3+2(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+2(a1)    ; Muovi il valore giusto in VSTOP
  151.     btst.l    #8,d0
  152.     beq.s    NonVSTOPSET
  153.     bset.b    #1,3+2(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  154.     bra.w    VstopFIN
  155. NonVSTOPSET:
  156.     bclr.b    #1,3+2(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.l    #0,D1        ; bit basso della coordinata X azzerato?
  162.     beq.s    BitBassoZERO
  163.     bset.b    #0,3+2(a1)    ; Settiamo il bit basso di HSTART
  164.     bra.s    PlaceCoords
  165.  
  166. BitBassoZERO:
  167.     bclr.b    #0,3+2(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,%0111    ; Burst mode a 64 bit, sprite larghi 32 pixel
  205.  
  206. ; Quest'altro settaggio e' simile. Provatelo se per problemi di DMA non
  207. ; funzionasse quello sopra.
  208.  
  209. ;    dc.w    $1fc,%1011    ; Burst mode a 64 bit, sprite larghi 32 pixel
  210.  
  211. BPLPOINTERS:
  212.     dc.w $e0,0,$e2,0    ; primo     bitplane
  213.     dc.w $e4,0,$e6,0    ; secondo       "
  214.     dc.w $e8,0,$ea,0    ; terzo           "
  215.     dc.w $ec,0,$ee,0    ; quarto       "
  216.     dc.w $f0,0,$f2,0    ; quinto       "
  217.     dc.w $f4,0,$f6,0    ; sesto           "
  218.     dc.w $f8,0,$fA,0    ; settimo       "
  219.     dc.w $fC,0,$fE,0    ; ottavo       "
  220.  
  221. ; Da notare che i colori dello sprite sono a 24 bit, anche se sono solo 3.
  222.  
  223.     DC.W    $106,$c00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE ALTI
  224. COLP0:
  225.     dc.w    $180,$000    ; color0    ; sfondo nero
  226.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  227.                         ; in questo caso e' vuoto,
  228.                         ; per cui non compare.
  229.  
  230.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  231.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  232.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  233.  
  234.  
  235.     DC.W    $106,$e00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE BASSI
  236. COLP0B:
  237.     dc.w    $180,$000    ; color0    ; sfondo nero
  238.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  239.                         ; in questo caso e' vuoto,
  240.                         ; per cui non compare.
  241.  
  242.     dc.w    $1A2,$462    ; color17, nibble bassi
  243.     dc.w    $1A4,$2e4    ; color18, nibble bassi
  244.     dc.w    $1A6,$672    ; color19, nibble bassi
  245.  
  246.     dc.w    $106    ; BPLCON3
  247.     dc.b    0
  248. BplCon3:
  249.            ; 76543210
  250.     dc.b    %00000000    ; bit 7: sprites hires o lowres. Se si
  251.                 ; settano sia il bit 7 che il bit 6 lo sprite
  252.                 ; e' in superhires (1280x256), ma viene troppo
  253.                 ; "stretto", credo sia inutile, basta hires!
  254.  
  255.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  256.  
  257.  
  258. ;*****************************************************************************
  259. ;************ Ecco gli sprite: OVVIAMENTE devono essere in CHIP RAM! *********
  260. ;*****************************************************************************
  261.  
  262.     cnop    0,8
  263.  
  264. SpriteNullo:            ; Sprite nullo da puntare in copperlist
  265.     dc.l    0,0,0,0        ; negli eventuali puntatori inutilizzati
  266.  
  267.  
  268.     cnop    0,8
  269.  
  270. MIOSPRITE32:        ; lunghezza 13*2 linee
  271. VSTART:
  272.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  273. HSTART:
  274.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  275.     DC.W 0        ; Word "aggiunta" nello sprite largo 32 pixel
  276. VSTOP:
  277.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  278. VHBITS:
  279.     dc.b $00    ; bit
  280.     DC.W 0        ; Word "aggiunta" nello sprite largo 32 pixel
  281.  
  282.  dc.l    %00000000000000000000000000000000,%00000000011000000000011000000000
  283.  dc.l    %00000000000000000000000000000000,%00000000011100000000111000000000
  284.  dc.l    %00000000000000000000000000000000,%00000000001110000001110000000000
  285.  dc.l    %00000000000000000000000000000000,%00000000000111000011100000000000
  286.  dc.l    %00000000000000000000000000000000,%00000000000011000011000000000000
  287.  dc.l    %00000000000000000000000000000000,%00000000000011100111000000000000
  288.  dc.l    %00000000000000111100000000000000,%00000111000001111110000011100000
  289.  dc.l    %00000000000001111110000000000000,%00001110000001111110000001110000
  290.  dc.l    %00000000000111111111100000000000,%00011100000111111111100000111000
  291.  dc.l    %00000000001111111111110000000000,%00111000001111111111110000011100
  292.  dc.l    %00000000001111111111110000000000,%01110000011001111110011000001110
  293.  dc.l    %00000000011111111111111000000000,%11110000110000111100001100001111
  294.  dc.l    %00000000111100111100111100000000,%11111111110000111100001111111111
  295.  dc.l    %00000000111100111100111100000000,%01111111111000111100011111111110
  296.  dc.l    %00000000011111111111111000000000,%00000000011111111111111000000000
  297.  dc.l    %00000000001111111111110000000000,%00000000111111111111111100000000
  298.  dc.l    %00000000001111111111110000000000,%00000001111110000001111110000000
  299.  dc.l    %00000000000111111111100000000000,%00000011111111000011111111000000
  300.  dc.l    %00000000000011111111000000000000,%00000111110011111111001111100000
  301.  dc.l    %00000000000011111111000000000000,%00001111100011111111000111110000
  302.  dc.l    %00000000000001111110000000000000,%00001111000001111110000011110000
  303.  dc.l    %00000000000000011000000000000000,%00001111000000011000000011110000
  304.  dc.l    %00000000000000000000000000000000,%11111111000000000000000011111111
  305.  dc.l    %00000000000000000000000000000000,%11111111000000000000000011111111
  306.  dc.l    %00000000000000000000000000000000,%11111111000000000000000011111111
  307.  dc.l    %00000000000000000000000000000000,%11111111000000000000000011111111
  308.  dc.l    0,0        ; Fine dello sprite (2 longword anziche' 2 word).
  309.  
  310. ; BINARIO 00=COLORE 0 (TRASPARENTE)
  311. ; BINARIO 10=COLORE 1 (ROSSO)
  312. ; BINARIO 01=COLORE 2 (VERDE)
  313. ; BINARIO 11=COLORE 3 (GIALLO)
  314.  
  315.     cnop    0,8
  316.  
  317.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  318.                     ; perche' per vedere gli sprite
  319.                     ; e' necessario che ci siano bitplanes
  320.                     ; abilitati
  321. BITPLANE:
  322.     ds.b    40*256        ; bitplane azzerato lowres
  323.  
  324.     end
  325.  
  326. Avete visto che bell'insettone largo 32 pixel?
  327. La routine unimuovisprite e' stata modificata in modo molto semplice.
  328. Infatti i 2 byte VSTOP e VHBITS si sono spostati una word avanti.
  329. Per cui e' bastato sostituire:
  330.  
  331.     2(a1) e 3(a1)
  332.  
  333. In:
  334.  
  335.     2+2(a1) e 3+2(a1)
  336.  
  337. Niente di piu' facile! (Vi immaginerete come fare UniMuoviSprite 64 pixel!)
  338.  
  339.