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

  1.  
  2. ; Lezione15f3.s        Sprite largo 64 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    #MIOSPRITE64,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    miosprite64,a1    ; indirizzo sprite
  72.     moveq    #52,d2        ; altezza sprite
  73.     bsr.w    UniMuoviSprite64 ; 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 64 pixel.
  125.  
  126. ;
  127. ;    Parametri in entrata di UniMuoviSprite64:
  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. UniMuoviSprite64:
  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+4+2(a1)    ; Setta il bit 8 di VSTART (numero > $FF)
  144.     bra.s    ToVSTOP
  145. NonVSTARTSET:
  146.     bclr.b    #2,3+4+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+4+2(a1)    ; Muovi il valore giusto in VSTOP
  151.     btst.l    #8,d0
  152.     beq.s    NonVSTOPSET
  153.     bset.b    #1,3+4+2(a1)    ; Setta il bit 8 di VSTOP (numero > $FF)
  154.     bra.w    VstopFIN
  155. NonVSTOPSET:
  156.     bclr.b    #1,3+4+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+4+2(a1)    ; Settiamo il bit basso di HSTART
  164.     bra.s    PlaceCoords
  165.  
  166. BitBassoZERO:
  167.     bclr.b    #0,3+4+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,%1111    ; Burst mode a 64 bit, sprite larghi 64 pixel
  205.  
  206.  
  207. BPLPOINTERS:
  208.     dc.w $e0,0,$e2,0    ; primo     bitplane
  209.     dc.w $e4,0,$e6,0    ; secondo       "
  210.     dc.w $e8,0,$ea,0    ; terzo           "
  211.     dc.w $ec,0,$ee,0    ; quarto       "
  212.     dc.w $f0,0,$f2,0    ; quinto       "
  213.     dc.w $f4,0,$f6,0    ; sesto           "
  214.     dc.w $f8,0,$fA,0    ; settimo       "
  215.     dc.w $fC,0,$fE,0    ; ottavo       "
  216.  
  217. ; Da notare che i colori dello sprite sono a 24 bit, anche se sono solo 3.
  218.  
  219.     DC.W    $106,$c00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE ALTI
  220. COLP0:
  221.     dc.w    $180,$000    ; color0    ; sfondo nero
  222.     dc.w    $182,$123    ; color1    ; colore 1 del bitplane, che
  223.                         ; in questo caso e' vuoto,
  224.                         ; per cui non compare.
  225.  
  226.     dc.w    $1A2,$F00    ; color17, ossia COLOR1 dello sprite0 - ROSSO
  227.     dc.w    $1A4,$0F0    ; color18, ossia COLOR2 dello sprite0 - VERDE
  228.     dc.w    $1A6,$FF0    ; color19, ossia COLOR3 dello sprite0 - GIALLO
  229.  
  230.  
  231.     DC.W    $106,$e00    ; SELEZIONA PALETTE 0 (0-31), NIBBLE BASSI
  232. COLP0B:
  233.     dc.w    $180,$000    ; color0    ; sfondo nero
  234.     dc.w    $182,$000    ; color1    ; colore 1 del bitplane, che
  235.                         ; in questo caso e' vuoto,
  236.                         ; per cui non compare.
  237.  
  238.     dc.w    $1A2,$462    ; color17, nibble bassi
  239.     dc.w    $1A4,$2e4    ; color18, nibble bassi
  240.     dc.w    $1A6,$672    ; color19, nibble bassi
  241.  
  242.     dc.w    $106    ; BPLCON3
  243.     dc.b    0
  244. BplCon3:
  245.            ; 76543210
  246.     dc.b    %00000000    ; bit 7: sprites hires o lowres. Se si
  247.                 ; settano sia il bit 7 che il bit 6 lo sprite
  248.                 ; e' in superhires (1280x256), ma viene troppo
  249.                 ; "stretto", credo sia inutile, basta hires!
  250.  
  251.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  252.  
  253.  
  254. ;*****************************************************************************
  255. ;************ Ecco gli sprite: OVVIAMENTE devono essere in CHIP RAM! *********
  256. ;*****************************************************************************
  257.  
  258.     cnop    0,8
  259.  
  260. SpriteNullo:            ; Sprite nullo da puntare in copperlist
  261.     dc.l    0,0,0,0        ; negli eventuali puntatori inutilizzati
  262.  
  263.  
  264.     cnop    0,8
  265.  
  266. MIOSPRITE64:        ; lunghezza 13*4 linee
  267. VSTART:
  268.     dc.b $50    ; Posizione verticale di inizio sprite (da $2c a $f2)
  269. HSTART:
  270.     dc.b $90    ; Posizione orizzontale di inizio sprite (da $40 a $d8)
  271.     dc.w 0        ; Word + longword aggiunte per raggiungere la doppia
  272.     dc.l 0        ; longword nello sprite largo 64 pixel (2 long!)
  273. VSTOP:
  274.     dc.b $5d    ; $50+13=$5d    ; posizione verticale di fine sprite
  275. VHBITS:
  276.     dc.b $00    ; bit
  277.     dc.w 0        ; Word + longword aggiunte per raggiungere la doppia
  278.     dc.l 0        ; longword nello sprite largo 64 pixel (2 long!)
  279.  
  280.     dc.l    $00000000,$00000000,$00003000,$000c0000 ; Salvato con PicCon
  281.     dc.l    $00000000,$00000000,$00003800,$001c0000
  282.     dc.l    $00000000,$00000000,$00001c00,$00380000
  283.     dc.l    $00000000,$00000000,$00000e00,$00700000
  284.     dc.l    $00000000,$00000000,$00000700,$00e00000
  285.     dc.l    $00000000,$00000000,$00000380,$01c00000
  286.     dc.l    $00000000,$00000000,$000001c0,$03800000
  287.     dc.l    $00000000,$00000000,$000000e0,$07000000
  288.     dc.l    $00000000,$00000000,$00000070,$0e000000
  289.     dc.l    $00000000,$00000000,$00000038,$1c000000
  290.     dc.l    $00000000,$00000000,$00000038,$1c000000
  291.     dc.l    $00000000,$00000000,$0000001c,$38000000
  292.     dc.l    $0000000f,$f0000000,$000f001f,$f800f000
  293.     dc.l    $0000003f,$fc000000,$003f003f,$fc00fc00
  294.     dc.l    $0000007f,$fe000000,$007c007f,$fe003e00
  295.     dc.l    $000000ff,$ff000000,$00f800ff,$ff001f00
  296.     dc.l    $000001ff,$ff800000,$01f001ff,$ff800f80
  297.     dc.l    $000003ff,$ffc00000,$03e003ff,$ffc007c0
  298.     dc.l    $000007ff,$ffe00000,$07c007ff,$ffe003e0
  299.     dc.l    $00000fff,$fff00000,$0f800fff,$fff001f0
  300.     dc.l    $00001fff,$fff80000,$1f001c3f,$fc3800f8
  301.     dc.l    $00003fff,$fffc0000,$3e00381f,$f81c007c
  302.     dc.l    $00003fff,$fffc0000,$7c00300f,$f00c003e
  303.     dc.l    $00007fff,$fffe0000,$fc00700f,$f00e003f
  304.     dc.l    $00007f8f,$f1fe0000,$fffff00f,$f00fffff
  305.     dc.l    $00007f0f,$f0fe0000,$fffff00f,$f00fffff
  306.     dc.l    $00007f0f,$f0fe0000,$fffff80f,$f01fffff
  307.     dc.l    $00007f1f,$f8fe0000,$7ffffc1f,$f83ffffe
  308.     dc.l    $00003fff,$fffc0000,$00003fff,$fffc0000
  309.     dc.l    $00003fff,$fffc0000,$00003fff,$fffc0000
  310.     dc.l    $00001fff,$fff80000,$00007fff,$fffe0000
  311.     dc.l    $00001fff,$fff80000,$0000ffff,$ffff0000
  312.     dc.l    $00000fff,$fff00000,$0001ff80,$01ff8000
  313.     dc.l    $00000fff,$fff00000,$0003ffc0,$03ffc000
  314.     dc.l    $000007ff,$ffe00000,$0007ffe0,$07ffe000
  315.     dc.l    $000003ff,$ffc00000,$0007fff0,$0fffe000
  316.     dc.l    $000001ff,$ff800000,$000ff1ff,$ff8ff000
  317.     dc.l    $000001ff,$ff800000,$001fe1ff,$ff87f800
  318.     dc.l    $000000ff,$ff000000,$003fc0ff,$ff03fc00
  319.     dc.l    $0000007f,$fe000000,$003fc07f,$fe03fc00
  320.     dc.l    $0000003f,$fc000000,$007f803f,$fc01fe00
  321.     dc.l    $0000001f,$f8000000,$007f801f,$f801fe00
  322.     dc.l    $0000000f,$f0000000,$00ff000f,$f000ff00
  323.     dc.l    $00000003,$c0000000,$00ff0003,$c000ff00
  324.     dc.l    $00000000,$00000000,$03fe0000,$00007fc0
  325.     dc.l    $00000000,$00000000,$0ffe0000,$00007ff0
  326.     dc.l    $00000000,$00000000,$3ffe0000,$00007ffc
  327.     dc.l    $00000000,$00000000,$7fff0000,$0000fffe
  328.     dc.l    $00000000,$00000000,$ffff0000,$0000ffff
  329.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  330.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  331.     dc.l    $00000000,$00000000,$ffff8000,$0001ffff
  332.  
  333.     dc.l    0,0,0,0        ; Fine dello sprite (2 doppie longword).
  334.  
  335.     cnop    0,8
  336.  
  337.     SECTION    PLANEVUOTO,BSS_C    ; Il bitplane azzerato che usiamo,
  338.                     ; perche' per vedere gli sprite
  339.                     ; e' necessario che ci siano bitplanes
  340.                     ; abilitati
  341. BITPLANE:
  342.     ds.b    40*256        ; bitplane azzerato lowres
  343.  
  344.     end
  345.  
  346. Avete visto che bell'insettone largo 63 pixel? (ve lo sognate stanotte!)
  347. La routine unimuovisprite e' stata modificata in modo molto semplice.
  348. Infatti i 2 byte VSTOP e VHBITS si sono spostati una word + una long avanti.
  349. Per cui e' bastato sostituire:
  350.  
  351.     2(a1) e 3(a1)
  352.  
  353. In:
  354.  
  355.     2+4+2(a1) e 3+4+2(a1)
  356.  
  357. Niente di piu' facile!
  358.  
  359.