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

  1.  
  2. ; Lezione10u2.s Effetto con linee
  3. ;        tasto destro per vedere altri effetti, 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.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  20.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  21.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  22.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  23.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  24.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  25.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  26.  
  27.     bsr.w    InitLine    ; inizializza line-mode
  28.  
  29.     move.w    #$ffff,d0    ; linea continua
  30.     bsr.w    SetPattern    ; definisce pattern
  31.  
  32. mouse:
  33.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  34.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  35. Waity1:
  36.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  37.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  38.     CMPI.L    D2,D0        ; aspetta la linea $12c
  39.     BNE.S    Waity1
  40.  
  41.     bsr.w    ScambiaBuffer    ; questa routine scambia i 2 buffer
  42.  
  43.     bsr.w    CancellaSchermo    ; pulisce lo schermo
  44.  
  45.     btst    #2,$dff016    ; tasto destro del mouse premuto?
  46.     bne.s    NonCambia    ; se no salta..
  47.     bsr.s    CambiaParametri    ; ..altrimenti cambia i parametri delle linee
  48. NonCambia:
  49.  
  50.     bsr.w    MuoviPunti    ; modifica le coordinate dei punti della prima
  51.                 ; linea
  52.  
  53.  
  54.     move.w    IndiceX1(pc),d4    ; legge gli indici della prima linea
  55.     move.w    IndiceX2(pc),d5
  56.     move.w    IndiceY1(pc),d6
  57.     move.w    IndiceY2(pc),d7
  58.  
  59.     move.w    NumLines(pc),d0
  60.  
  61. LineLoop:
  62.  
  63. ; disegna la linea
  64.  
  65.     movem.l    d0-d7,-(a7)    ; salva i registri
  66.     move.w    CoordX1(pc),d0    ; legge le coordinate dei punti
  67.     move.w    CoordY1(pc),d1
  68.     move.w    CoordX2(pc),d2
  69.     move.w    CoordY2(pc),d3
  70.     move.l    draw_buffer(pc),a0
  71.     bsr.w    Drawline
  72.     movem.l    (a7)+,d0-d7    ; rileggi i registri
  73.  
  74.     bsr.w    NextLine
  75.  
  76.     dbra    d0,LineLoop    ; ripeti per ogni linea
  77.  
  78.     btst    #6,$bfe001    ; mouse premuto?
  79.     bne.w    mouse
  80.  
  81.     rts
  82.  
  83.  
  84. ;***************************************************************************
  85. ; Questa routine cambia i valori dei parametri.
  86. ; I valori cambiati sono: "NumLines", i 4 "Indice", i 4 "Add", i 4 "NextAdd"
  87. ; I nuovi valori sono contenuti in un'apposita tabella.
  88. ; Siccome tutti i valori da cambiare sono consecutivi in memoria, si puo`
  89. ; utilizzare un unico loop di copia
  90. ;***************************************************************************
  91.  
  92. ;              _ _
  93. ;       .   __/ V \__  ..
  94. ;       .  /___ : ___\  ::
  95. ;     .: _/____\_/____\_ ::
  96. ;    :::/¯ ¬(@:)_(@:)¬ ¯\:::
  97. ;    _::\_ __/¯/_\¯\__ _/:::
  98. ;      ::·\:| . : . |:/ ::::
  99. ;       .:.¯:_|_|_|_:¯.::::·
  100. ;        ·::( V_V_V ):::·
  101. ;            \|   |/
  102.  
  103. CambiaParametri:
  104.     move.l    PointerParam(pc),a0    ; puntatore ai nuovi valori
  105.     lea    NumLines(pc),a1        ; puntatore alle variabili
  106.  
  107.     moveq    #13-1,d0        ; numero di valori da cambiare
  108. CambiaLoop:
  109.     move.w    (a0)+,(a1)+        ; loop di copia
  110.     dbra    d0,CambiaLoop
  111.  
  112.     cmp.l    #FineParam,a0        ; siamo alla fine della tabella?
  113.     blo.s    NoRestart        ; se no salta..
  114.     lea    TabParam(pc),a0        ; ..altrimenti ricomincia da capo
  115.  
  116. NoRestart:
  117.     move.l    a0,PointerParam        ; memorizza il puntatore
  118.  
  119. ; aspetta che venga rilasciato il pulsante del mouse
  120.  
  121. Waitmouse:
  122.     btst    #2,$dff016        ; tasto destro del mouse premuto?
  123.     beq.s    Waitmouse        ; se si aspetta
  124.  
  125.     rts
  126.  
  127. ; puntatore alla tabella dei parametri
  128.  
  129. PointerParam:    dc.l    TabParam
  130.  
  131. ; Tabella dei parametri
  132. ; potete provare a specificare voi dei parametri. I parametri (tranne il primo)
  133. ; DEVONO essere numeri PARI
  134.  
  135. TabParam:
  136.     dc.w    $3a,0,$40,0,$40,2,2,2,2,8,8,$10,$10
  137.     dc.w    $32,0,$80,0,$80,2,2,4,4,$7e,$80,$7e,$80
  138.  
  139.     dc.w    $3A,0,0,0,0,-2,2,4,4,$7e,$7e,$7e,$7e
  140.  
  141.     dc.w    $38,0,$68,0,$68,2,2,4,4,8,8,10,10
  142.     dc.w    $28,$64,0,0,0,6,4,4,2,6,6,4,8
  143.     dc.w    $3A,$40,$40,$40,$40,2,2,2,8,2,2,4,4
  144.     dc.w    $39,2,0,$68,0,-2,2,4,4,8,8,10,10
  145.  
  146.     dc.w    $27,$64,0,0,0,8,4,4,2,4,2,2,4
  147.     dc.w    $3A,0,$40,0,$40,2,2,4,4,4,4,$104,$104
  148. FineParam:
  149.  
  150. ;***************************************************************************
  151. ; Questa routine legge da tabelle le coordinate dei vertici delle linee
  152. ; successiva alla prima e le memorizza nelle apposite variabili.
  153. ; La lettura dalle tabelle viene effettuata mediante l'indirizzamento indiretto
  154. ; con indice. Per spostarci all'interno delle tabelle modifichiamo gli indici
  155. ; (che sono words) invece che i puntatori (longwords). Cio` ci permette di
  156. ; evitare di fuoriuscire dalla tabella con una semplice AND che mantiene
  157. ; l'indice compreso nell'intervallo 0 - 512 (infatti le tabelle sono composte
  158. ; da 256 valori words (512 bytes).
  159. ; Gli indici delle coordinate precedenti sono memorizzati
  160. ; nei registri D4,D5,D6,D7
  161. ; I valori da sommare all'indice per passare da una linea all'altra sono
  162. ; memorizzari in apposite variabili.
  163. ;***************************************************************************
  164.  
  165. NextLine:
  166.     lea    TabX(pc),a0
  167.  
  168. ; coordinata X1
  169.  
  170.     add.w    NextAddX1(pc),d4    ; modifica l'indice per puntare
  171.                     ; la nuova coordinata
  172.     and.w    #$1FF,d4        ; tiene l'indice all'interno della
  173.                     ; tabella
  174.     move.w    0(a0,d4.w),CoordX1    ; copia la coordinata dalla tabella
  175.                     ; nella variabile
  176.  
  177. ; coordinata X2
  178.  
  179.     add.w    NextAddX2(pc),d5    ; modifica l'indice per puntare
  180.                     ; la nuova coordinata
  181.     and.w    #$1FF,d5        ; tiene l'indice all'interno della
  182.                     ; tabella
  183.     move.w    0(a0,d5.w),CoordX2    ; copia la coordinata dalla tabella
  184.                     ; nella variabile
  185.  
  186.  
  187.     lea    TabY(pc),a0
  188.  
  189. ; coordinata Y1
  190.  
  191.     add.w    NextAddY1(pc),d6    ; modifica l'indice per puntare
  192.                     ; la nuova coordinata
  193.     and.w    #$1FF,d6        ; tiene l'indice all'interno della
  194.                     ; tabella
  195.     move.w    0(a0,d6.w),CoordY1    ; copia la coordinata dalla tabella
  196.                     ; nella variabile
  197. ; coordinata Y2
  198.  
  199.     add.w    NextAddY2(pc),d7    ; modifica l'indice per puntare
  200.                     ; la nuova coordinata
  201.     and.w    #$1FF,d7        ; tiene l'indice all'interno della
  202.                     ; tabella
  203.     move.w    0(a0,d7.w),CoordY2    ; copia la coordinata dalla tabella
  204.                     ; nella variabile
  205.     rts
  206.  
  207. ;***************************************************************************
  208. ; Questa routine legge da tabelle le coordinate dei vari punti e le
  209. ; memorizza nelle apposite variabili.
  210. ; La lettura dalle tabelle viene effettuata mediante l'indirizzamento indiretto
  211. ; con indice. Per spostarci all'interno delle tabelle modifichiamo gli indici
  212. ; (che sono words) invece che i puntatori (longwords). Cio` ci permette di
  213. ; evitare di fuoriuscire dalla tabella con una semplice AND che mantiene
  214. ; l'indice compreso nell'intervallo 0 - 512 (infatti le tabelle sono composte
  215. ; da 256 valori words (512 bytes).
  216. ;***************************************************************************
  217.  
  218. MuoviPunti:
  219.     lea    TabX(pc),a0
  220.  
  221. ; coordinata X1
  222.  
  223.     move.w    indiceX1(pc),d0        ; indice della coordinata precedente
  224.     add.w    addX1(pc),d0        ; modifica l'indice per puntare
  225.                     ; la nuova coordinata
  226.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  227.                     ; tabella
  228.     move.w    d0,indiceX1        ; memorizza l'indice
  229.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  230.     move.w    d1,CoordX1        ; copia la coordinata nella variabile
  231.  
  232. ; coordinata X2
  233.  
  234.     move.w    indiceX2(pc),d0        ; indice della coordinata precedente
  235.     add.w    addX2(pc),d0        ; modifica l'indice per puntare
  236.                     ; la nuova coordinata
  237.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  238.                     ; tabella
  239.     move.w    d0,indiceX2        ; memorizza l'indice
  240.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  241.     move.w    d1,CoordX2        ; copia la coordinata nella variabile
  242.  
  243.     lea    TabY(pc),a0
  244.  
  245. ; coordinata Y1
  246.  
  247.     move.w    indiceY1(pc),d0        ; indice della coordinata precedente
  248.     add.w    addY1(pc),d0        ; modifica l'indice per puntare
  249.                     ; la nuova coordinata
  250.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  251.                     ; tabella
  252.     move.w    d0,indiceY1        ; memorizza l'indice
  253.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  254.     move.w    d1,CoordY1        ; copia la coordinata nella variabile
  255.  
  256. ; coordinata Y2
  257.  
  258.     move.w    indiceY2(pc),d0        ; indice della coordinata precedente
  259.     add.w    addY2(pc),d0        ; modifica l'indice per puntare
  260.                     ; la nuova coordinata
  261.     and.w    #$1FF,d0        ; tiene l'indice all'interno della
  262.                     ; tabella
  263.     move.w    d0,indiceY2        ; memorizza l'indice
  264.     move.w    0(a0,d0.w),d1        ; legge la coordinata dalla tabella
  265.     move.w    d1,CoordY2        ; copia la coordinata nella variabile
  266.     rts
  267.  
  268. ; questa tabella contiene le coordinate X
  269.  
  270. TabX:
  271.     DC.W    $00A2,$00A6,$00A9,$00AD,$00B1,$00B4,$00B8,$00BB,$00BF,$00C3
  272.     DC.W    $00C6,$00CA,$00CD,$00D1,$00D4,$00D8,$00DB,$00DE,$00E2,$00E5
  273.     DC.W    $00E8,$00EC,$00EF,$00F2,$00F5,$00F8,$00FB,$00FE,$0101,$0103
  274.     DC.W    $0106,$0109,$010B,$010E,$0110,$0113,$0115,$0117,$011A,$011C
  275.     DC.W    $011E,$0120,$0122,$0123,$0125,$0127,$0128,$012A,$012B,$012D
  276.     DC.W    $012E,$012F,$0130,$0131,$0132,$0133,$0133,$0134,$0135,$0135
  277.     DC.W    $0135,$0136,$0136,$0136,$0136,$0136,$0136,$0135,$0135,$0135
  278.     DC.W    $0134,$0133,$0133,$0132,$0131,$0130,$012F,$012E,$012D,$012B
  279.     DC.W    $012A,$0128,$0127,$0125,$0123,$0122,$0120,$011E,$011C,$011A
  280.     DC.W    $0117,$0115,$0113,$0110,$010E,$010B,$0109,$0106,$0103,$0101
  281.     DC.W    $00FE,$00FB,$00F8,$00F5,$00F2,$00EF,$00EC,$00E8,$00E5,$00E2
  282.     DC.W    $00DE,$00DB,$00D8,$00D4,$00D1,$00CD,$00CA,$00C6,$00C3,$00BF
  283.     DC.W    $00BB,$00B8,$00B4,$00B1,$00AD,$00A9,$00A6,$00A2,$009E,$009A
  284.     DC.W    $0097,$0093,$008F,$008C,$0088,$0085,$0081,$007D,$007A,$0076
  285.     DC.W    $0073,$006F,$006C,$0068,$0065,$0062,$005E,$005B,$0058,$0054
  286.     DC.W    $0051,$004E,$004B,$0048,$0045,$0042,$003F,$003D,$003A,$0037
  287.     DC.W    $0035,$0032,$0030,$002D,$002B,$0029,$0026,$0024,$0022,$0020
  288.     DC.W    $001E,$001D,$001B,$0019,$0018,$0016,$0015,$0013,$0012,$0011
  289.     DC.W    $0010,$000F,$000E,$000D,$000D,$000C,$000B,$000B,$000B,$000A
  290.     DC.W    $000A,$000A,$000A,$000A,$000A,$000B,$000B,$000B,$000C,$000D
  291.     DC.W    $000D,$000E,$000F,$0010,$0011,$0012,$0013,$0015,$0016,$0018
  292.     DC.W    $0019,$001B,$001D,$001E,$0020,$0022,$0024,$0026,$0029,$002B
  293.     DC.W    $002D,$0030,$0032,$0035,$0037,$003A,$003D,$003F,$0042,$0045
  294.     DC.W    $0048,$004B,$004E,$0051,$0054,$0058,$005B,$005E,$0062,$0065
  295.     DC.W    $0068,$006C,$006F,$0073,$0076,$007A,$007D,$0081,$0085,$0088
  296.     DC.W    $008C,$008F,$0093,$0097,$009A,$009E
  297.  
  298. ; questa tabella contiene le coordinate Y
  299.  
  300. TabY:
  301.     DC.W    $0080,$0083,$0086,$0088,$008B,$008E,$0090,$0093,$0096,$0098
  302.     DC.W    $009B,$009E,$00A0,$00A3,$00A5,$00A8,$00AA,$00AD,$00AF,$00B2
  303.     DC.W    $00B4,$00B6,$00B9,$00BB,$00BD,$00BF,$00C2,$00C4,$00C6,$00C8
  304.     DC.W    $00CA,$00CC,$00CE,$00D0,$00D1,$00D3,$00D5,$00D7,$00D8,$00DA
  305.     DC.W    $00DB,$00DD,$00DE,$00DF,$00E1,$00E2,$00E3,$00E4,$00E5,$00E6
  306.     DC.W    $00E7,$00E8,$00E9,$00E9,$00EA,$00EB,$00EB,$00EC,$00EC,$00EC
  307.     DC.W    $00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00ED,$00EC,$00EC
  308.     DC.W    $00EC,$00EB,$00EB,$00EA,$00E9,$00E9,$00E8,$00E7,$00E6,$00E5
  309.     DC.W    $00E4,$00E3,$00E2,$00E1,$00DF,$00DE,$00DD,$00DB,$00DA,$00D8
  310.     DC.W    $00D7,$00D5,$00D3,$00D1,$00D0,$00CE,$00CC,$00CA,$00C8,$00C6
  311.     DC.W    $00C4,$00C2,$00BF,$00BD,$00BB,$00B9,$00B6,$00B4,$00B2,$00AF
  312.     DC.W    $00AD,$00AA,$00A8,$00A5,$00A3,$00A0,$009E,$009B,$0098,$0096
  313.     DC.W    $0093,$0090,$008E,$008B,$0088,$0086,$0083,$0080,$007E,$007B
  314.     DC.W    $0078,$0076,$0073,$0070,$006E,$006B,$0068,$0066,$0063,$0060
  315.     DC.W    $005E,$005B,$0059,$0056,$0054,$0051,$004F,$004C,$004A,$0048
  316.     DC.W    $0045,$0043,$0041,$003F,$003C,$003A,$0038,$0036,$0034,$0032
  317.     DC.W    $0030,$002E,$002D,$002B,$0029,$0027,$0026,$0024,$0023,$0021
  318.     DC.W    $0020,$001F,$001D,$001C,$001B,$001A,$0019,$0018,$0017,$0016
  319.     DC.W    $0015,$0015,$0014,$0013,$0013,$0012,$0012,$0012,$0011,$0011
  320.     DC.W    $0011,$0011,$0011,$0011,$0011,$0011,$0012,$0012,$0012,$0013
  321.     DC.W    $0013,$0014,$0015,$0015,$0016,$0017,$0018,$0019,$001A,$001B
  322.     DC.W    $001C,$001D,$001F,$0020,$0021,$0023,$0024,$0026,$0027,$0029
  323.     DC.W    $002B,$002D,$002E,$0030,$0032,$0034,$0036,$0038,$003A,$003C
  324.     DC.W    $003F,$0041,$0043,$0045,$0048,$004A,$004C,$004F,$0051,$0054
  325.     DC.W    $0056,$0059,$005B,$005E,$0060,$0063,$0066,$0068,$006B,$006E
  326.     DC.W    $0070,$0073,$0076,$0078,$007B,$007E
  327.  
  328.  
  329. ; Qui sono memorizzate i volta in volta le coordinate dei vertici della linea
  330.  
  331. CoordX1:    dc.w    0
  332. CoordY1:    dc.w    0
  333. CoordX2:    dc.w    0
  334. CoordY2:    dc.w    0
  335.  
  336. ; Qui e` memorizzato il numero di linee disegnate
  337.  
  338. NumLines:    dc.w    10
  339.  
  340. ; Qui sono memorizzati per ogni coordinata gli indici all'interno della tabella
  341.  
  342. IndiceX1:    dc.w    20
  343. IndiceY1:    dc.w    50
  344. IndiceX2:    dc.w    30
  345. IndiceY2:    dc.w    40
  346.  
  347. ; Qui sono memorizzati per ogni coordinata i valori da aggiungere ad ogni frame
  348. ; agli indici della tabella per i vertici della prima linea
  349.  
  350. addX1:    dc.w    4
  351. addY1:    dc.w    -6
  352. addX2:    dc.w    -2
  353. addY2:    dc.w    2
  354.  
  355. ; Qui sono memorizzati per ogni coordinata i valori da aggiungere agli indici
  356. ; della tabella per i vertici delle linee successive
  357.  
  358. NextaddX1:    dc.w    10
  359. NextaddY1:    dc.w    14
  360. NextaddX2:    dc.w    6
  361. NextaddY2:    dc.w    -4
  362.  
  363. ;******************************************************************************
  364. ; Questa routine effettua il disegno della linea. prende come parametri gli
  365. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  366. ; D0 - X1 (coord. X di P1)
  367. ; D1 - Y1 (coord. Y di P1)
  368. ; D2 - X2 (coord. X di P2)
  369. ; D3 - Y2 (coord. Y di P2)
  370. ; A0 - indirizzo bitplane
  371. ;******************************************************************************
  372.  
  373. ; costanti
  374.  
  375. DL_Fill        =    0        ; 0=NOFILL / 1=FILL
  376.  
  377.     IFEQ    DL_Fill
  378. DL_MInterns    =    $CA
  379.     ELSE
  380. DL_MInterns    =    $4A
  381.     ENDC
  382.  
  383.  
  384. DrawLine:
  385.     sub.w    d1,d3    ; D3=Y2-Y1
  386.  
  387.     IFNE    DL_Fill
  388.     beq.s    .end    ; per il fill non servono linee orizzontali 
  389.     ENDC
  390.  
  391.     bgt.s    .y2gy1    ; salta se positivo..
  392.     exg    d0,d2    ; ..altrimenti scambia i punti
  393.     add.w    d3,d1    ; mette in D1 la Y piu` piccola
  394.     neg.w    d3    ; D3=DY
  395. .y2gy1:
  396.     mulu.w    #40,d1        ; offset Y
  397.     add.l    d1,a0
  398.     moveq    #0,d1        ; D1 indice nella tabella ottanti
  399.     sub.w    d0,d2        ; D2=X2-X1
  400.     bge.s    .xdpos        ; salta se positivo..
  401.     addq.w    #2,d1        ; ..altrimenti sposta l'indice
  402.     neg.w    d2        ; e rendi positiva la differenza
  403. .xdpos:
  404.     moveq    #$f,d4        ; maschera per i 4 bit bassi
  405.     and.w    d0,d4        ; selezionali in D4
  406.         
  407.     IFNE    DL_Fill        ; queste istruzioni vengono assemblate
  408.                 ; solo se DL_Fill=1
  409.     move.b    d4,d5        ; calcola numero del bit da invertire
  410.     not.b    d5        ; (la BCHG numera i bit in modo inverso    
  411.     ENDC
  412.  
  413.     lsr.w    #3,d0        ; offset X:
  414.                 ; Allinea a byte (serve per BCHG)
  415.     add.w    d0,a0        ; aggiunge all'indirizzo
  416.                 ; nota che anche se l'indirizzo
  417.                 ; e` dispari non fa nulla perche`
  418.                 ; il blitter non tiene conto del
  419.                 ; bit meno significativo di BLTxPT
  420.  
  421.     ror.w    #4,d4        ; D4 = valore di shift A
  422.     or.w    #$B00+DL_MInterns,d4    ; aggiunge l'opportuno
  423.                     ; Minterm (OR o EOR)
  424.     swap    d4        ; valore di BLTCON0 nella word alta
  425.         
  426.     cmp.w    d2,d3        ; confronta DiffX e DiffY
  427.     bge.s    .dygdx        ; salta se >=0..
  428.     addq.w    #1,d1        ; altrimenti setta il bit 0 del'indice
  429.     exg    d2,d3        ; e scambia le Diff
  430. .dygdx:
  431.     add.w    d2,d2        ; D2 = 2*DiffX
  432.     move.w    d2,d0        ; copia in D0
  433.     sub.w    d3,d0        ; D0 = 2*DiffX-DiffY
  434.     addx.w    d1,d1        ; moltiplica per 2 l'indice e
  435.                 ; contemporaneamente aggiunge il flag
  436.                 ; X che vale 1 se 2*DiffX-DiffY<0
  437.                 ; (settato dalla sub.w)
  438.     move.b    Oktants(PC,d1.w),d4    ; legge l'ottante
  439.     swap    d2            ; valore BLTBMOD in word alta
  440.     move.w    d0,d2            ; word bassa D2=2*DiffX-DiffY
  441.     sub.w    d3,d2            ; word bassa D2=2*DiffX-2*DiffY
  442.     moveq    #6,d1            ; valore di shift e di test per
  443.                     ; la wait blitter 
  444.  
  445.     lsl.w    d1,d3        ; calcola il valore di BLTSIZE
  446.     add.w    #$42,d3
  447.  
  448.     lea    $52(a5),a1    ; A1 = indirizzo BLTAPTL
  449.                 ; scrive alcuni registri
  450.                 ; consecutivamente con delle 
  451.                 ; MOVE #XX,(Ax)+
  452.  
  453.     btst    d1,2(a5)    ; aspetta il blitter
  454. .wb:
  455.     btst    d1,2(a5)
  456.     bne.s    .wb
  457.  
  458.     IFNE    DL_Fill        ; questa istruzione viene assemblata
  459.                 ; solo se DL_Fill=1
  460.     bchg    d5,(a0)        ; Inverte il primo bit della linea
  461.     ENDC
  462.  
  463.     move.l    d4,$40(a5)    ; BLTCON0/1
  464.     move.l    d2,$62(a5)    ; BLTBMOD e BLTAMOD
  465.     move.l    a0,$48(a5)    ; BLTCPT
  466.     move.w    d0,(a1)+    ; BLTAPTL
  467.     move.l    a0,(a1)+    ; BLTDPT
  468.     move.w    d3,(a1)        ; BLTSIZE
  469. .end:
  470.     rts
  471.  
  472. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  473. ; se vogliamo eseguire linee per il fill, il codice ottante setta ad 1 il bit
  474. ; SING attraverso la costante SML
  475.  
  476.     IFNE    DL_Fill
  477. SML        =     2
  478.     ELSE
  479. SML        =    0
  480.     ENDC
  481.  
  482. ; tabella ottanti
  483.  
  484. Oktants:
  485.     dc.b    SML+1,SML+1+$40
  486.     dc.b    SML+17,SML+17+$40
  487.     dc.b    SML+9,SML+9+$40
  488.     dc.b    SML+21,SML+21+$40
  489.  
  490. ;******************************************************************************
  491. ; Questa routine setta i registri del blitter che non devono essere
  492. ; cambiati tra una line e l'altra
  493. ;******************************************************************************
  494.  
  495. InitLine
  496.     btst    #6,2(a5) ; dmaconr
  497. WBlit_Init:
  498.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  499.     bne.s    Wblit_Init
  500.  
  501.     moveq    #-1,d5
  502.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  503.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  504.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  505.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  506.     rts
  507.  
  508. ;******************************************************************************
  509. ; Questa routine definisce il pattern che deve essere usato per disegnare
  510. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  511. ; D0 - contiene il pattern della linea 
  512. ;******************************************************************************
  513. SetPattern
  514.     btst    #6,2(a5) ; dmaconr
  515. WBlit_Set:
  516.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  517.     bne.s    Wblit_Set
  518.  
  519.     move.w    d0,$72(a5)    ; BLTBDAT = pattern della linea
  520.     rts
  521.  
  522.  
  523. ;****************************************************************************
  524. ; Questa routine cancella lo schermo mediante il blitter.
  525. ;****************************************************************************
  526.  
  527. CancellaSchermo:
  528.     move.l    draw_buffer(pc),a0    ; indirizzo area da cancellare
  529.  
  530.     btst    #6,2(a5)
  531. WBlit3:
  532.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  533.     bne.s    wblit3
  534.  
  535.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  536.     move.w    #$0000,$66(a5)        ; BLTDMOD=0
  537.     move.l    a0,$54(a5)        ; BLTDPT
  538.     move.w    #(64*256)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  539.                     ; cancella tutto lo schermo
  540.     rts
  541.  
  542. ;****************************************************************************
  543. ; Questa routine scambia i 2 buffer scambiando gli indirizzi nelle
  544. ; variabili VIEW_BUFFER e  DRAW_BUFFER.
  545. ; Inoltre aggiorna nella copperlist le istruzioni che caricano i registri
  546. ; BPLxPT, in modo che puntino al nuovo buffer da visualizzare.
  547. ;****************************************************************************
  548.  
  549. ScambiaBuffer
  550.     move.l    draw_buffer(pc),d0        ; scambia il contenuto
  551.     move.l    view_buffer(pc),draw_buffer    ; delle variabili
  552.     move.l    d0,view_buffer            ; in d0 c'e` l'indirizzo
  553.                         ; del nuovo buffer
  554.                         ; da visualizzare
  555.  
  556. ; aggiorna la copperlist puntando i bitplanes del nuovo buffer da visualizzare
  557.  
  558.     LEA    BPLPOINTERS,A1    ; puntatori COP
  559.     move.w    d0,6(a1)
  560.     swap    d0
  561.     move.w    d0,2(a1)
  562.     rts
  563.  
  564.  
  565. ; puntatori ai 2 buffer
  566.  
  567. view_buffer:    dc.l    BITPLANE    ; buffer visualizzato
  568. draw_buffer:    dc.l    BITPLANEb    ; buffer di disegno
  569.  
  570. ;****************************************************************************
  571.  
  572.     SECTION    GRAPHIC,DATA_C
  573.  
  574. COPPERLIST:
  575.     dc.w    $8E,$2c81    ; DiwStrt
  576.     dc.w    $90,$2cc1    ; DiwStop
  577.     dc.w    $92,$38        ; DdfStart
  578.     dc.w    $94,$d0        ; DdfStop
  579.     dc.w    $102,0        ; BplCon1
  580.     dc.w    $104,0        ; BplCon2
  581.     dc.w    $108,0        ; Bpl1Mod
  582.     dc.w    $10a,0        ; Bpl2Mod
  583.  
  584.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  585.  
  586. BPLPOINTERS:
  587.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  588.  
  589.     dc.w    $0180,$000    ; color0
  590.     dc.w    $0182,$eee    ; color1
  591.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  592.  
  593. ;****************************************************************************
  594.  
  595.     Section    IlMioPlane,bss_C
  596.  
  597. ; buffer 1
  598.  
  599. BITPLANE:
  600.     ds.b    40*256        ; bitplane azzerato lowres
  601.  
  602. ; buffer 2
  603.  
  604. BITPLANEb:
  605.     ds.b    40*256        ; bitplane azzerato lowres
  606.  
  607.     end
  608.  
  609. ;****************************************************************************
  610.  
  611. In questo esempio aggiungiamo altre linee al programma lezione10h1.s
  612. realizzando effetti piu` complessi. Le linee successive alla prima vengono
  613. disegnate prendendo come coordinate dei valori letti sempre dalla tabella.
  614. Per calcolare le nuove coordinate vengono aggiunti agli indici dei valori
  615. ad ogni linea. Tali valori sono contenuti nelle variabili "NextAdd".
  616. Inoltre premendo il bottone destro si possono variare tutti i valori
  617. delle variabili. In questo modo si possono ottenere nuovi effetti semplicemente
  618. variando i parametri.
  619.  
  620.