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

  1.  
  2. ; Lezione10q.s    Riempimento un poligono con linee con pendenza < di 45 gradi
  3. ;        tasto destro per blittare, 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. ;    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.     bsr.w    InitLine    ; inizializza line-mode
  35.  
  36.     move.w    #$ffff,d0    ; linea continua
  37.     bsr.w    SetPattern    ; definisce pattern
  38.  
  39.     move.w    #34,d0        ; x1
  40.     move.w    #25,d1        ; y1
  41.     move.w    #130,d2        ; x2
  42.     move.w    #80,d3        ; y2
  43.     lea    bitplane,a0
  44.     bsr.w    DrawlineFill
  45.  
  46.     move.w    #220,d0        ; x1
  47.     move.w    #25,d1        ; y1
  48.     move.w    #140,d2        ; x2
  49.     move.w    #80,d3        ; y2
  50.     lea    bitplane,a0
  51.     bsr.s    DrawlineFill
  52.  
  53. mouse1:
  54.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  55.     bne.s    mouse1
  56.  
  57.     move.w    #0,d0            ; inclusivo
  58.     move.w    #0,d1            ; CARRYIN=0
  59.     lea    bitplane+180*40+30,a0
  60.     bsr.s    Fill
  61.  
  62. mouse2:
  63.     btst    #6,$bfe001    ; mouse premuto?
  64.     bne.s    mouse2
  65.     rts
  66.  
  67.  
  68. ;****************************************************************************
  69. ; Questa routine copia un rettangolo di schermo da una posizione fissa
  70. ; ad un indirizzo specificato come parametro. Il rettangolo di schermo che
  71. ; viene copiato racchiude interamente le 2 linee.
  72. ; Durante la copia viene effettuato anche il riempmento. Il tipo di riempimento
  73. ; e` specificato tramite i parametri.
  74. ; I parametri sono:
  75. ; A0 - indirizzo destinazione
  76. ; D0 - se vale 0 allora effettua fill inclusivo, altrimenti fa fill esclusivo
  77. ; D1 - se vale 0 allora effettua FILL_CARRYIN=0, altrimenti FILL_CARRYIN=1
  78. ;****************************************************************************
  79.  
  80. Fill:
  81.     btst    #6,2(a5) ; dmaconr
  82. WBlit1:
  83.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  84.     bne.s    wblit1
  85.  
  86.     move.w    #$09f0,$40(a5)        ; BLTCON0 copia normale
  87.  
  88.     tst.w    d0            ; testa D0 per decidere il tipo di fill
  89.     bne.s    fill_esclusivo
  90.     move.w    #$000a,d2        ; valore di BLTCON1: settati i bit del
  91.                     ; fill inclusivo e del modo discendente
  92.     bra.s    test_fill_carry
  93.  
  94. fill_esclusivo:
  95.     move.w    #$0012,d2        ; valore di BLTCON1: settati i bit del
  96.                     ; fill esclusivo e del modo discendente
  97.  
  98. test_fill_carry:
  99.     tst.w    d1            ; testa D1 per vedere se deve settare
  100.                     ; il bit FILL_CARRYIN
  101.  
  102.     beq.s    fatto_bltcon1        ; se D1=0 salta..
  103.     bset    #2,d2            ; altrimenti setta il bit 2 di D2
  104.  
  105. fatto_bltcon1:
  106.     move.w    d2,$42(a5)        ; BLTCON1
  107.  
  108.     move.w    #14,$64(a5)        ; BLTAMOD larghezza 13 words (40-26=14)
  109.     move.w    #14,$66(a5)        ; BLTDMOD (40-26=14)
  110.  
  111.     move.l    #bitplane+80*40+28,$50(a5)
  112.                     ; BLTAPT (fisso al rettangolo sorgente)
  113.                     ; il rettangolo sorgente racchiude
  114.                     ; interamente le 2 linee.
  115.                     ; puntiamo l'ultima word del rettangolo
  116.                     ; per via del modo discendente
  117.  
  118.     move.l    a0,$54(a5)        ; BLTDPT  carica il parametro
  119.     move.w    #(64*56)+13,$58(a5)    ; BLTSIZE (via al blitter !)
  120.                     ; larghezza 13 words
  121.                     ; altezza 56 righe (1 plane)
  122.     rts
  123.  
  124.  
  125. ;******************************************************************************
  126. ; Questa routine effettua il disegno di una linea, usando la speciale modalita`
  127. ; che consente di effettuare correttamente il fill. Prende come parametri gli
  128. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  129. ; D0 - X1 (coord. X di P1)
  130. ; D1 - Y1 (coord. Y di P1)
  131. ; D2 - X2 (coord. X di P2)
  132. ; D3 - Y2 (coord. Y di P2)
  133. ; A0 - indirizzo bitplane
  134. ;******************************************************************************
  135.  
  136. ;      ("`-''-/").___..--''"`-._
  137. ;       `6_ 6  )   `-.  (     ).`-.__.`)
  138. ;       (_Y_.)'  ._   )  `._ `. ``-..-'
  139. ;     _..`--'_..-_/  /--'_.' ,'
  140. ;    (il),-''  (li),'  ((!.-'
  141.  
  142. DrawlineFill:
  143.  
  144. * scelta ottante
  145.  
  146.     sub.w    d0,d2        ; D2=X2-X1
  147.     bmi.s    DRAW4        ; se negativo salta, altrimenti D2=DiffX
  148.     sub.w    d1,d3        ; D3=Y2-Y1
  149.     bmi.s    DRAW2        ; se negativo salta, altrimenti D3=DiffY
  150.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  151.     bmi.s    DRAW1        ; se D2<D3 salta..
  152.                 ; .. altrimenti D3=DY e D2=DX
  153.     moveq    #$10,d5        ; codice ottante
  154.     bra.s    DRAWL
  155. DRAW1:
  156.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  157.     moveq    #$00,d5        ; codice ottante
  158.     bra.s    DRAWL
  159. DRAW2:
  160.     neg.w    d3        ; rende D3 positivo
  161.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  162.     bmi.s    DRAW3        ; se D2<D3 salta..
  163.                 ; .. altrimenti D3=DY e D2=DX
  164.     moveq    #$18,d5        ; codice ottante
  165.     bra.s    DRAWL
  166. DRAW3:
  167.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  168.     moveq    #$04,d5        ; codice ottante
  169.     bra.s    DRAWL
  170. DRAW4:
  171.     neg.w    d2        ; rende D2 positivo
  172.     sub.w    d1,d3        ; D3=Y2-Y1
  173.     bmi.s    DRAW6        ; se negativo salta, altrimenti D3=DiffY
  174.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  175.     bmi.s    DRAW5        ; se D2<D3 salta..
  176.                 ; .. altrimenti D3=DY e D2=DX
  177.     moveq    #$14,d5        ; codice ottante
  178.     bra.s    DRAWL
  179. DRAW5:
  180.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  181.     moveq    #$08,d5        ; codice ottante
  182.     bra.s    DRAWL
  183. DRAW6:
  184.     neg.w    d3        ; rende D3 positivo
  185.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  186.     bmi.s    DRAW7        ; se D2<D3 salta..
  187.                 ; .. altrimenti D3=DY e D2=DX
  188.     moveq    #$1c,d5        ; codice ottante
  189.     bra.s    DRAWL
  190. DRAW7:
  191.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  192.     moveq    #$0c,d5        ; codice ottante
  193.  
  194. ; Quando l'esecuzione raggiunge questo punto, abbiamo:
  195. ; D2 = DX
  196. ; D3 = DY
  197. ; D5 = codice ottante
  198.  
  199. DRAWL:
  200.     mulu.w    #40,d1        ; offset Y
  201.     add.l    d1,a0        ; aggiunge l'offset Y all'indirizzo
  202.  
  203.     move.w    d0,d1        ; copia la coordinata X
  204.     and.w    #$000F,d0    ; seleziona i 4 bit piu` bassi della X..
  205.     ror.w    #4,d0        ; .. e li sposta nei bit da 12 a 15
  206.     or.w    #$0B4A,d0    ; con un OR ottengo il valore da scrivere
  207.                 ; in BLTCON0. Con questo valore di LF ($4A)
  208.                 ; si disegnano linee in EOR con lo sfondo.
  209.  
  210.     lsr.w    #4,d1        ; cancella i 4 bit bassi della X
  211.     add.w    d1,d1        ; ottiene l'offset X in bytes
  212.     add.w    d1,a0        ; aggiunge l'offset X all'indirizzo
  213.  
  214.     move.w    d2,d1        ; copia DX in D1
  215.     addq.w    #1,d1        ; D1=DX+1
  216.     lsl.w    #$06,d1        ; calcola in D1 il valore da mettere in BLTSIZE
  217.     addq.w    #2,d1        ; aggiunge la larghezza, pari a 2 words
  218.  
  219.     lsl.w    #$02,d3        ; D3=4*DY
  220.     add.w    d2,d2        ; D2=2*DX
  221.  
  222.     btst    #$06,$02(a5)
  223. WaitLine:
  224.     btst    #$06,$02(a5)    ; aspetta blitter fermo
  225.     bne.s    WaitLine
  226.  
  227.     move.w    d3,$62(a5)    ; BLTBMOD=4*DY
  228.     sub.w    d2,d3        ; D3=4*DY-2*DX
  229.     move.w    d3,$52(a5)    ; BLTAPTL=4*DY-2*DX
  230.  
  231.                 ; prepara valore da scrivere in BLTCON1
  232.     or.w    #$0003,d5    ; setta bit 0 (attiva line-mode), e
  233.                 ; il bit 1 (linee speciali per fill)
  234.  
  235.     tst.w    d3
  236.     bpl.s    OK1        ; se 4*DY-2*DX>0 salta..
  237.     or.w    #$0040,d5    ; altrimenti setta il bit SIGN
  238. OK1:
  239.     move.w    d0,$40(a5)    ; BLTCON0
  240.     move.w    d5,$42(a5)    ; BLTCON1
  241.     sub.w    d2,d3        ; D3=4*DY-4*DX
  242.     move.w    d3,$64(a5)    ; BLTAMOD=4*DY-4*DX
  243.     move.l    a0,$48(a5)    ; BLTCPT - indirizzo schermo
  244.     move.l    a0,$54(a5)    ; BLTDPT - indirizzo schermo
  245.     move.w    d1,$58(a5)    ; BLTSIZE
  246.     rts
  247.     
  248.  
  249. ;******************************************************************************
  250. ; Questa routine setta i registri del blitter che non devono essere
  251. ; cambiati tra una line e l'altra
  252. ;******************************************************************************
  253.  
  254. InitLine:
  255.     btst    #6,2(a5) ; dmaconr
  256. WBlit_Init:
  257.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  258.     bne.s    Wblit_Init
  259.  
  260.     moveq    #-1,d5
  261.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  262.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  263.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  264.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  265.     rts
  266.  
  267. ;******************************************************************************
  268. ; Questa routine definisce il pattern che deve essere usato per disegnare
  269. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  270. ; D0 - contiene il pattern della linea 
  271. ;******************************************************************************
  272.  
  273. SetPattern:
  274.     btst    #6,2(a5) ; dmaconr
  275. WBlit_Set:
  276.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  277.     bne.s    Wblit_Set
  278.  
  279.     move.w    d0,$72(a5)    ; BLTBDAT = pattern delle linee
  280.     rts
  281.  
  282.  
  283. ;****************************************************************************
  284.  
  285.     SECTION    GRAPHIC,DATA_C
  286.  
  287. COPPERLIST:
  288.     dc.w    $8E,$2c81    ; DiwStrt
  289.     dc.w    $90,$2cc1    ; DiwStop
  290.     dc.w    $92,$38        ; DdfStart
  291.     dc.w    $94,$d0        ; DdfStop
  292.     dc.w    $102,0        ; BplCon1
  293.     dc.w    $104,0        ; BplCon2
  294.     dc.w    $108,0        ; Bpl1Mod
  295.     dc.w    $10a,0        ; Bpl2Mod
  296.  
  297.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  298.  
  299. BPLPOINTERS:
  300.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  301.  
  302.     dc.w    $0180,$000    ; color0
  303.     dc.w    $0182,$eee    ; color1
  304.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  305.  
  306.  
  307. BITPLANE:
  308.     dcb.b    40*256,0        ; bitplane azzerato lowres
  309.  
  310.     end
  311.  
  312. ;****************************************************************************
  313.  
  314. In questo esempio l'area da riempire e` delimitata da linee aventi pendenza
  315. minore di 45 gradi. Impiegando la modalita` di disegno linee per il fill
  316. riusciamo ad effettuare correttamente il riempimento.
  317. Per disegnare le linee usiamo la routine "DrawLineFill" che e` identica
  318. alla routine di disegno linee che abbiamo usato finora tranne per il fatto
  319. che impiega questo modo speciale, settando l'apposito bit di BLTCON1.
  320. Come potete vedere prima di effettuare il riempimento, questo modo speciale
  321. produce linee che hanno un sempre un solo pixel per ogni linea orizzontale.
  322. Se la pendenza delle linee fosse > di 45 gradi si avrebbero linee identiche
  323. a quelle normali. 
  324.  
  325.