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

  1.  
  2. ; Lezione10n.s    Disegna una 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.     bsr.w    InitLine    ; inizializza line-mode
  34.  
  35.     move.w    #$ffff,d0    ; linea continua
  36.     bsr.w    SetPattern    ; definisce pattern
  37.  
  38.     move.w    #100,d0        ; x1
  39.     move.w    #100,d1        ; y1
  40.     move.w    #220,d2        ; x2
  41.     move.w    #120,d3        ; y2
  42.     lea    bitplane,a0
  43.     bsr.s    Drawline
  44.  
  45.     move.w    #160,d0        ; x1
  46.     move.w    #85,d1        ; y1
  47.     move.w    #160,d2        ; x2
  48.     move.w    #140,d3        ; y2
  49.     lea    bitplane,a0
  50.     bsr.s    Drawline
  51.  
  52.     move.w    #80,d0        ; x1
  53.     move.w    #130,d1        ; y1
  54.     move.w    #50,d2        ; x2
  55.     move.w    #190,d3        ; y2
  56.     lea    bitplane,a0
  57.     bsr.s    Drawline
  58.  
  59.     move.w    #$f0f0,d0    ; linea trattegiata
  60.     bsr.w    SetPattern    ; definisce pattern
  61.  
  62.     move.w    #300,d0        ; x1
  63.     move.w    #200,d1        ; y1
  64.     move.w    #240,d2        ; x2
  65.     move.w    #90,d3        ; y2
  66.     lea    bitplane,a0
  67.     bsr.s    Drawline
  68.  
  69.     move.w    #$4444,d0    ; linea trattegiata
  70.     bsr.w    SetPattern    ; definisce pattern
  71.  
  72.     move.w    #210,d0        ; x1
  73.     move.w    #24,d1        ; y1
  74.     move.w    #68,d2        ; x2
  75.     move.w    #50,d3        ; y2
  76.     lea    bitplane,a0
  77.     bsr.s    Drawline
  78.  
  79. mouse:
  80.     btst    #6,$bfe001    ; mouse premuto?
  81.     bne.s    mouse
  82.     rts
  83.  
  84.  
  85. ;******************************************************************************
  86. ; Questa routine effettua il disegno della linea. prende come parametri gli
  87. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  88. ; D0 - X1 (coord. X di P1)
  89. ; D1 - Y1 (coord. Y di P1)
  90. ; D2 - X2 (coord. X di P2)
  91. ; D3 - Y2 (coord. Y di P2)
  92. ; A0 - indirizzo bitplane
  93. ;******************************************************************************
  94.  
  95. ;        ("`-/")_.-'"``-._
  96. ;         . . `; -._    )-;-,_`)
  97. ;    FL  (v_,)'  _  )`-.\  ``-'
  98. ;       _.- _..-_/ / ((.'
  99. ;     ((,.-'   ((,/
  100.  
  101. Drawline:
  102.  
  103. * scelta ottante
  104.  
  105.     sub.w    d0,d2        ; D2=X2-X1
  106.     bmi.s    DRAW4        ; se negativo salta, altrimenti D2=DiffX
  107.     sub.w    d1,d3        ; D3=Y2-Y1
  108.     bmi.s    DRAW2        ; se negativo salta, altrimenti D3=DiffY
  109.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  110.     bmi.s    DRAW1        ; se D2<D3 salta..
  111.                 ; .. altrimenti D3=DY e D2=DX
  112.     moveq    #$10,d5        ; codice ottante
  113.     bra.s    DRAWL
  114. DRAW1:
  115.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  116.     moveq    #0,d5        ; codice ottante
  117.     bra.s    DRAWL
  118. DRAW2:
  119.     neg.w    d3        ; rende D3 positivo
  120.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  121.     bmi.s    DRAW3        ; se D2<D3 salta..
  122.                 ; .. altrimenti D3=DY e D2=DX
  123.     moveq    #$18,d5        ; codice ottante
  124.     bra.s    DRAWL
  125. DRAW3:
  126.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  127.     moveq    #$04,d5        ; codice ottante
  128.     bra.s    DRAWL
  129. DRAW4:
  130.     neg.w    d2        ; rende D2 positivo
  131.     sub.w    d1,d3        ; D3=Y2-Y1
  132.     bmi.s    DRAW6        ; se negativo salta, altrimenti D3=DiffY
  133.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  134.     bmi.s    DRAW5        ; se D2<D3 salta..
  135.                 ; .. altrimenti D3=DY e D2=DX
  136.     moveq    #$14,d5        ; codice ottante
  137.     bra.s    DRAWL
  138. DRAW5:
  139.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  140.     moveq    #$08,d5        ; codice ottante
  141.     bra.s    DRAWL
  142. DRAW6:
  143.     neg.w    d3        ; rende D3 positivo
  144.     cmp.w    d3,d2        ; confronta DiffX e DiffY
  145.     bmi.s    DRAW7        ; se D2<D3 salta..
  146.                 ; .. altrimenti D3=DY e D2=DX
  147.     moveq    #$1c,d5        ; codice ottante
  148.     bra.s    DRAWL
  149. DRAW7:
  150.     exg.l    d2,d3        ; scambia D2 e D3, in modo che D3=DY e D2=DX
  151.     moveq    #$0c,d5        ; codice ottante
  152.  
  153. ; Quando l'esecuzione raggiunge questo punto, abbiamo:
  154. ; D2 = DX
  155. ; D3 = DY
  156. ; D5 = codice ottante
  157.  
  158. DRAWL:
  159.     mulu.w    #40,d1        ; offset Y
  160.     add.l    d1,a0        ; aggiunge l'offset Y all'indirizzo
  161.  
  162.     move.w    d0,d1        ; copia la coordinata X
  163.     and.w    #$000F,d0    ; seleziona i 4 bit piu` bassi della X..
  164.     ror.w    #4,d0        ; .. e li sposta nei bit da 12 a 15
  165.     or.w    #$0B4A,d0    ; con un OR ottengo il valore da scrivere
  166.                 ; in BLTCON0. Con questo valore di LF ($4A)
  167.                 ; si disegnano linee in EOR con lo sfondo.
  168.  
  169.     lsr.w    #4,d1        ; cancella i 4 bit bassi della X
  170.     add.w    d1,d1        ; ottiene l'offset X in bytes
  171.     add.w    d1,a0        ; aggiunge l'offset X all'indirizzo
  172.  
  173.     move.w    d2,d1        ; copia DX in D1
  174.     addq.w    #1,d1        ; D1=DX+1
  175.     lsl.w    #$06,d1        ; calcola in D1 il valore da mettere in BLTSIZE
  176.     addq.w    #$0002,d1    ; aggiunge la larghezza, pari a 2 words
  177.  
  178.     lsl.w    #$02,d3        ; D3=4*DY
  179.     add.w    d2,d2        ; D2=2*DX
  180.  
  181.     btst    #6,2(a5)
  182. WaitLine:
  183.     btst    #6,2(a5)    ; aspetta blitter fermo
  184.     bne    WaitLine
  185.  
  186.     move.w    d3,$62(a5)    ; BLTBMOD=4*DY
  187.     sub.w    d2,d3        ; D3=4*DY-2*DX
  188.     move.w    d3,$52(a5)    ; BLTAPTL=4*DY-2*DX
  189.  
  190.                 ; prepara valore da scrivere in BLTCON1
  191.     or.w    #$0001,d5    ; setta bit 0 (attiva line-mode)
  192.     tst.w    d3
  193.     bpl.s    OK1        ; se 4*DY-2*DX>0 salta..
  194.     or.w    #$0040,d5    ; altrimenti setta il bit SIGN
  195. OK1:
  196.     move.w    d0,$40(a5)    ; BLTCON0
  197.     move.w    d5,$42(a5)    ; BLTCON1
  198.     sub.w    d2,d3        ; D3=4*DY-4*DX
  199.     move.w    d3,$64(a5)    ; BLTAMOD=4*DY-4*DX
  200.     move.l    a0,$48(a5)    ; BLTCPT - indirizzo schermo
  201.     move.l    a0,$54(a5)    ; BLTDPT - indirizzo schermo
  202.     move.w    d1,$58(a5)    ; BLTSIZE
  203.     rts
  204.     
  205.  
  206. ;******************************************************************************
  207. ; Questa routine setta i registri del blitter che non devono essere
  208. ; cambiati tra una line e l'altra
  209. ;******************************************************************************
  210.  
  211. InitLine
  212.     btst    #6,2(a5) ; dmaconr
  213. WBlit_Init:
  214.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  215.     bne.s    Wblit_Init
  216.  
  217.     moveq.l    #-1,d5
  218.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  219.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  220.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  221.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  222.     rts
  223.  
  224. ;******************************************************************************
  225. ; Questa routine definisce il pattern che deve essere usato per disegnare
  226. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  227. ; D0 - contiene il pattern della linea 
  228. ;******************************************************************************
  229.  
  230. SetPattern:
  231.     btst    #6,2(a5) ; dmaconr
  232. WBlit_Set:
  233.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  234.     bne.s    Wblit_Set
  235.  
  236.     move.w    d0,$72(a5)    ; BLTBDAT = pattern della linea!
  237.     rts
  238.  
  239.  
  240. ;****************************************************************************
  241.  
  242.     SECTION    GRAPHIC,DATA_C
  243.  
  244. COPPERLIST:
  245.     dc.w    $8E,$2c81    ; DiwStrt
  246.     dc.w    $90,$2cc1    ; DiwStop
  247.     dc.w    $92,$38        ; DdfStart
  248.     dc.w    $94,$d0        ; DdfStop
  249.     dc.w    $102,0        ; BplCon1
  250.     dc.w    $104,0        ; BplCon2
  251.     dc.w    $108,0        ; Bpl1Mod
  252.     dc.w    $10a,0        ; Bpl2Mod
  253.  
  254.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  255.  
  256. BPLPOINTERS:
  257.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  258.  
  259.     dc.w    $180,$000    ; color0
  260.     dc.w    $182,$eee    ; color1
  261.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  262.  
  263. ;****************************************************************************
  264.  
  265.     Section    IlMioPlane,bss_C
  266.  
  267. BITPLANE:
  268.     ds.b    40*256        ; bitplane azzerato lowres
  269.  
  270.     end
  271.  
  272. ;****************************************************************************
  273.  
  274. In questo esempio presentiamo il tracciamento di linee. Esso viene realizzato
  275. mediante 3 diverse routines.
  276. La routine "InitLine" setta i registri il cui contenuto e` indipendente dai
  277. parametri della linea (gli estremi) e che pertanto possono essere setati una
  278. volta sola all'inizio del programma.
  279. La routine "SetPattern" definisce il pattern da usare per una linea. Ogni
  280. volta che si desidera usare un pattern diverso si deve eseguire questa 
  281. routine. Al contrario, se ci sono diverse linee da tracciare con lo stesso
  282. pattern questa routine puo` essere eseguita una sola volta.
  283. La routine "Drawline" e` la routine che disegna effetivamente la linea ed
  284. e` anche la piu` complessa. All'inizio vengono calcolati DX e DY e in base alle
  285. coordinate degli estremi, e viene determinato il codice ottante da usare.
  286. Per compiere queste operazioni sono necessari una serie di sottrazioni e di
  287. confronti che prendono in esame tutti i possibili casi.
  288. Successivamente vengono calcolati i valori da inserire negli altri registri,
  289. come spiegato nei commenti.
  290. Notate che viene usato LF=$4A, il che provoca un EOR tra la linea e lo sfondo.
  291. Lo potete notare osservando le 2 linee che si intersecano: l'intersezione e`
  292. un pixel di valore 0. Se provate a porre LF=$CA noterete che l'intersezione
  293. e` invece un pixel di valore 1.
  294.  
  295.