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

  1.  
  2. ; Lezione9b2.s    LOOP DI BLITTATE DI UNA SOLA LINEA
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup1.s"    ; Salva Copperlist Etc.
  10. *****************************************************************************
  11.  
  12.         ;5432109876543210
  13. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  14.  
  15.  
  16. START:
  17. ;    Puntiamo la PIC "vuota"
  18.  
  19.     MOVE.L    #BITPLANE,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     move.w    d0,6(a1)
  22.     swap    d0
  23.     move.w    d0,2(a1)
  24.  
  25.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  26.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  27.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  28.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  29.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  30.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  31.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  32.  
  33. ; in A0 viene memorizzato l'indirizzo della destinazione che varia di volta in
  34. ; volta. L'indirizzo iniziale e` calcolato per visualizzare la figura alla
  35. ; riga Y=3 a partire dal pixel con X=0
  36.  
  37.     lea    bitplane+(3*20+0/16)*2,a0    ; indirizzo destinazione
  38.     move.w    #200-1,d7            ; numero di loop = 200
  39.  
  40. BlitLoop:
  41.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  42.     MOVE.L    #$10800,d2    ; linea da aspettare = $108
  43. Waity1:
  44.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  45.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  46.     CMPI.L    D2,D0        ; aspetta la linea $108
  47.     BNE.S    Waity1
  48. Waity2:
  49.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  50.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  51.     CMPI.L    D2,D0        ; aspetta la linea $108
  52.     Beq.S    Waity2
  53.  
  54.     btst.b    #6,2(a5) ; dmaconr
  55. WBlit:
  56.     btst.b    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  57.     bne.s    wblit
  58.  
  59. ;              (####)
  60. ;            (#######)
  61. ;          (#########)
  62. ;         (#########)
  63. ;        (#########)
  64. ;       (#########)
  65. ;      (#########)
  66. ;       (o)(o)(##)
  67. ;     ,_c     (##)
  68. ;    /____,   (##)
  69. ;      \     (#)
  70. ;       |    |
  71. ;       oooooo
  72. ;      /      \
  73.  
  74.     move.w    #$ffff,$44(a5)        ; BLTAFWM lo spiegheremo in seguito
  75.     move.w    #$ffff,$46(a5)        ; BLTALWM lo spiegheremo in seguito
  76.     move.w    #$05CC,$40(a5)        ; BLTCON0 (fa una copia da B a D)
  77.     move.w    #$0000,$42(a5)        ; BLTCON1 lo spiegheremo in seguito
  78.     move.w    #$0000,$62(a5)        ; BLTBMOD lo spiegheremo in seguito
  79.     move.w    #$0000,$66(a5)        ; BLTDMOD lo spiegheremo in seguito
  80.     move.l    #figura,$4c(a5)        ; BLTBPT  (fisso alla figura sorgente)
  81.     move.l    a0,$54(a5)        ; BLTDPT  (destinazione variabile a0)
  82.     move.w    #64*1+10,$58(a5)    ; BLTSIZE (via al blitter !)
  83.                     ; ora, invece di 8 word, come nell
  84.                     ; esempio precedente, blittiamo 10 word
  85.  
  86.     add.w    #40,a0            ; andiamo a blittare alla prossima
  87.                     ; linea nel prossimo loop.
  88.     dbra    d7,blitloop
  89.  
  90. mouse:
  91.     btst    #6,$bfe001    ; mouse premuto?
  92.     bne.s    mouse
  93.  
  94.     btst.b    #6,2(a5) ; dmaconr
  95. WBlit2:
  96.     btst.b    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  97.     bne.s    wblit2
  98.  
  99.     rts
  100.  
  101. ;*****************************************************************************
  102.  
  103.     SECTION    GRAPHIC,DATA_C
  104.  
  105. COPPERLIST:
  106.     dc.w    $8E,$2c81    ; DiwStrt
  107.     dc.w    $90,$2cc1    ; DiwStop
  108.     dc.w    $92,$38        ; DdfStart
  109.     dc.w    $94,$d0        ; DdfStop
  110.     dc.w    $102,0        ; BplCon1
  111.     dc.w    $104,0        ; BplCon2
  112.     dc.w    $108,0        ; Bpl1Mod
  113.     dc.w    $10a,0        ; Bpl2Mod
  114.  
  115.     dc.w    $100,$1200    ; bplcon0 - 1 bitplane lowres
  116.  
  117. BPLPOINTERS:
  118.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  119.  
  120.     dc.w    $0180,$000    ; color0
  121.     dc.w    $0182,$eee    ; color1
  122.  
  123.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  124.  
  125. *****************************************************************************
  126.  
  127.     SECTION    Figura_da_blittare,DATA_C
  128.  
  129. Figura:
  130.     dc.w    $8888,$aaaa,$cccc,$f0f0
  131.     dc.w    $ffff,$6666,$eeee,$5555
  132.     dc.w    $2222,$dddd
  133.  
  134. *****************************************************************************
  135.  
  136.     SECTION    PLANEVUOTO,BSS_C    
  137.  
  138. BITPLANE:
  139.     ds.b    40*256        ; bitplane azzerato lowres
  140.  
  141.     end
  142.  
  143. *****************************************************************************
  144.  
  145. Questo esempio e` una variazione dell'esempio lezione9b1.s
  146. Notate come variando l'indirizzo di destinazione i dati vengano copiati
  147. in zone distinte dello schermo. Ogni blittata viene fatta una riga piu` in
  148. basso della precedente. Cio` viene ottenuto aggiungendo sempre 40 (=numero
  149. di bytes per ogni riga) all'indirizzo destinazione.
  150.  
  151. Notate una cosa molto importante: prima di OGNI blittata si aspetta SEMPRE che
  152. il blitter abbia finito la blittata precedente, mediante il loop Wblit.
  153.  
  154. In questo esempio abbiamo usato il canale B come canale sorgente.
  155. Conseguentemente, usiamo i registri BLTBPT e BLTBMOD al posto di BLTAPT e
  156. BLTAMOD; inoltre il valore scritto in BLTCON0 e` diverso, perche` dobbiamo
  157. attivare il canale B invece del canale A (quindi il bit 11 vale 0 e il bit 10
  158. vale 1) e perche` dobbiamo porre i MINTERMS al valore $CC che definisce appunto
  159. una copia dal canale B al canale D
  160.  
  161.