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

  1.  
  2. ; Lezione10t2.s    Routine tracciamento linee ottimizzata
  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    #$f0f0,d0    ; linea trattegiata
  46.     bsr.w    SetPattern    ; definisce pattern
  47.  
  48.     move.w    #300,d0        ; x1
  49.     move.w    #200,d1        ; y1
  50.     move.w    #240,d2        ; x2
  51.     move.w    #90,d3        ; y2
  52.     lea    bitplane,a0
  53.     bsr.s    Drawline
  54.  
  55.     move.w    #$4444,d0    ; linea trattegiata
  56.     bsr.w    SetPattern    ; definisce pattern
  57.  
  58.     move.w    #210,d0        ; x1
  59.     move.w    #24,d1        ; y1
  60.     move.w    #68,d2        ; x2
  61.     move.w    #50,d3        ; y2
  62.     lea    bitplane,a0
  63.     bsr.s    Drawline
  64.  
  65. mouse:
  66.     btst    #6,$bfe001    ; mouse premuto?
  67.     bne.s    mouse
  68.     rts
  69.  
  70.  
  71. ;******************************************************************************
  72. ; Questa routine effettua il disegno della linea. prende come parametri gli
  73. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  74. ; D0 - X1 (coord. X di P1)
  75. ; D1 - Y1 (coord. Y di P1)
  76. ; D2 - X2 (coord. X di P2)
  77. ; D3 - Y2 (coord. Y di P2)
  78. ; A0 - indirizzo bitplane
  79. ;******************************************************************************
  80.  
  81. ;          .---.        .-----------
  82. ;         /     \  __  /    ------
  83. ;        / /     \(oo)/    -----
  84. ;       //////   ' \/ `   ---
  85. ;      //// / // :    : ---
  86. ;     // /   /  /`    '--
  87. ;    //          //..\\
  88. ;    -----------UU----UU-----
  89. ;               '//||\\`
  90. ;                 ''``
  91.  
  92. ; costanti
  93.  
  94. DL_Fill        =    0        ; 0=NOFILL / 1=FILL
  95.  
  96.     IFEQ    DL_Fill
  97. DL_MInterns    =    $CA
  98.     ELSE
  99. DL_MInterns    =    $4A
  100.     ENDC
  101.  
  102.  
  103. DrawLine:
  104.     sub.w    d1,d3    ; D3=Y2-Y1
  105.  
  106.     IFNE    DL_Fill
  107.     beq.s    .end    ; per il fill non servono linee orizzontali 
  108.     ENDC
  109.  
  110.     bgt.s    .y2gy1    ; salta se positivo..
  111.     exg    d0,d2    ; ..altrimenti scambia i punti
  112.     add.w    d3,d1    ; mette in D1 la Y piu` piccola
  113.     neg.w    d3    ; D3=DY
  114. .y2gy1:
  115.     mulu.w    #40,d1        ; offset Y
  116.     add.l    d1,a0
  117.     moveq    #0,d1        ; D1 indice nella tabella ottanti
  118.     sub.w    d0,d2        ; D2=X2-X1
  119.     bge.s    .xdpos        ; salta se positivo..
  120.     addq.w    #2,d1        ; ..altrimenti sposta l'indice
  121.     neg.w    d2        ; e rendi positiva la differenza
  122. .xdpos:
  123.     moveq    #$f,d4        ; maschera per i 4 bit bassi
  124.     and.w    d0,d4        ; selezionali in D4
  125.         
  126.     IFNE    DL_Fill        ; queste istruzioni vengono assemblate
  127.                 ; solo se DL_Fill=1
  128.     move.b    d4,d5        ; calcola numero del bit da invertire
  129.     not.b    d5        ; (la BCHG numera i bit in modo inverso    
  130.     ENDC
  131.  
  132.     lsr.w    #3,d0        ; offset X:
  133.                 ; Allinea a byte (serve per BCHG)
  134.     add.w    d0,a0        ; aggiunge all'indirizzo
  135.                 ; nota che anche se l'indirizzo
  136.                 ; e` dispari non fa nulla perche`
  137.                 ; il blitter non tiene conto del
  138.                 ; bit meno significativo di BLTxPT
  139.  
  140.     ror.w    #4,d4        ; D4 = valore di shift A
  141.     or.w    #$B00+DL_MInterns,d4    ; aggiunge l'opportuno
  142.                     ; Minterm (OR o EOR)
  143.     swap    d4        ; valore di BLTCON0 nella word alta
  144.         
  145.     cmp.w    d2,d3        ; confronta DiffX e DiffY
  146.     bge.s    .dygdx        ; salta se >=0..
  147.     addq.w    #1,d1        ; altrimenti setta il bit 0 del'indice
  148.     exg    d2,d3        ; e scambia le Diff
  149. .dygdx:
  150.     add.w    d2,d2        ; D2 = 2*DiffX
  151.     move.w    d2,d0        ; copia in D0
  152.     sub.w    d3,d0        ; D0 = 2*DiffX-DiffY
  153.     addx.w    d1,d1        ; moltiplica per 2 l'indice e
  154.                 ; contemporaneamente aggiunge il flag
  155.                 ; X che vale 1 se 2*DiffX-DiffY<0
  156.                 ; (settato dalla sub.w)
  157.     move.b    Oktants(PC,d1.w),d4    ; legge l'ottante
  158.     swap    d2            ; valore BLTBMOD in word alta
  159.     move.w    d0,d2            ; word bassa D2=2*DiffX-DiffY
  160.     sub.w    d3,d2            ; word bassa D2=2*DiffX-2*DiffY
  161.     moveq    #6,d1            ; valore di shift e di test per
  162.                     ; la wait blitter 
  163.  
  164.     lsl.w    d1,d3        ; calcola il valore di BLTSIZE
  165.     add.w    #$42,d3
  166.  
  167.     lea    $52(a5),a1    ; A1 = indirizzo BLTAPTL
  168.                 ; scrive alcuni registri
  169.                 ; consecutivamente con delle 
  170.                 ; MOVE #XX,(Ax)+
  171.  
  172.     btst    d1,2(a5)    ; aspetta il blitter
  173. .wb:
  174.     btst    d1,2(a5)
  175.     bne.s    .wb
  176.  
  177.     IFNE    DL_Fill        ; questa istruzione viene assemblata
  178.                 ; solo se DL_Fill=1
  179.     bchg    d5,(a0)        ; Inverte il primo bit della linea
  180.     ENDC
  181.  
  182.     move.l    d4,$40(a5)    ; BLTCON0/1
  183.     move.l    d2,$62(a5)    ; BLTBMOD e BLTAMOD
  184.     move.l    a0,$48(a5)    ; BLTCPT
  185.     move.w    d0,(a1)+    ; BLTAPTL
  186.     move.l    a0,(a1)+    ; BLTDPT
  187.     move.w    d3,(a1)        ; BLTSIZE
  188. .end:
  189.     rts
  190.  
  191. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  192. ; se vogliamo eseguire linee per il fill, il codice ottante setta ad 1 il bit
  193. ; SING attraverso la costante SML
  194.  
  195.     IFNE    DL_Fill
  196. SML        =     2
  197.     ELSE
  198. SML        =    0
  199.     ENDC
  200.  
  201. ; tabella ottanti
  202.  
  203. Oktants:
  204.     dc.b    SML+1,SML+1+$40
  205.     dc.b    SML+17,SML+17+$40
  206.     dc.b    SML+9,SML+9+$40
  207.     dc.b    SML+21,SML+21+$40
  208.  
  209. ;******************************************************************************
  210. ; Questa routine setta i registri del blitter che non devono essere
  211. ; cambiati tra una line e l'altra
  212. ;******************************************************************************
  213.  
  214. InitLine
  215.     btst    #6,2(a5) ; dmaconr
  216. WBlit_Init:
  217.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  218.     bne.s    Wblit_Init
  219.  
  220.     moveq    #-1,d5
  221.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  222.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  223.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  224.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  225.     rts
  226.  
  227. ;******************************************************************************
  228. ; Questa routine definisce il pattern che deve essere usato per disegnare
  229. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  230. ; D0 - contiene il pattern della linea 
  231. ;******************************************************************************
  232.  
  233. SetPattern:
  234.     btst    #6,2(a5) ; dmaconr
  235. WBlit_Set:
  236.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  237.     bne.s    Wblit_Set
  238.  
  239.     move.w    d0,$72(a5)    ; BLTBDAT = pattern linee
  240.     rts
  241.  
  242.  
  243. ;****************************************************************************
  244.  
  245.     SECTION    GRAPHIC,DATA_C
  246.  
  247. COPPERLIST:
  248.     dc.w    $8E,$2c81    ; DiwStrt
  249.     dc.w    $90,$2cc1    ; DiwStop
  250.     dc.w    $92,$38        ; DdfStart
  251.     dc.w    $94,$d0        ; DdfStop
  252.     dc.w    $102,0        ; BplCon1
  253.     dc.w    $104,0        ; BplCon2
  254.     dc.w    $108,0        ; Bpl1Mod
  255.     dc.w    $10a,0        ; Bpl2Mod
  256.  
  257.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  258.  
  259. BPLPOINTERS:
  260.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  261.  
  262.     dc.w    $0180,$000    ; color0
  263.     dc.w    $0182,$eee    ; color1
  264.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  265.  
  266. ;****************************************************************************
  267.  
  268.     Section    IlMioPlane,bss_C
  269.  
  270. BITPLANE:
  271.     ds.b    40*256        ; bitplane azzerato lowres
  272.  
  273.     end
  274.  
  275. ;****************************************************************************
  276.  
  277. In questo esempio presentiamo una routine ottimizzata per il tracciamento
  278. di linee. La caratteristica principale di questa routine e` che i codici
  279. degli ottanti sono contenuti in una tabella. La routine a seconda delle
  280. posizioni dei punti calcola l'indice del giusto ottante nella tabella.
  281. Oltre a questo la routine impiega moltissime ottimizzazioni 68000.
  282. Questa routine contiene delle direttive assembler per l'assemblaggio
  283. condizionale. In base al valore della costante DL_Fill vengono assemblate
  284. o meno alcune parti della routine. In questo modo e` possibile riunire
  285. in un unico sorgente il codice sia per la versione normale che quello
  286. per la versione line-fill. Settando DL_Fill=0 si assembla la routine
  287. normale, mentre con DL_Fill=1 si assembla la versione per line fill.
  288. Per rendervene conto osservate (con il comando D di ASMONE) il codice
  289. prodotto nei 2 casi.
  290.  
  291.