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

  1.  
  2. ; Una routine di FADE (ossia dissolvenza) da e verso il QUALSIASI COLORE
  3. ; Premere il tasto sinistro e destro alternativamente per vedere i vari
  4. ; utilizzi della routine e per uscire
  5.  
  6.     SECTION    Fade1,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup1.s"    ; Salva Copperlist Etc.
  12. *****************************************************************************
  13.  
  14.         ;5432109876543210
  15. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  16. ;         -----a-bcdefghij
  17.  
  18. ;    a: Blitter Nasty
  19. ;    b: Bitplane DMA       (Se non e' settato, spariscono anche gli sprite)
  20. ;    c: Copper DMA
  21. ;    d: Blitter DMA
  22. ;    e: Sprite DMA
  23. ;    f: Disk DMA
  24. ;    g-j: Audio 3-0 DMA
  25.  
  26. START:
  27. ;    puntiamo la figura
  28.  
  29.     MOVE.L    #Logo1,d0    ; dove puntare
  30.     LEA    BPLPOINTERS,A1    ; puntatori COP
  31.     MOVEQ    #4-1,D1        ; numero di bitplanes (qua sono 4)
  32. POINTBP:
  33.     move.w    d0,6(a1)
  34.     swap    d0
  35.     move.w    d0,2(a1)
  36.     swap    d0
  37.     ADD.L    #40*84,d0    ; + lunghezza bitplane (qua e' alto 84 linee)
  38.     addq.w    #8,a1
  39.     dbra    d1,POINTBP
  40.  
  41.  
  42.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  43.                     ; e sprites.
  44.  
  45.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  46.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  47.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  48.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  49.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  50.  
  51. mouse1:
  52.     btst    #6,$bfe001    ; mouse premuto?
  53.     bne.s    mouse1
  54.  
  55. ;    ********** primo fade: dal NERO ai colori *********
  56.  
  57. mouse2:
  58.     CMP.b    #$ff,$dff006    ; linea 255
  59.     bne.s    mouse2
  60. Aspetta1:
  61.     CMP.b    #$ff,$dff006    ; linea 255
  62.     beq.s    Aspetta1
  63.  
  64.     lea    Cstart1-2,a1    ; Start-colour-table
  65.     lea    Cend1-2,a2    ; End-colour-table
  66.     bsr.w    dofade        ; Fade!!!
  67.  
  68.  
  69.     btst    #2,$dff016    ; mouse premuto?
  70.     bne.s    mouse2
  71.  
  72.     clr.w    FaseDelFade        ; azzera il numero del fotogramma
  73.  
  74. ;    ********** secondo fade: dai colori al NERO *********
  75.  
  76. mouse3:
  77.     CMP.b    #$ff,$dff006    ; linea 255
  78.     bne.s    mouse3
  79. Aspetta2:
  80.     CMP.b    #$ff,$dff006    ; linea 255
  81.     beq.s    Aspetta2
  82.  
  83.     lea    Cstart2-2,a1    ; Start-colour-table
  84.     lea    Cend2-2,a2    ; End-colour-table
  85.     bsr.w    dofade        ; Fade!!!
  86.  
  87.  
  88.     btst    #6,$bfe001    ; mouse premuto?
  89.     bne.s    mouse3
  90.  
  91.     clr.w    FaseDelFade        ; azzera il numero del fotogramma
  92.  
  93. ;    ********** terzo fade: dal BIANCO ai colori *********
  94.  
  95. mouse4:
  96.     CMP.b    #$ff,$dff006    ; linea 255
  97.     bne.s    mouse4
  98. Aspetta3:
  99.     CMP.b    #$ff,$dff006    ; linea 255
  100.     beq.s    Aspetta3
  101.  
  102.     lea    Cstart3-2,a1    ; Start-colour-table
  103.     lea    Cend3-2,a2    ; End-colour-table
  104.     bsr.w    dofade        ; Fade!!!
  105.  
  106.  
  107.     btst    #2,$dff016    ; mouse premuto?
  108.     bne.s    mouse4
  109.  
  110.     clr.w    FaseDelFade        ; azzera il numero del fotogramma
  111.  
  112. ;    ********** quarto fade: dai COLORI ad altri colori diversi! *********
  113.  
  114. mouse5:
  115.     CMP.b    #$ff,$dff006    ; linea 255
  116.     bne.s    mouse5
  117. Aspetta4:
  118.     CMP.b    #$ff,$dff006    ; linea 255
  119.     beq.s    Aspetta4
  120.  
  121.     lea    Cstart4-2,a1    ; Start-colour-table
  122.     lea    Cend4-2,a2    ; End-colour-table
  123.     bsr.w    dofade        ; Fade!!!
  124.  
  125.  
  126.     btst    #6,$bfe001    ; mouse premuto?
  127.     bne.s    mouse5
  128.  
  129.     clr.w    FaseDelFade        ; azzera il numero del fotogramma
  130.  
  131. ;    ********** quinto fade: dai COLORI ad altri colori diversi! *********
  132.  
  133. mouse6:
  134.     CMP.b    #$ff,$dff006    ; linea 255
  135.     bne.s    mouse6
  136. Aspetta5:
  137.     CMP.b    #$ff,$dff006    ; linea 255
  138.     beq.s    Aspetta5
  139.  
  140.     lea    Cstart5-2,a1    ; Start-colour-table
  141.     lea    Cend5-2,a2    ; End-colour-table
  142.     bsr.w    dofade        ; Fade!!!
  143.  
  144.     btst    #2,$dff016    ; mouse premuto?
  145.     bne.s    mouse6
  146.  
  147.     rts
  148.  
  149.  
  150. *****************************************************************************
  151. *    Routine per Fade In/Out da e verso qualsiasi colore!            *
  152. * Input:                                    *
  153. *                                        *
  154. * d6 = Numero colori-1                                *
  155. * a1 = Indirizzo tabella1 con i colori della figura (sorgente)            *
  156. * a2 = Indirizzo tabella2 con i colori della figura (destinazione)        *
  157. * a0 = Indirizzo primo colore in copperlist                    *
  158. * label FaseDelFade usata come il d0 per le routines precedenti,        *
  159. *   = Momento del fade, multiplier, in questo caso pero' occorre azzerarlo  *
  160. *     semplicemente per far partire un nuovo fade                *
  161. *                                        *
  162. *  Il funzionamento della routine e' piu' complesso delle precedenti, e     *
  163. *  per la verita' non mi ricordo neppure io come funziona esattamente.      *
  164. *  Leggete i miei vecchi commenti, comunque basta che sappiate come usarla  *
  165. *                                        *
  166. *****************************************************************************
  167.  
  168. ;               .--._.--. 
  169. ;              ( O     O ) 
  170. ;              /   . .   \ 
  171. ;             .`._______.'. 
  172. ;            /(    \_/    )\ 
  173. ;          _/  \  \   /  /  \_ 
  174. ;       .~   `  \  \ /  /  '   ~. 
  175. ;      {    -.   \  V  /   .-    } 
  176. ;    _ _`.    \  |  |  |  /    .'_ _ 
  177. ;    >_       _} |  |  | {_       _< 
  178. ;     /. - ~ ,_-'  .^.  `-_, ~ - .\ 
  179. ;             '-'|/   \|`-` 
  180.  
  181. dofade:
  182.     cmp.w    #17,FaseDelFade    ; abbiamo superato l'ultima fase? (16)?
  183.     beq.s    FadeFinito
  184.     lea    CopColors+2,a0    ; Copper
  185.     move.w    #15-1,d6    ; No.  colours
  186.     bsr.w    fade2        ; Do fading!
  187. FadeFinito:
  188.     rts
  189.  
  190. ; Uses d0-d6/a0-a2
  191.  
  192. fade2:
  193. f2main:
  194.     addq.w    #4,a0    ; vai al prossimo registro colore in copperlist
  195.     addq.w    #2,a1    ; vai al prossimo colore della tabella colori sorg.
  196.     addq.w    #2,a2    ; idem per la tabella colori destinaz.
  197.     move.w    (a0),d0        ; colore dalla copperlist in d0
  198.     move.w    (a2),d1        ; col. tab destinazione in d1
  199.     cmp.w    d0,d1        ; sono uguali?
  200.     beq.w    ProssimoColore        ; se si, vai al prossimo colore
  201.     move.w    FaseDelFade(PC),d4    ; fase del fade in d4 (0-16)
  202.     clr.w    ColoreFinale        ; azzera il colore finale
  203.  
  204. ;    BLU
  205.  
  206.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  207.     move.w    (a2),d2        ; colore tab destinazione in d2
  208.     and.l    #$00f,d0    ; selez. solo il BLU dal colore tab sorgente
  209.     and.l    #$00f,d2    ; idem per colore tab destinazione
  210.     cmp.w    d2,d0        ; i BLU sorg. e destinazione sono uguali?
  211.     bhi.b    SottraiD2    ; se d2>d0, FadCh1a
  212.     beq.b    SottraiD2    ; se sono uguali, Sottrai d2
  213.     sub.w    d0,d2        ; se d2<d0, subba d0 a d2!
  214.     bra.b    SottFatto
  215. SottraiD2:
  216.     sub.w    d2,d0        ; altrimenti subba d2 a d0!
  217.     bra.b    SottFatto2
  218.  
  219. SottFatto:
  220.     move.w    d2,d0
  221. SottFatto2:
  222.     moveq    #16,d1
  223.     bsr.w    dodivu
  224.     and.w    #$00f,d1    ; seleziona solo BLU
  225.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  226.     move.w    (a2),d2        ; colore tab destinazione in d2
  227.     and.w    #$00f,d0    ; selez. solo il BLU dal colore tab sorgente
  228.     and.w    #$00f,d2    ; idem per colore tab destinazione
  229.     cmp.w    d0,d2        ; i BLU sorg. e destinazione sono uguali?
  230.     bhi.b    SommaD1        ; se d0>d2, somma d1 a d0
  231.     beq.b    OkBlu        ; se sono uguali, ok
  232.     sub.w    d1,d0        ; d0=d0-d1
  233.     bra.b    OkBlu
  234. SommaD1:
  235.     add.w    d1,d0        ; d0=d0+d1
  236. OkBlu:
  237.     move.w    d0,ColoreFinale    ; Salviamo il BLU finale
  238.  
  239. ; VERDE
  240.  
  241.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  242.     move.w    (a2),d2        ; colore tab destinazione in d2
  243.     and.l    #$0f0,d0    ; selez. solo il VERDE dal colore tab sorgente
  244.     and.l    #$0f0,d2    ; idem per colore tab destinazione
  245.     cmp.w    d2,d0        ; i VERDE sorg. e destinazione sono uguali?
  246.     bhi.b    SottraiD2v    ; se d2>d0, FadCh1a
  247.     beq.b    SottraiD2v    ; se sono uguali, Sottrai d2
  248.     sub.w    d0,d2        ; se d2<d0, subba d0 a d2!
  249.     bra.b    SottFattov
  250. SottraiD2v:
  251.     sub.w    d2,d0        ; altrimenti subba d2 a d0!
  252.     bra.b    SottFatto2v
  253.  
  254. SottFattov:
  255.     move.w    d2,d0
  256. SottFatto2v:
  257.     moveq    #16,d1
  258.     bsr.w    dodivu
  259.     and.w    #$0f0,d1    ; seleziona solo VERDE
  260.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  261.     move.w    (a2),d2        ; colore tab destinazione in d2
  262.     and.w    #$0f0,d0    ; selez. solo il VERDE dal colore tab sorgente
  263.     and.w    #$0f0,d2    ; idem per colore tab destinazione
  264.     cmp.w    d0,d2        ; i VERDE sorg. e destinazione sono uguali?
  265.     bhi.b    SommaD1v    ; se d0>d2, somma d1 a d0
  266.     beq.b    OkVERDE        ; se sono uguali, ok
  267.     sub.w    d1,d0        ; d0=d0-d1
  268.     bra.b    OkVERDE
  269. SommaD1v:
  270.     add.w    d1,d0        ; d0=d0+d1
  271. OkVERDE:
  272.     or.w    d0,ColoreFinale    ; con l'OR sistema la componente verde
  273.  
  274. ;    ROSSO
  275.  
  276.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  277.     move.w    (a2),d2        ; colore tab destinazione in d2
  278.     and.l    #$f00,d0    ; selez. solo il ROSSO dal colore tab sorgente
  279.     and.l    #$f00,d2    ; idem per colore tab destinazione
  280.     cmp.w    d2,d0        ; i ROSSO sorg. e destinazione sono uguali?
  281.     bhi.b    SottraiD2r    ; se d2>d0, FadCh1a
  282.     beq.b    SottraiD2r    ; se sono uguali, Sottrai d2
  283.     sub.w    d0,d2        ; se d2<d0, subba d0 a d2!
  284.     bra.b    SottFattor
  285. SottraiD2r:
  286.     sub.w    d2,d0        ; altrimenti subba d2 a d0!
  287.     bra.b    SottFatto2r
  288.  
  289. SottFattor:
  290.     move.w    d2,d0
  291. SottFatto2r:
  292.     moveq    #16,d1
  293.     bsr.w    dodivu
  294.     and.w    #$f00,d1    ; seleziona solo ROSSO
  295.     move.w    (a1),d0        ; colore attuale della tab sorgente in d0
  296.     move.w    (a2),d2        ; colore tab destinazione in d2
  297.     and.w    #$f00,d0    ; selez. solo il ROSSO dal colore tab sorgente
  298.     and.w    #$f00,d2    ; idem per colore tab destinazione
  299.     cmp.w    d0,d2        ; i ROSSO sorg. e destinazione sono uguali?
  300.     bhi.b    SommaD1r    ; se d0>d2, somma d1 a d0
  301.     beq.b    OkROSSO        ; se sono uguali, ok
  302.     sub.w    d1,d0        ; d0=d0-d1
  303.     bra.b    OkROSSO
  304. SommaD1r:
  305.     add.w    d1,d0        ; d0=d0+d1
  306. OkROSSO:
  307.     or.w    d0,ColoreFinale    ; con l'OR sistema la componente rossa
  308.  
  309. ;    Metti il colore in copperlist!
  310.  
  311.     move.w    ColoreFinale(PC),(a0)    ; e metti il colore finale in copper!
  312.  
  313. ProssimoColore:
  314.     dbra    d6,f2main    ; ripeti per ogni colore
  315.  
  316.     addq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  317. nocrs:
  318.     rts
  319.  
  320. ***
  321. *    Input -> D0 = Numeratore
  322. *         D1 = Denominatore    (16)
  323. *         D4 = * fattore di moltiplicazione
  324. *
  325. * Output -> D1 = Risultato
  326. ***
  327.  
  328. DoDivu:
  329.     divu.w    d1,d0    ; divisione per 16, non ottimizzabilr con lsr
  330.     move.l    d0,d1
  331.     swap    d1
  332.     move.l    #$31000,d2    ;$10003 (65539) divu 16
  333.     moveq    #0,d3
  334.     move.w    d1,d3
  335.     mulu.w    d3,d2
  336.     move.w    d2,d1
  337.  
  338.     and.l    #$ffff,d1
  339.     mulu.w    d4,d1        ; moltiplica per la fase del fade
  340.     swap    d1
  341.     mulu.w    d4,d0        ; moltiplica per la fase del fade
  342.     add.w    d0,d1
  343.     and.l    #$ffff,d1
  344.     rts
  345.  
  346. FaseDelFade:        ; fase attuale del fade (0-16)
  347.     dc.w    0
  348.  
  349. ;    In questa label viene salvato il colore finale ogni volta
  350.  
  351. ColoreFinale:
  352.     dc.w    0
  353.  
  354. ; ---
  355.  
  356. Cstart1:
  357.     dcb.w    15,0    ; partiamo dal nero
  358. Cend1:
  359.     dc.w $fff,$200,$310,$410,$620,$841,$a73        ; e arriviamo ai colori
  360.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  361. ;=----------
  362.  
  363. Cstart2:
  364.     dc.w $fff,$200,$310,$410,$620,$841,$a73        ; partiamo dai colori
  365.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  366. Cend2:
  367.     dcb.w    15,0            ; e finiamo al nero
  368. ;=----------
  369.  
  370. Cstart3:
  371.     dcb.w    15,$FFF    ; partiamo dal BIANCO
  372. Cend3:
  373.     dc.w $fff,$200,$310,$410,$620,$841,$a73        ; e arriviamo ai colori
  374.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  375. ;=----------
  376.  
  377. Cstart4:
  378.     dc.w $fff,$200,$310,$410,$620,$841,$a73        ; partiamo dai colori
  379.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  380. Cend4:
  381.     dc.w $fff,$020,$031,$041,$062,$184,$3a7        ; e arriviamo colori
  382.     dc.w $5b9,$6db,$7dc,$111,$222,$433,$b99,$644    ; diversi! (tono verde)
  383. ;=----------
  384.  
  385. Cstart5:
  386.     dc.w $fff,$020,$031,$041,$062,$184,$3a7        ; partiamo dai colori
  387.     dc.w $5b9,$6db,$7dc,$111,$222,$433,$b99,$644    ; diversi! (tono verde)
  388. Cend5:
  389.     dc.w $fff,$002,$013,$014,$026,$148,$37a        ; ad altri ancora
  390.     dc.w $59b,$6bd,$7cd,$111,$222,$334,$99b,$446    ; diversi! (tono blu)
  391. ;=----------
  392.  
  393.  
  394. ; il $180, color0, e' $000, dunque non cambia! La tabella parte dal color1
  395.  
  396. TabColoriPic:
  397.     dc.w $fff,$200,$310,$410,$620,$841,$a73
  398.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  399.  
  400.  
  401. *****************************************************************************
  402. ;            Copper List
  403. *****************************************************************************
  404.     section    copper,data_c        ; Chip data
  405.  
  406. Copperlist:
  407.     dc.w    $8E,$2c81    ; DiwStrt - window start
  408.     dc.w    $90,$2cc1    ; DiwStop - window stop
  409.     dc.w    $92,$38        ; DdfStart - data fetch start
  410.     dc.w    $94,$d0        ; DdfStop - data fetch stop
  411.     dc.w    $102,0        ; BplCon1 - scroll register
  412.     dc.w    $104,0        ; BplCon2 - priority register
  413.     dc.w    $108,0        ; Bpl1Mod - modulo pl. dispari
  414.     dc.w    $10a,0        ; Bpl2Mod - modulo pl. pari
  415.  
  416.             ; 5432109876543210
  417.     dc.w    $100,%0100001000000000    ; BPLCON0 - 4 planes lowres (16 colori)
  418.  
  419. ; Bitplane pointers
  420.  
  421. BPLPOINTERS:
  422.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  423.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  424.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  425.     dc.w $ec,$0000,$ee,$0000    ;quarto     bitplane
  426.  
  427. ; i primi 16 colori sono per il LOGO
  428.  
  429. CopColors:
  430.     dc.w $180,0,$182,0,$184,0,$186,0
  431.     dc.w $188,0,$18a,0,$18c,0,$18e,0
  432.     dc.w $190,0,$192,0,$194,0,$196,0
  433.     dc.w $198,0,$19a,0,$19c,0,$19e,0
  434.  
  435. ;    Mettiamo un poco di sfumature per la scenografia...
  436.  
  437.     dc.w    $8007,$fffe    ; Wait - $2c+84=$80
  438.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  439.     dc.w    $180,$003    ; color0
  440.     dc.w    $8207,$fffe    ; wait
  441.     dc.w    $180,$005    ; color0
  442.     dc.w    $8507,$fffe    ; wait
  443.     dc.w    $180,$007    ; color0
  444.     dc.w    $8a07,$fffe    ; wait
  445.     dc.w    $180,$009    ; color0
  446.     dc.w    $9207,$fffe    ; wait
  447.     dc.w    $180,$00b    ; color0
  448.  
  449.     dc.w    $9e07,$fffe    ; wait
  450.     dc.w    $180,$999    ; color0
  451.     dc.w    $a007,$fffe    ; wait
  452.     dc.w    $180,$666    ; color0
  453.     dc.w    $a207,$fffe    ; wait
  454.     dc.w    $180,$222    ; color0
  455.     dc.w    $a407,$fffe    ; wait
  456.     dc.w    $180,$001    ; color0
  457.  
  458.     dc.l    $ffff,$fffe    ; Fine della copperlist
  459.  
  460.  
  461. *****************************************************************************
  462. ;                DISEGNO
  463. *****************************************************************************
  464.  
  465.     section    gfxstuff,data_c
  466.  
  467. ; Disegno largo 320 pixel, alto 84, a 4 bitplanes (16 colori).
  468.  
  469. Logo1:
  470.     incbin    'logo320*84*16c.raw'
  471.  
  472.     end
  473.  
  474. Ecco una routine che "trasforma" i colori come vogliamo.
  475. Il principio di funzionamento e' piu' complesso di un normale fade, quindi
  476. basta che capiate come si puo' usare. Se volete friggervi il cervello,
  477. comunque, ho messo dei commenti.
  478.  
  479.