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

  1.  
  2. ; Lezione10g1.s    BLITTATA, in cui disegnamo rettangoli a righe sullo schermo
  3. ;        Tasto destro per eseguire la blittata, sinistro 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.  
  19.     MOVE.L    #BITPLANE1,d0    ; dove puntare
  20.     LEA    BPLPOINTERS,A1    ; puntatori COP
  21.     MOVEQ    #1-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. ; parametri per routine di disegno
  40.  
  41.     move.w    #16,d0            ; X vertice superiore sinistro
  42.     move.w    #10,d1            ; Y vertice superiore sinistro
  43.     move.w    #48,d2            ; larghezza
  44.     move.w    #20,d3            ; altezza
  45.     move.w    #$aaaa,d4        ; "pattern" di disegno
  46.     bsr.s    BlitRett        ; esegui la routine di disegno
  47.  
  48. mouse1:
  49.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  50.     bne.s    mouse1
  51.  
  52. ; parametri per routine di disegno
  53.  
  54.     move.w    #64,d0            ; X vertice superiore sinistro
  55.     move.w    #70,d1            ; Y vertice superiore sinistro
  56.     move.w    #32,d2            ; larghezza
  57.     move.w    #40,d3            ; altezza
  58.     move.w    #$8FF1,d4        ; "pattern" di disegno
  59.     bsr.s    BlitRett        ; esegui la routine di disegno
  60.  
  61. mouse2:
  62.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  63.     bne.s    mouse2        ; se no, torna a mouse2:
  64.  
  65.     rts
  66.  
  67. ;****************************************************************************
  68. ; Questa routine disegna un rettangolo sullo schermo.
  69. ;
  70. ; D0 - coordinata X del vertice superiore sinistro
  71. ; D1 - coordinata Y del vertice superiore sinistro
  72. ; D2 - larghezza rettangolo in pixel
  73. ; D3 - altezza rettangolo
  74. ; D4 - "pattern" con cui disegnare un rettangolo
  75. ;****************************************************************************
  76.  
  77. ;                 |\__/,|   (`\
  78. ;                 |o o  |__ _) )
  79. ;               _.( T   )  `  /
  80. ;     n n._    ((_ `^--' /_<  \
  81. ;     <" _ }=- `` `-'(((/  (((/
  82. ;      `" "
  83.  
  84. BlitRett:
  85.     btst    #6,2(a5) ; dmaconr
  86. WBlit1:
  87.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  88.     bne.s    wblit1
  89.  
  90. ; calcolo indirizzo di partenza del blitter
  91.  
  92.     lea    bitplane1,a1    ; indirizzo bitplane
  93.     mulu.w    #40,d1        ; offset Y
  94.     add.l    d1,a1        ; aggiungi ad indirizzo
  95.     lsr.w    #3,d0        ; dividi per 8 la X
  96.     and.w    #$fffe,d0    ; rendilo pari
  97.     add.w    d0,a1        ; somma all'indirizzo del bitplane, trovando
  98.                 ; l'indirizzo giusto di destinazione
  99.  
  100. ; calcolo modulo blitter
  101.  
  102.     lsr.w    #3,d2        ; dividi per 8 la larghezza
  103.     and.w    #$fffe,d2    ; azzerro il bit 0 (rendo pari)
  104.     move.w    #40,d5        ; larghezza schermo in bytes
  105.     sub.w    d2,d5        ; modulo=larg. schermo-larg. rettangolo
  106.  
  107. ; calcolo dimensione blittata
  108.  
  109.     lsl.w    #6,d3        ; altezza per 64
  110.     lsr.w    #1,d2        ; larghezza in pixel diviso 16
  111.                 ; cioe` larghezza in words
  112.     or    d2,d3        ; metti insieme le dimensioni
  113.  
  114. ; carica i registri
  115.  
  116.     move.l    #$01f00000,$40(a5)    ; BLTCON0 e BLTCON1
  117.                     ; usa SOLO il canale D
  118.                     ; LF=$F0 (copia da A a D)
  119.                     ; modo ascendente
  120.  
  121.     move.w    d4,$74(a5)        ; BLTADAT
  122.     move.w    d5,$66(a5)        ; BLTDMOD
  123.     move.l    a1,$54(a5)        ; BLTDPT  puntatore destinazione
  124.     move.w    d3,$58(a5)        ; BLTSIZE (via al blitter !)
  125.  
  126.     rts
  127.  
  128. ;****************************************************************************
  129.  
  130.     SECTION    GRAPHIC,DATA_C
  131.  
  132. COPPERLIST:
  133.     dc.w    $8E,$2c81    ; DiwStrt
  134.     dc.w    $90,$2cc1    ; DiwStop
  135.     dc.w    $92,$38        ; DdfStart
  136.     dc.w    $94,$d0        ; DdfStop
  137.     dc.w    $102,0        ; BplCon1
  138.     dc.w    $104,0        ; BplCon2
  139.     dc.w    $108,0        ; Bpl1Mod
  140.     dc.w    $10a,0        ; Bpl2Mod
  141.  
  142.     dc.w    $100,$1200    ; bplcon0 - 1 bitplane lowres
  143.  
  144. BPLPOINTERS:
  145.     dc.w $e0,$0000,$e2,$0000    ;primo     bitplane
  146.  
  147.     dc.w    $0180,$000    ; color0
  148.     dc.w    $0182,$aaa    ; color1
  149.  
  150.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  151.  
  152. ;****************************************************************************
  153.  
  154.     SECTION    bitplane,BSS_C
  155.  
  156. BITPLANE1:
  157.     ds.b    40*256
  158.  
  159. ;****************************************************************************
  160.  
  161.     end
  162.  
  163. In questo esempio usiamo il blitter per disegnare dei rettangoli con un
  164. "pattern", ovvero con un motivo grafico che si ripete.
  165. Utilizziamo una routine parametrica, che traccia un rettangolo conoscendo le
  166. coordinate del vertice superiore sinistro e le dimensioni (larghezza e altezza)
  167. del rettangolo. Per semplificare la routine la larghezza e la posizione X
  168. del vertice sono approssimate a multipli di 16.
  169. Anche il "pattern" viene passato come parametro in un registro. In questo modo
  170. con una sola routine possiamo tracciare tutti i "pattern" che vogliamo.
  171.  
  172. Il disegno viene realizzato mediante una blittata che prevede l'attivazione del
  173. solo canale D, ma che copia il contenuto del registro BLTADAT in uscita.
  174. Si deve utilizzare lo stesso valore di LF che si usa nella copia normale da A
  175. a D, ma non si deve attivare il canale A. pertanto il valore da scrivere in
  176. BLTCON0 e` $01F0, ovvero LF=$F0 (copia da A a D) e attivo il solo canale D.
  177. Il valore del "pattern" che verra` copiato in uscita viene scritto nel registro
  178. BLTADAT.
  179.  
  180.