home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti6 / lezione10c1.s < prev    next >
Text File  |  1995-10-23  |  8KB  |  264 lines

  1.  
  2. ; Lezione10c1.s    BLITTATA, in cui costruiamo la maschera di un disegno
  3. ;        Alternare i tasti del mouse per vedere le blittate
  4.  
  5.     SECTION    CiriCop,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    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16.  
  17. START:
  18.  
  19.     MOVE.L    #BITPLANE1,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #3-1,D1        ; numero di bitplanes
  22. POINTBP:
  23.     move.w    d0,6(a1)
  24.     swap    d0
  25.     move.w    d0,2(a1)
  26.     swap    d0
  27.     ADD.L    #40*256,d0    ; + lunghezza bitplane (qua e' alto 256 linee)
  28.     addq.w    #8,a1
  29.     dbra    d1,POINTBP
  30.  
  31.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  32.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  33.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  34.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  35.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  36.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  37.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  38.  
  39. ; copia l'immagine normalmente
  40.  
  41.     lea    FiguraPlane1,a0        ; copia il primo plane
  42.     lea    BITPLANE1,a1
  43.     bsr.s    copia
  44.  
  45.     lea    FiguraPlane2,a0        ; copia secondo plane
  46.     lea    BITPLANE2,a1
  47.     bsr.s    copia
  48.  
  49.     lea    FiguraPlane3,a0        ; copia terzo plane
  50.     lea    BITPLANE3,a1
  51.     bsr.s    copia
  52.  
  53. mouse1:
  54.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  55.     bne.s    mouse1
  56.  
  57. ; copia primo bitplane
  58.  
  59.     lea    FiguraPlane1,a0
  60.     lea    BITPLANE1+14,a1
  61.     bsr.s    BlitOR        ; esegue un OR tra il plane 1 della figura
  62.                 ; e la destinazione (vuota)
  63.  
  64. mouse2:
  65.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  66.     bne.s    mouse2        ; se no, torna a mouse2:
  67.  
  68.     lea    FiguraPlane2,a0
  69.     lea    BITPLANE1+14,a1
  70.     bsr.s    BlitOR        ; esegue un OR tra il plane 2 della figura
  71.                 ; e la destinazione (plane 1 della figura)
  72. mouse3:
  73.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  74.     bne.s    mouse3
  75.  
  76.     lea    FiguraPlane3,a0
  77.     lea    BITPLANE1+14,a1
  78.     bsr.s    BlitOR        ; esegue un OR tra il plane 3 della figura
  79.                 ; e la destinazione (plane 1 OR 2 della figura)
  80. mouse4:
  81.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  82.     bne.s    mouse4
  83.     rts
  84.  
  85. ;****************************************************************************
  86. ; Questa routine copia la figura sullo schermo.
  87. ;
  88. ; A0 - indirizzo sorgente
  89. ; A1 - indirizzo destinazione
  90. ;****************************************************************************
  91.  
  92. Copia:
  93.     btst    #6,2(a5) ; dmaconr
  94. WBlit1:
  95.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  96.     bne.s    wblit1
  97.  
  98.     move.l    #$ffffffff,$44(a5)    ; maschere
  99.     move.l    #$09f00000,$40(a5)    ; BLTCON0  e BLTCON1 (usa A+D)
  100.                     ; copia normale
  101.     move.w    #0,$64(a5)        ; BLTAMOD (=0)
  102.     move.w    #34,$66(a5)        ; BLTDMOD (40-6=34)
  103.     move.l    a0,$50(a5)        ; BLTAPT  puntatore sorgente
  104.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  105.     move.w    #(64*42)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  106.                     ; larghezza 3 word
  107.     rts                ; altezza 42 linee
  108.  
  109. ;****************************************************************************
  110. ; Questa routine esegue un OR tra la sorgente e la destinazione.
  111. ; Usa i canali B,C e D. La sorgente viene letta attraverso il canale C.
  112. ; La destinazione invece viene letta dal canale B e poi riscritta tramite il D.
  113. ; Per conseguenza i canali B e D hanno lo stesso modulo e gli stessi indirizzi
  114. ; di partenza.
  115. ;
  116. ; Parametri:
  117. ;
  118. ; A0 - indirizzo sorgente
  119. ; A1 - indirizzo destinazione
  120. ;****************************************************************************
  121.  
  122. ;                     _____
  123. ;                    (_____)
  124. ;                      ,,,
  125. ;     __n____________.|o o|.____________n__
  126. ;    == _o_|         |  -  |         |_o_ ==
  127. ;     ¯¯ . |   ____  |\ O /|  ____   |   ¯¯
  128. ;          |__/    \ ||`*'|| /    \_#| :
  129. ;        :         | ||   || |      `:
  130. ;        .         |#._______|         .
  131. ;                  ! |  o  |
  132. ;                    (     )
  133. ;                    |  U  |
  134. ;                    :  !  :
  135.  
  136.  
  137. BlitOR:
  138.     btst    #6,2(a5) ; dmaconr
  139. WBlit2:
  140.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  141.     bne.s    wblit2
  142.  
  143.     move.l    #$07EE0000,$40(a5)    ; BLTCON0 e BLTCON1
  144.                     ; esegue un OR tra B e C
  145.                     ; D=B OR C
  146.     move.w    #0,$60(a5)        ; BLTCMOD (=0)
  147.     move.w    #34,$66(a5)        ; BLTDMOD (40-6=34)
  148.     move.w    #34,$62(a5)        ; BLTBMOD (40-6=34)
  149.     move.l    a0,$48(a5)        ; BLTCPT  puntatore sorgente
  150.     move.l    a1,$4c(a5)        ; BLTBPT  puntatore destinazione
  151.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  152.     move.w    #(64*42)+3,$58(a5)    ; BLTSIZE (via al blitter !)
  153.                     ; larghezza 3 word
  154.     rts                ; altezza 42 linee
  155.  
  156. ;****************************************************************************
  157.  
  158.     SECTION    GRAPHIC,DATA_C
  159.  
  160. COPPERLIST:
  161.     dc.w    $8E,$2c81    ; DiwStrt
  162.     dc.w    $90,$2cc1    ; DiwStop
  163.     dc.w    $92,$38        ; DdfStart
  164.     dc.w    $94,$d0        ; DdfStop
  165.     dc.w    $102,0        ; BplCon1
  166.     dc.w    $104,0        ; BplCon2
  167.     dc.w    $108,0        ; Bpl1Mod
  168.     dc.w    $10a,0        ; Bpl2Mod
  169.  
  170.     dc.w    $100,$3200    ; bplcon0
  171.  
  172. BPLPOINTERS:
  173.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  174.     dc.w $e4,$0000,$e6,$0000
  175.     dc.w $e8,$0000,$ea,$0000
  176.  
  177.     dc.w    $180,$000    ; color0
  178.     dc.w    $182,$aaa    ; color1
  179.     dc.w    $184,$b00    ; color2
  180.     dc.w    $186,$080    ; color3
  181.     dc.w    $188,$24c
  182.     dc.w    $18a,$eb0
  183.     dc.w    $18c,$b52
  184.     dc.w    $18e,$0cc
  185.  
  186.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  187.  
  188. ;****************************************************************************
  189.  
  190. ; Questa e` la figura
  191.  
  192. FiguraPlane1:
  193.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$c0000000
  194.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$c0000000
  195.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$c0000000
  196.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$c0000000
  197.     dc.l    0,0,0,0,0,0
  198.     dc.l    0,0,0,0,0,$3fffff80
  199.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  200.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  201.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  202.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  203.     dc.l    $3fff,$ff800000,0
  204.  
  205. FiguraPlane2:
  206.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  207.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  208.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  209.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  210.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,$3fffff80
  211.     dc.l    $3fff,$ff800000,$3fffff80,$3fff,$ff800000,0
  212.     dc.l    0,0,0,0,0,0
  213.     dc.l    0,0,0,0,0,0
  214.     dc.l    0,0,0,0,0,0
  215.     dc.l    0,0,0,0,0,0
  216.     dc.l    0,0,0
  217.  
  218. FiguraPlane3:
  219.     dc.l    0,0,0,0,0,0
  220.     dc.l    0,0,0,0,0,0
  221.     dc.l    0,0,0,0,0,0
  222.     dc.l    0,0,0,0,0,0
  223.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$c0000000
  224.     dc.l    $ffffc000,$ffff,$c0000000,$ffffc000,$ffff,$ffffff80
  225.     dc.l    $ffffffff,$ff80ffff,$ffffff80,$ffffffff,$ff80ffff,$ffffff80
  226.     dc.l    $f000ffff,$ff80f000,$ffffff80,$f000ffff,$ff80f000,$ffffff80
  227.     dc.l    $f000ffff,$ff80f000,$ffffff80,$f000ffff,$ff80f000,$ffffff80
  228.     dc.l    $f000ffff,$ff80f000,$ffffff80,$f000ffff,$ff80f000,$ffffff80
  229.     dc.l    $ffffffff,$ff800000,0
  230.  
  231. ;****************************************************************************
  232.  
  233.     SECTION    bitplane,BSS_C
  234.  
  235. BITPLANE1:
  236.     ds.b    40*256
  237. BITPLANE2:
  238.     ds.b    40*256
  239. BITPLANE3:
  240.     ds.b    40*256
  241.  
  242.     end
  243.  
  244. ;****************************************************************************
  245.  
  246. In questo esempio costruiamo con il blitter la maschera di una figura,
  247. ovverosia la sua "ombra". Per farlo e` necessario eseguire un OR tra i bit
  248. planes della figura. In questo esempio eseguiamo questa operazione
  249. un passo alla volta. Per prima cosa facciamo l'OR tra il primo bitplane
  250. della figura e la destinazione nella quale disegneremo la maschera.
  251. Poiche` all'inizio la destinazione e` vuota questo passo e` equivalente ad
  252. una semplice copia del primo plane della figura. Come secondo passo
  253. eseguiamo l'OR tra il secondo plane e la destinazione. Poiche` la destinazione
  254. contiene il primo plane, in pratica eseguiamo l'OR tra il plane 1 e il plane 2.
  255. Come terzo passo eseguiamo l'OR tra il plane 3 e la destinazione. Poiche` la
  256. destinazione contiene l'OR di plane 1 e plane 2, come risultato otterremo
  257. l'OR di tutti e 3 i planes. Se avessimo avuto una figura con piu` di 3 planes,
  258. avremmo dovuto ripetere questo stesso procedimento anche per gli altri planes.
  259. La blittata avviene utilizzando 3 canali. I planes della figura vengono letti
  260. attraverso il canale C. La destinazione invece viene letta attraverso il canale
  261. B e poi riscritta attraverso il canale D. Il valore di LF e` calcolato per
  262. effettuare l'OR dei canali B e C.
  263.  
  264.