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

  1.  
  2. ; Una routine di FADE (ossia dissolvenza) da e verso il NERO. ROUTINE N.2
  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. 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.     bsr.w    FadeIN        ; Fade!!!
  65.  
  66.     btst    #2,$dff016    ; mouse premuto?
  67.     bne.s    mouse2
  68.  
  69.     move.w    #16,FaseDelFade    ; parti dal fotogramma 16
  70.  
  71. mouse3:
  72.     CMP.b    #$ff,$dff006    ; linea 255
  73.     bne.s    mouse3
  74. Aspetta2:
  75.     CMP.b    #$ff,$dff006    ; linea 255
  76.     beq.s    Aspetta2
  77.  
  78.     bsr.w    FadeOUT    ; Fade!!!
  79.  
  80.     btst    #6,$bfe001    ; mouse premuto?
  81.     bne.s    mouse3
  82.  
  83.     rts
  84.  
  85.  
  86. *****************************************************************************
  87. ;    Routines che aspettano e richiamano Fade al momento giusto
  88. *****************************************************************************
  89.  
  90. FadeIn:
  91.     cmp.w    #17,FaseDelFade
  92.     beq.s    FinitoFadeIn
  93.     moveq    #0,d0
  94.     move.w    FaseDelFade(PC),d0
  95.     moveq    #15-1,d7        ; D7 = Numero di colori
  96.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  97.                     ; della figura da "dissolvere"
  98.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  99.                     ; da notare che parte dal COLOR1 e
  100.                     ; non dal color0, in quanto il color0
  101.                     ; e'=$000 e cosi' rimane.
  102.     bsr.s    Fade
  103.     addq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  104. FinitoFadeIn:
  105.     rts
  106.  
  107.  
  108. FadeOut:
  109.     tst.w    FaseDelFade    ; abbiamo superato l'ultima fase? (16)?
  110.     beq.s    FinitoOut
  111.     subq.w    #1,FaseDelFade    ; sistema per la prossima volta la fase da fare
  112.     moveq    #0,d0
  113.     move.w    FaseDelFade(PC),d0
  114.     moveq    #15-1,d7        ; D7 = Numero di colori
  115.     lea    TabColoriPic(PC),a0    ; A0 = indirizzo tabella dei colori
  116.                     ; della figura da "dissolvere"
  117.     lea    CopColors+6,a1        ; A1 = indirizzo colori in copperlist
  118.                     ; da notare che parte dal COLOR1 e
  119.                     ; non dal color0, in quanto il color0
  120.                     ; e'=$000 e cosi' rimane.
  121.     bsr.s    Fade
  122. FinitoOut:
  123.     rts
  124.  
  125. FaseDelFade:        ; fase attuale del fade (0-16)
  126.     dc.w    0
  127.  
  128. *****************************************************************************
  129. *        Routine per Fade In/Out da e verso il NERO (versione 2)        *
  130. * Input:                                    *
  131. *                                        *
  132. * d7 = Numero colori-1                                *
  133. * a0 = Indirizzo tabella con i colori della figura                *
  134. * a1 = Indirizzo primo colore in copperlist                    *
  135. * d0 = Momento del fade, multiplier - per esempio con d0=0 lo schermo        *
  136. *    e' bianco totalmente, con d0=8 siamo a meta' fade e con d0=16        *
  137. *    siamo ai colori pieni; dunque ci sono 17 fasi, dalla 0 alla 16.        *
  138. *    Per fare un fade IN, dal bianco al colore, si deve dare a ogni        *
  139. *    chiamata alla routine un valore di d0 crescente da 0 a 16        *
  140. *    Per un fade OUT, si dovra' partire da d0=16 fino a d0=0            *
  141. *                                        *
  142. *  Il procedimento di FADE e' quello di moltiplicare ogni componente R,G,B  *
  143. *  del colore per un Multiplier, che va da 0 per il NERO (x*0=0), a 16 per  *
  144. *  i colori normali, dato che poi il colore viene diviso per 16,        *
  145. *  moltiplicare un colore per 16 e ridividerlo non fa che lasciarlo uguale. *
  146. *                                        *
  147. *****************************************************************************
  148.  
  149. ;       .      .-~\
  150. ;      / `-'\.'    `- :
  151. ;      |    /          `._
  152. ;      |   |   .-.        {
  153. ;       \  |   `-'         `.
  154. ;     .  \ |                /
  155. ;    ~-.`. \|            .-~_
  156. ;      `.\-.\       .-~      \
  157. ;        `-'/~~ -.~          /
  158. ;      .-~/|`-._ /~~-.~ -- ~
  159. ;     /  |  \    ~- . _\
  160.  
  161. Fade:
  162. ;    Calcola la componente BLU
  163.  
  164.     MOVE.W    (A0),D4        ; Metti il colore dalla tabella colori in d4
  165.     AND.W    #$00f,D4    ; Seleziona solo la componente blu ($RGB->$00B)
  166.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  167.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  168.     AND.W    #$00f,D4    ; Seleziona solo la componente BLU
  169.     MOVE.W    D4,D5        ; Salva la componente BLU in d5
  170.  
  171. ;    Calcola la componente VERDE (GREEN)
  172.  
  173.     MOVE.W    (A0),D4        ; Metti il colore dalla tabella colori in d4
  174.     AND.W    #$0f0,D4    ; Selez. solo la componente verde ($RGB->$0G0)
  175.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  176.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  177.     AND.W    #$0f0,D4    ; Seleziona solo la componente VERDE
  178.     OR.W    D4,D5        ; Salva la comp.verde assieme a quella BLU
  179.  
  180. ;    Calcola la componente ROSSA (RED)
  181.  
  182.     MOVE.W    (A0)+,D4    ; leggi il colore dalla tabella
  183.                 ; e fai puntare a0 al prossimo col.
  184.     AND.W    #$f00,D4    ; Selez. solo la componente rossa ($RGB->$R00)
  185.     MULU.W    D0,D4        ; Moltiplica per la fase del fade (0-16)
  186.     ASR.W    #4,D4        ; shift 4 BITS a destra, ossia divisione per 16
  187.     AND.W    #$f00,D4    ; Selez. solo la componente rossa ($RGB->$R00)
  188.     OR.W    D4,D5        ; Salva la c. ROSSA assieme alla BLU e VERDE
  189.  
  190.     MOVE.W    D5,(A1)        ; E metti il colore $0RGB finale in copperlist
  191.     addq.w    #4,a1        ; prossimo colore in copperlist
  192.     DBRA    D7,Fade        ; fai tutti i colori
  193.     rts
  194.  
  195.  
  196. ; il $180, color0, e' $000, dunque non cambia! La tabella parte dal color1
  197.  
  198. TabColoriPic:
  199.     dc.w $fff,$200,$310,$410,$620,$841,$a73
  200.     dc.w $b95,$db6,$dc7,$111,$222,$334,$99b,$446
  201.  
  202.  
  203. *****************************************************************************
  204. ;            Copper List
  205. *****************************************************************************
  206.     section    copper,data_c        ; Chip data
  207.  
  208. Copperlist:
  209.     dc.w    $8E,$2c81    ; DiwStrt - window start
  210.     dc.w    $90,$2cc1    ; DiwStop - window stop
  211.     dc.w    $92,$38        ; DdfStart - data fetch start
  212.     dc.w    $94,$d0        ; DdfStop - data fetch stop
  213.     dc.w    $102,0        ; BplCon1 - scroll register
  214.     dc.w    $104,0        ; BplCon2 - priority register
  215.     dc.w    $108,0        ; Bpl1Mod - modulo pl. dispari
  216.     dc.w    $10a,0        ; Bpl2Mod - modulo pl. pari
  217.  
  218.             ; 5432109876543210
  219.     dc.w    $100,%0100001000000000    ; BPLCON0 - 4 planes lowres (16 colori)
  220.  
  221. ; Bitplane pointers
  222.  
  223. BPLPOINTERS:
  224.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  225.     dc.w $e4,$0000,$e6,$0000    ;secondo bitplane
  226.     dc.w $e8,$0000,$ea,$0000    ;terzo     bitplane
  227.     dc.w $ec,$0000,$ee,$0000    ;quarto     bitplane
  228.  
  229. ; i primi 16 colori sono per il LOGO
  230.  
  231. CopColors:
  232.     dc.w $180,0,$182,0,$184,0,$186,0
  233.     dc.w $188,0,$18a,0,$18c,0,$18e,0
  234.     dc.w $190,0,$192,0,$194,0,$196,0
  235.     dc.w $198,0,$19a,0,$19c,0,$19e,0
  236.  
  237. ;    dc.w $180,$000,$182,$fff,$184,$200,$186,$310
  238. ;    dc.w $188,$410,$18a,$620,$18c,$841,$18e,$a73
  239. ;    dc.w $190,$b95,$192,$db6,$194,$dc7,$196,$111
  240. ;    dc.w $198,$222,$19a,$334,$19c,$99b,$19e,$446
  241.  
  242. ;    Mettiamo un poco di sfumature per la scenografia...
  243.  
  244.     dc.w    $8007,$fffe    ; Wait - $2c+84=$80
  245.     dc.w    $100,$200    ; bplcon0 - no bitplanes
  246.     dc.w    $180,$003    ; color0
  247.     dc.w    $8207,$fffe    ; wait
  248.     dc.w    $180,$005    ; color0
  249.     dc.w    $8507,$fffe    ; wait
  250.     dc.w    $180,$007    ; color0
  251.     dc.w    $8a07,$fffe    ; wait
  252.     dc.w    $180,$009    ; color0
  253.     dc.w    $9207,$fffe    ; wait
  254.     dc.w    $180,$00b    ; color0
  255.  
  256.     dc.w    $9e07,$fffe    ; wait
  257.     dc.w    $180,$999    ; color0
  258.     dc.w    $a007,$fffe    ; wait
  259.     dc.w    $180,$666    ; color0
  260.     dc.w    $a207,$fffe    ; wait
  261.     dc.w    $180,$222    ; color0
  262.     dc.w    $a407,$fffe    ; wait
  263.     dc.w    $180,$001    ; color0
  264.  
  265.     dc.l    $ffff,$fffe    ; Fine della copperlist
  266.  
  267.  
  268. *****************************************************************************
  269. ;                DISEGNO
  270. *****************************************************************************
  271.  
  272.     section    gfxstuff,data_c
  273.  
  274. ; Disegno largo 320 pixel, alto 84, a 4 bitplanes (16 colori).
  275.  
  276. Logo1:
  277.     incbin    'logo320*84*16c.raw'
  278.  
  279.     end
  280.  
  281. Questa routine funziona esattamente come la precedente, ma non scrive la
  282. word colore un byte alla volta. Questa routine si presta di piu' alle modifiche
  283. per farla divenire AGA. Infatti la vedremo "AGhizzAta" nella lezione sull'AGA.
  284. Il discorso della moltiplicazione e della divisione delle componenti R,G,B
  285. sara' ampliato ad un byte per ogni componente R,G,B.
  286.  
  287.