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

  1.  
  2. ; Una routine di FADE (ossia dissolvenza) da e verso il NERO. ROUTINE N.1
  3. ; Premere il tasto sinistro e destro
  4.  
  5.     SECTION    Fade1,CODE
  6.  
  7. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  8.  
  9. *****************************************************************************
  10.     include    "startup1.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001110000000    ; solo copper e bitplane DMA
  15. ;         -----a-bcdefghij
  16.  
  17. ;    a: Blitter Nasty
  18. ;    b: Bitplane DMA       (Se non e' settato, spariscono anche gli sprite)
  19. ;    c: Copper DMA
  20. ;    d: Blitter DMA
  21. ;    e: Sprite DMA
  22. ;    f: Disk DMA
  23. ;    g-j: Audio 3-0 DMA
  24.  
  25. START:
  26. ;    puntiamo la figura
  27.  
  28.     MOVE.L    #Logo1,d0    ; dove puntare
  29.     LEA    BPLPOINTERS,A1    ; puntatori COP
  30.     MOVEQ    #4-1,D1        ; numero di bitplanes (qua sono 4)
  31. POINTBP:
  32.     move.w    d0,6(a1)
  33.     swap    d0
  34.     move.w    d0,2(a1)
  35.     swap    d0
  36.     ADD.L    #40*84,d0    ; + lunghezza bitplane (qua e' alto 84 linee)
  37.     addq.w    #8,a1
  38.     dbra    d1,POINTBP
  39.  
  40.  
  41.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  42.                     ; e sprites.
  43.  
  44.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  45.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  46.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  47.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  48.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  49.  
  50.  
  51. mouse1:
  52.     btst    #6,$bfe001    ; mouse premuto?
  53.     bne.s    mouse1
  54.  
  55.     clr.w    FaseDelFade    ; azzera il numero del fotogramma
  56.  
  57. ;    ********** primo fade: dal NERO ai colori *********
  58.  
  59. mouse2:
  60.     CMP.b    #$ff,$dff006    ; linea 255
  61.     bne.s    mouse2
  62. Aspetta1:
  63.     CMP.b    #$ff,$dff006    ; linea 255
  64.     beq.s    Aspetta1
  65.  
  66.     bsr.w    FadeIN        ; Fade!!!
  67.  
  68.     btst    #2,$dff016    ; mouse premuto?
  69.     bne.s    mouse2
  70.  
  71.     move.w    #16,FaseDelFade    ; azzera il numero del fotogramma
  72.  
  73. ;    ********** secondo fade: dai colori al NERO *********
  74.  
  75. mouse3:
  76.     CMP.b    #$ff,$dff006    ; linea 255
  77.     bne.s    mouse3
  78. Aspetta2:
  79.     CMP.b    #$ff,$dff006    ; linea 255
  80.     beq.s    Aspetta2
  81.  
  82.     bsr.w    FadeOUT    ; Fade!!!
  83.  
  84.     btst    #6,$bfe001    ; mouse premuto?
  85.     bne.s    mouse3
  86.     rts
  87.  
  88.  
  89. *****************************************************************************
  90. ;    Routines che aspettano e richiamano Fade al momento giusto
  91. *****************************************************************************
  92.  
  93. FadeIn:
  94.     cmp.w    #17,FaseDelFade
  95.     beq.s    FinitoFadeIn
  96.     moveq    #0,d0
  97.     move.w    FaseDelFade(PC),d0
  98.     moveq    #15-1,d7        ; D7 = Numero di colori
  99.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  100.                     ; della figura da "dissolvere"
  101.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  102.                     ; da notare che parte dal COLOR1 e
  103.                     ; non dal color0, in quanto il color0
  104.                     ; e'=$000 e cosi' rimane.
  105.     bsr.s    Fade
  106.     addq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  107. FinitoFadeIn:
  108.     rts
  109.  
  110.  
  111. FadeOut:
  112.     tst.w    FaseDelFade    ; abbiamo superato l'ultima fase? (16)?
  113.     beq.s    FinitoOut
  114.     subq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  115.     moveq    #0,d0
  116.     move.w    FaseDelFade(PC),d0
  117.     moveq    #15-1,d7        ; D7 = Numero di colori
  118.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  119.                     ; della figura da "dissolvere"
  120.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  121.                     ; da notare che parte dal COLOR1 e
  122.                     ; non dal color0, in quanto il color0
  123.                     ; e'=$000 e cosi' rimane.
  124.     bsr.s    Fade
  125. FinitoOut:
  126.     rts
  127.  
  128. FaseDelFade:        ; fase attuale del fade (0-16)
  129.     dc.w    0
  130.  
  131. *****************************************************************************
  132. *        Routine per Fade In/Out da e verso il NERO            *
  133. * Input:                                    *
  134. *                                        *
  135. * d7 = Numero colori-1                                *
  136. * a0 = Indirizzo tabella con i colori della figura                *
  137. * a1 = Indirizzo primo colore in copperlist                    *
  138. * d0 = Momento del fade, multiplier - per esempio con d0=0 lo schermo        *
  139. *    e' nero totalmente, con d0=8 siamo a meta' fade e con d0=16        *
  140. *    siamo ai colori pieni; dunque ci sono 17 fasi, dalla 0 alla 16.        *
  141. *    Per fare un fade IN, dal nero al colore, si deve dare a ogni        *
  142. *    chiamata alla routine un valore di d0 crescente da 0 a 16        *
  143. *    Per un fade OUT, si dovra' partire da d0=16 fino a d0=0            *
  144. *                                        *
  145. *  Il procedimento di FADE e' quello di moltiplicare ogni componente R,G,B  *
  146. *  del colore per un Multiplier, che va da 0 per il NERO (x*0=0), a 16 per  *
  147. *  i colori normali, dato che poi il colore viene diviso per 16,        *
  148. *  moltiplicare un colore per 16 e ridividerlo non fa che lasciarlo uguale. *
  149. *                                        *
  150. *****************************************************************************
  151.  
  152.  
  153. ;            \   / 
  154. ;            .\-/.
  155. ;        /\ ()   ()
  156. ;       /  \/~---~\.-~^-.
  157. ;    .-~^-./   |   \---.
  158. ;         {    |    }   \
  159. ;       .-~\   |   /~-.
  160. ;      /    \  I  /    \
  161. ;            \/ \/
  162.  
  163. Fade:
  164. ColorLoop:
  165.     moveq    #0,d1        ; azzera D1
  166.     moveq    #0,d2        ; azzera D2
  167.  
  168. ; Trova la componente risultante ROSSA (Red) ed inseriscila in copperlist ($0R)
  169.  
  170.     move.b    (a0)+,d1    ; D1.b = componente RED (ROSSA) del colore
  171.                 ; ossia $0R (la word e' $0RGB)
  172.     mulu.w    d0,d1        ; Moltiplicalo per il livello colore attuale
  173.     lsr.w    #4,d1        ; Dividilo per 16 (con LSR #4), portando il
  174.                 ; risultato a destra (il byte e' %00001111)
  175.     move.b    d1,(a1)+    ; Inserisci la nuova componente ROSSA in
  176.                 ; copperlist (ossia il byte $0R)
  177.  
  178. ; Trova la componente risultante VERDE (Green) e mettila in d1
  179.  
  180.     move.b    (a0),d1        ; D1.b = componente Green,Blue (VERDE,BLU)
  181.                 ; ossia $GB (la word e' $0RGB)
  182.     lsr.b    #4,d1        ; Metti il VERDE tutto a destra spostando
  183.                 ; il valore a destra di 4 bit (1 nibble)
  184.                 ; dunque in d1.b abbiamo solo il verde
  185.     mulu.w    d0,d1        ; Moltiplicalo per il livello colore attuale
  186.     and.b    #$f0,d1        ; Mascheriamo per selezionare solo il risultato
  187.                 ; che a questo punto e' pronto, non occorre
  188.                 ; spostarlo a destra, dato che nel registro
  189.                 ; colore si trova proprio in questa posizione.
  190.                 ; infatti il byte basso e' $GB (la word $0RGB)
  191.  
  192. ;  Trova la componente risultante BLU e mettila in d2
  193.  
  194.     move.b    (a0)+,d2    ; D2.b = componente Green,Blue (VERDE,BLU)
  195.                 ; ossia $GB (la word e' $0RGB)
  196.     and.b    #$0f,d2        ; Mascheriamo per selezionare solo il BLU ($0B)
  197.     mulu.w    d0,d2        ; Moltiplicalo per il livello colore attuale
  198.     lsr.w    #4,d2        ; Dividi per 16, portando il risultato a destra
  199.                 ; in modo che il risultato sia $0B
  200.  
  201. ; Unisci con OR la componente risultante VERDE con quella BLU
  202.  
  203.     or.w    d2,d1        ; OR del BLU con il VERDE per "unirli" nel byte
  204.                 ; finale risultante: $GB
  205.  
  206. ; E metti il byte risultante $GB in copperlist
  207.  
  208.     move.b    d1,(a1)+    ; Inserisci il valore del VERDE e del BLU nel
  209.                 ; byte basso $GB del colore in copperlist
  210.     addq.w    #2,a1        ; Vai al prossimo colore i copperlist, saltando
  211.                 ; la word del $18x
  212.     dbra    d7,ColorLoop    ; ripeti per gli altri colori
  213.     rts
  214.  
  215.  
  216. ; il $180, color0, e' $000, dunque non cambia! La tabella parte dal color1
  217.  
  218. TabColoriPic:
  219.     dc.w $fff,$200,$310,$410,$620,$841,$a73
  220.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  221.  
  222.  
  223. *****************************************************************************
  224. ;            Copper List
  225. *****************************************************************************
  226.     section    copper,data_c        ; Chip data
  227.  
  228. Copperlist:
  229.     dc.w    $8E,$2c81    ; DiwStrt - window start
  230.     dc.w    $90,$2cc1    ; DiwStop - window stop
  231.     dc.w    $92,$38        ; DdfStart - data fetch start
  232.     dc.w    $94,$d0        ; DdfStop - data fetch stop
  233.     dc.w    $102,0        ; BplCon1 - scroll register
  234.     dc.w    $104,0        ; BplCon2 - priority register
  235.     dc.w    $108,0        ; Bpl1Mod - modulo pl. dispari
  236.     dc.w    $10a,0        ; Bpl2Mod - modulo pl. pari
  237.  
  238.             ; 5432109876543210
  239.     dc.w    $100,%0100001000000000    ; BPLCON0 - 4 planes lowres (16 colori)
  240.  
  241. ; Bitplane pointers
  242.  
  243. BPLPOINTERS:
  244.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  245.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  246.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  247.     dc.w $ec,$0000,$ee,$0000    ;quarto     bitplane
  248.  
  249. ; i primi 16 colori sono per il LOGO
  250.  
  251. CopColors:
  252.     dc.w $180,0,$182,0,$184,0,$186,0
  253.     dc.w $188,0,$18a,0,$18c,0,$18e,0
  254.     dc.w $190,0,$192,0,$194,0,$196,0
  255.     dc.w $198,0,$19a,0,$19c,0,$19e,0
  256.  
  257. ;    dc.w $180,$000,$182,$fff,$184,$200,$186,$310
  258. ;    dc.w $188,$410,$18a,$620,$18c,$841,$18e,$a73
  259. ;    dc.w $190,$b95,$192,$db6,$194,$dc7,$196,$111
  260. ;    dc.w $198,$222,$19a,$334,$19c,$99b,$19e,$446
  261.  
  262. ;    Mettiamo un poco di sfumature per la scenografia...
  263.  
  264.     dc.w    $8007,$fffe    ; Wait - $2c+84=$80
  265.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  266.     dc.w    $180,$003    ; color0
  267.     dc.w    $8207,$fffe    ; wait
  268.     dc.w    $180,$005    ; color0
  269.     dc.w    $8507,$fffe    ; wait
  270.     dc.w    $180,$007    ; color0
  271.     dc.w    $8a07,$fffe    ; wait
  272.     dc.w    $180,$009    ; color0
  273.     dc.w    $9207,$fffe    ; wait
  274.     dc.w    $180,$00b    ; color0
  275.  
  276.     dc.w    $9e07,$fffe    ; wait
  277.     dc.w    $180,$999    ; color0
  278.     dc.w    $a007,$fffe    ; wait
  279.     dc.w    $180,$666    ; color0
  280.     dc.w    $a207,$fffe    ; wait
  281.     dc.w    $180,$222    ; color0
  282.     dc.w    $a407,$fffe    ; wait
  283.     dc.w    $180,$001    ; color0
  284.  
  285.     dc.l    $ffff,$fffe    ; Fine della copperlist
  286.  
  287.  
  288. *****************************************************************************
  289. ;                DISEGNO
  290. *****************************************************************************
  291.  
  292.     section    gfxstuff,data_c
  293.  
  294. ; Disegno largo 320 pixel, alto 84, a 4 bitplanes (16 colori).
  295.  
  296. ; Il logo e' copyright FLENDER/RAM JAM
  297.  
  298. Logo1:
  299.     incbin    'logo320*84*16c.raw'
  300.  
  301.     end
  302.  
  303. Questo listato offre la visione di un FADE, ossia di una dissolvenza dal
  304. NERO al colore, e dal colore al NERO. Dato che la routine FADE richiede
  305. di essere richiamata 16 volte per trasformare i colori dal NERO a quelli
  306. finali, e altre 16 volte per tornare al nero dai colori, e' stato necessario
  307. scrivere 2 routines ausiliarie, FadeIn e FadeOut, che richiamano la
  308. routine Fade, quella vera e propria, passandogli un valore del Multiplier
  309. diverso ogni volta, salvata nella label FaseDelFade.
  310. Il procedimento di FADE e' quello di moltiplicare ogni componente R,G,B del
  311. colore per un Multiplier, che va da 0 per il NERO (x*0=0), a 16 per i colori
  312. normali, dato che poi il colore viene diviso per 16, moltiplicare un colore
  313. per 16 e ridividerlo non fa che lasciarlo invariato.
  314. La routine di questo esempio e' la NUMERO 1, e lavora separatamente sui
  315. due bytes della word colore. Il prossimo listato contiene una routine che
  316. usa lo stesso procedimento della moltiplicazione per il multiplier e della
  317. divisione per 16, ma non aggiorna la word colore un byte alla volta, e forse
  318. puo' risultarvi piu' chiara. Comunque, o capite questo esempio o il prossimo!
  319.  
  320.