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

  1.  
  2. ; Lezione9h4.s    Sparizione tramite scorrimento verso destra di un immagine
  3. ;        tramite shift + maschera BLTALWM.
  4. ;        Tasto destro per eseguire la blittata, sinistro per uscire.
  5.  
  6.     SECTION    CiriCop,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    %1000001111000000    ; copper,bitplane,blitter DMA
  16.  
  17.  
  18. START:
  19.  
  20.     MOVE.L    #BITPLANE,d0    ; dove puntare
  21.     LEA    BPLPOINTERS,A1    ; puntatori COP
  22.     MOVEQ    #3-1,D1        ; numero di bitplanes (qua sono 3)
  23. POINTBP:
  24.     move.w    d0,6(a1)
  25.     swap    d0
  26.     move.w    d0,2(a1)
  27.     swap    d0
  28.     ADD.L    #40*256,d0        ; + LUNGHEZZA DI UNA PLANE !!!!!
  29.     addq.w    #8,a1
  30.     dbra    d1,POINTBP
  31.  
  32.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  33.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  34.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  35.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  36.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  37.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  38.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  39.  
  40. mouse1:
  41.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  42.     bne.s    mouse1        ; se no, aspetta
  43.  
  44.     bsr.s    Scorri        ; esegui la routine di scorrimento
  45.  
  46. mouse2:
  47.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  48.     bne.s    mouse2        ; se no, torna a mouse2:
  49.  
  50.     rts
  51.  
  52.  
  53. ;******************************************************************************
  54. ; Questa routine fa scomparire progressivamente un immagine
  55. ; facendola scorrere verso destra
  56. ;******************************************************************************
  57.  
  58. ;         .----------.
  59. ;         ¦          ¦
  60. ;         |          |
  61. ;         |          |
  62. ;         | ¯¯¯  --- |
  63. ;        _l___    ___|_
  64. ;       /   _¬\  / _  ¬\
  65. ;     _/   ( °/--\° )   \_
  66. ;    /¬\_____/¯¯¯¯\_____/¬\
  67. ;    \ ____(_,____,_)____ /
  68. ;     \_\ `----------' /_/
  69. ;       \\___      ___//
  70. ;        \__`------'__/
  71. ;          |  ¯¯¯¯  | xCz
  72. ;          `--------'
  73.  
  74. Scorri:
  75.     move.w    #160-1,d7    ; Il loop va eseguito una volta per ogni pixel
  76.                 ; l'immagine e` larga 160 pixel (10 words)
  77.  
  78. ; In questo esempio copiamo un'immagine su se stessa, ma shiftandola
  79. ; continuamente di un pixel, in modo da farla scorrere.
  80. ; Pertanto gli indirizzi sorgente e destinazione sono uguali
  81.  
  82. ScorriLoop:
  83.  
  84. ; Aspetta il vblank in modo da far scorrere l'immagine di un pixel ad ogni
  85. ; fotogramma.
  86.  
  87. WaitWblank:
  88.     CMP.b    #$ff,$dff006        ; vhposr - aspetta la linea 255
  89.     bne.s    WaitWblank
  90. Aspetta:
  91.     CMP.b    #$ff,$dff006        ; vhposr - ancora linea 255 ?
  92.     beq.s    Aspetta
  93.  
  94.     move.l    #bitplane+((20*50)+64/16)*2,d0        ; ind. sorgente e
  95.                             ; destinazione
  96.  
  97.     moveq    #3-1,d5            ; ripeti per ogni plane
  98. PlaneLoop:
  99.     btst    #6,2(a5)    ; dmaconr - aspetta che il blitter finisca
  100. waitblit:
  101.     btst    #6,2(a5)
  102.     bne.s    waitblit
  103.  
  104.     move.l    #$19f00000,$40(a5)    ; BLTCON0 e BLTCON1 - copia da A a D
  105.                     ; con shift di un pixel
  106.  
  107.     move.l    #$fffffffe,$44(a5)    ; BLTAFWM e BLTALWM
  108.                     ; BLTAFWM = $ffff - passa tutto
  109.                     ; BLTALWM = $fffe = %1111111111111110
  110.                     ;        cancella l'ultimo bit
  111.  
  112. ; carica i puntatori
  113.  
  114.     move.l    d0,$50(a5)            ; bltapt - sorgente
  115.     move.l    d0,$54(a5)            ; bltdpt - destinazione
  116.  
  117. ; il modulo e` calcolato come al solito
  118.  
  119.     move.l    #$00140014,$64(a5)        ; bltamod e bltdmod 
  120.     move.w    #(20*64)+160/16,$58(a5)        ; bltsize
  121.                         ; altezza 20 linee
  122.                         ; largo 160 pixel (= 10 words)
  123.  
  124.     add.l    #40*256,d0            ; punta al prossimo plane 
  125.     dbra    d5,PlaneLoop
  126.  
  127.     dbra    d7,ScorriLoop            ; ripeti per ogni pixel
  128.                         
  129.     btst    #6,$02(a5)    ; dmaconr - aspetta che il blitter finisca
  130. waitblit2:
  131.     btst    #6,$02(a5)
  132.     bne.s    waitblit2
  133.     rts
  134.  
  135. ;****************************************************************************
  136.  
  137.     SECTION    GRAPHIC,DATA_C
  138.  
  139. COPPERLIST:
  140.     dc.w    $8E,$2c81    ; DiwStrt
  141.     dc.w    $90,$2cc1    ; DiwStop
  142.     dc.w    $92,$38        ; DdfStart
  143.     dc.w    $94,$d0        ; DdfStop
  144.     dc.w    $102,0        ; BplCon1
  145.     dc.w    $104,0        ; BplCon2
  146.     dc.w    $108,0        ; VALORE MODULO = 0
  147.     dc.w    $10a,0        ; ENTRAMBI I MODULI ALLO STESSO VALORE.
  148.  
  149.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres
  150.  
  151. BPLPOINTERS:
  152.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  153.     dc.w $e4,$0000,$e6,$0000
  154.     dc.w $e8,$0000,$ea,$0000
  155.  
  156.     dc.w    $0180,$000    ; color0
  157.     dc.w    $0182,$475    ; color1
  158.     dc.w    $0184,$fff    ; color2
  159.     dc.w    $0186,$ccc    ; color3
  160.     dc.w    $0188,$999    ; color4
  161.     dc.w    $018a,$232    ; color5
  162.     dc.w    $018c,$777    ; color6
  163.     dc.w    $018e,$444    ; color7
  164.  
  165.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  166.  
  167. ;****************************************************************************
  168.  
  169. BITPLANE:
  170.     incbin    "assembler2:sorgenti6/amiga.raw"
  171.                     ; qua carichiamo la figura in
  172.                     ; formato RAWBLIT (o interleaved),
  173.                     ; convertita col KEFCON.
  174.     end
  175.  
  176. ;****************************************************************************
  177.  
  178. In questo esempio vediamo un nuovo effetto. Faremo sparire un'immagine dallo
  179. schermo facendola scorrere verso destra e cancellando i pixel che arrivano
  180. ad una certa posizione orizzontale. Questo effetto e` ottenuto mediante il
  181. blitter combinando insieme shifting e masking. Lo scorrimento verso destra
  182. e` ottenuto naturalmente mediante lo shift. L'immagine viene letta dallo
  183. schermo (non e` memorizzata in un altro buffer) attraverso il canale A,
  184. viene shiftata di un pixel e riscritta nello schermo nella stessa posizione.
  185. La sorgente e la destinazione coincidono perfettamente. La maschera della
  186. prima word fa passare tutti i bit. La maschera dell'ultima word, invece,
  187. assume il valore %1111111111111110 e quindi cancella il bit piu` a destra.
  188. Se non usassimo questo accorgimento i pixel che escono dalla word piu` a destra
  189. rientrerebbero nella word piu` a sinistra una riga piu` in basso (ne abbiamo
  190. parlato durante la spiegazine dello shift). Poiche` stiamo usando uno schermo
  191. interleaved, la riga piu` in basso appartiene ad un diverso plane, e
  192. se i pixel si spostano da un plane all'altro succede un macello.
  193. Provate a rendervene conto mettendo BLTALWM al valore $ffff.
  194. Grazie alla maschera questo non avviene, perche` la maschera e` applicata al
  195. dato letto PRIMA di fare lo shift.
  196. Quindi il bit che dovrebbe uscire da destra viene azzerato dalla mask.
  197. Una blittata fatta in questo modo fa scorrere la figura a destra di un pixel.
  198. Ripetendo la blittata tante volte quanti sono i pixel che compongono
  199. l'immagine in larghezza (nel nostro caso 160) otteniamo una sparizione completa
  200. dell'immagine.
  201. E` possibile far scorrere l'immagine piu` velocemente utilizzando un valore
  202. di shift maggiore di 1. In questo caso pero` si deve modificare anche la
  203. maschera in modo che cancelli tutti i pixel che lo shift farebbe uscire.
  204. Per esempio usando uno shift di 4 pixel, la maschera deve cancellare i 4 pixel
  205. piu` a destra, perche` altrimenti uscirebbero fuori.
  206. Inoltre poiche` l'immagine scorre piu` velocemente, e` necessario ripetere
  207. meno volte la routine per farla scomparire tutta.
  208. Nel caso di uno shift di 4 pixel, sono necessarie 160/4=40 iterazioni
  209. della routine.
  210. Provate voi a modificare la velocita`, provando altri valori di shift,
  211. per esempio 2,8 o 3.
  212.  
  213.