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

  1.  
  2. ; Lezione9c3.s    BLITTATA con modulo negativo.
  3. ;        Tasto sinistro per eseguire la blittata, destro per uscire.
  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. ;    Puntiamo la PIC "vuota"
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     move.w    d0,6(a1)
  23.     swap    d0
  24.     move.w    d0,2(a1)
  25.  
  26.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  27.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  28.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  29.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  30.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  31.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  32.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  33.  
  34. Aspettasin:
  35.     btst    #6,$bfe001    ; aspetta la pressione del tasto sin. mouse
  36.     bne.s    Aspettasin
  37.  
  38.     btst    #6,2(a5) ; dmaconr
  39. WBlit:
  40.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  41.     bne.s    wblit
  42. ;          __
  43. ;         /\ \
  44. ;        /  \ \
  45. ;       / /\ \ \
  46. ;      / / /\ \ \
  47. ;     / / /__\_\ \
  48. ;    / / /________\
  49. ;    \/___________/        ; i 2 registri seguenti li spiegheremo in
  50.                 ; seguito:
  51.  
  52.     move.w    #$ffff,$44(a5)    ; bltafwm - maschera canale A, prima word
  53.     move.w    #$ffff,$46(a5)    ; bltalwm - mask canale A, seconda word
  54.  
  55.     move.w    #$09f0,$40(a5)    ; bltcon0 - canali A e D abilitati, 
  56.                 ; MINTERMS=$f0, ossia copia da A a D
  57.  
  58.     move.w    #$0000,$42(a5)        ; bltcon1 - lo spiegheremo in seguito
  59.  
  60.     move.w    #2*(20-8),$66(a5)    ; BLTDMOD - come al solito.
  61.  
  62.     move.w    #-16,$64(a5)        ; BLTAMOD - la figura e` larga 8 words
  63.                     ; (16 bytes): per tornare all'inizio
  64.                     ; mettiamo il modulo negativo.
  65.  
  66.     move.l    #figura_a_caso,$50(a5)    ; bltapt - indirizzo figura sorgente
  67.  
  68. ; L'indirizzo della destinazione dipende dalla posizione X,Y in cui vogliamo
  69. ; disegnare il primo pixel della figura. Si applicano le regole della lezione
  70. ; In questo caso X=32 e Y=4.
  71.  
  72.     move.l    #bitplane+(4*20+32/16)*2,$54(a5)    ; bltdpt - ind. dest.
  73.     move.w    #64*10+8,$58(a5)        ; bltsize - altezza 10 linee,
  74.                         ; larghezza 8 words.
  75.  
  76. mouse:
  77.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  78.     bne.s    mouse
  79.  
  80.     btst    #6,2(a5) ; dmaconr
  81. WBlit2:
  82.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  83.     bne.s    wblit2
  84.  
  85.     rts
  86.  
  87.  
  88. ;*****************************************************************************
  89.  
  90.     SECTION    GRAPHIC,DATA_C
  91.  
  92. COPPERLIST:
  93.     dc.w    $8E,$2c81    ; DiwStrt
  94.     dc.w    $90,$2cc1    ; DiwStop
  95.     dc.w    $92,$38        ; DdfStart
  96.     dc.w    $94,$d0        ; DdfStop
  97.     dc.w    $102,0        ; BplCon1
  98.     dc.w    $104,0        ; BplCon2
  99.     dc.w    $108,0        ; Bpl1Mod
  100.     dc.w    $10a,0        ; Bpl2Mod
  101.  
  102.     dc.w    $100,$1200    ; bplcon0 - 1 bitplane lowres
  103.  
  104. BPLPOINTERS:
  105.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  106.  
  107.     dc.w    $0180,$000    ; color0
  108.     dc.w    $0182,$eee    ; color1
  109.  
  110.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  111.  
  112. ;*****************************************************************************
  113.  
  114. ; Questa e' la "figura" che viene copiata nel BITPLANE con una blittata:
  115.  
  116. Figura_a_caso:    
  117.     dc.w    $1111,$1010,$2044,$235a
  118.     dc.w    $18f0,$97ff,$ca54,$90a2
  119.  
  120.  
  121.     SECTION    PLANEVUOTO,BSS_C
  122.  
  123. BITPLANE:
  124.     ds.b    40*256        ; bitplane azzerato lowres
  125.  
  126.     end
  127.  
  128. ;*****************************************************************************
  129.  
  130. In questo esempio abbiamo una figura alta una sola linea che dobbiamo copiare
  131. a partire da una certa riga dello schermo, 10 volte, ogni volta scendendo
  132. di una riga. Naturalmente potremmo semplicemente fare un loop di 10 blittate,
  133. modificando ogni volta l'indirizzo destinazione. E` possibile pero` farlo con
  134. una sola blittata, mettendo un valore negativo al modulo della sorgente.
  135. Come sapete, il valore del modulo viene aggiunto all'indirizzo contenuto
  136. nel registro puntatore, ogni volta che il blitter finisce di blittare una riga.
  137. Normalmente nel modulo si mette un valore positivo che permette al blitter
  138. di "saltare" le word che non appartengono al rettangolo, andando alla riga
  139. successiva. Se pero` il modulo ha un valore negativo, fara` "tornare indietro"
  140. l'indirizzo contenuto nel registro puntatore. In particolare se la blittata
  141. e` larga L words, blittando una riga il valore contenuto nel puntatore
  142. aumentera` di 2*L (perche` il puntatore conta i bytes, e 1 word = 2 bytes).
  143. Se mettiamo nel modulo il valore -2*L, faremo ritornare il puntatore
  144. esattamente all'inizio della riga. In questo esempio facciamo proprio questo
  145. con la sorgente, rileggendo ogni volta la stessa linea. Per la destinazione
  146. invece, ci comportiamo normalmente, e quindi le 10 linee vengono scritte
  147. una sotto l'altra.
  148. Se vi ricordate abbiamo fatto un effetto simile con i moduli dei bitplanes,
  149. mettendoli a -40, ottenendo un "allungamento" infinito della prima linea,
  150. ma solo a livello di visualizzazione. In questo caso col blitter invece e'
  151. proprio in MEMORIA che riscriviamo la stessa linea varie volte.
  152.  
  153.