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

  1.  
  2. ; Lezione10v.s    Poligono che ruota.
  3. ;        tasto 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.     move.w    #$ffff,d0    ; linea continua
  35.     bsr.w    SetPattern    ; definisce pattern
  36.  
  37. mouse:
  38.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  39.     MOVE.L    #$12c00,d2    ; linea da aspettare = $12c
  40. Waity1:
  41.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  42.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  43.     CMPI.L    D2,D0        ; aspetta la linea $12c
  44.     BNE.S    Waity1
  45.  
  46.     bsr.w    CancellaSchermo    ; pulisce lo schermo
  47.  
  48.     bsr.w    MuoviPunti    ; modifica le coordinate dei punti
  49.  
  50.     bsr.w    InitLine    ; inizializza line-mode
  51.  
  52. ; disegna la linea tra i punti 1 e 2
  53.  
  54.     move.w    Point1(pc),d0
  55.     move.w    Point1+2(pc),d1
  56.     move.w    Point2(pc),d2
  57.     move.w    Point2+2(pc),d3
  58.     lea    bitplane,a0
  59.     bsr.w    Drawline
  60.  
  61. ; disegna la linea tra i punti 2 e 3
  62.  
  63.     move.w    Point2(pc),d0
  64.     move.w    Point2+2(pc),d1
  65.     move.w    Point3(pc),d2
  66.     move.w    Point3+2(pc),d3
  67.     lea    bitplane,a0
  68.     bsr.w    Drawline
  69.  
  70. ; disegna la linea tra i punti 3 e 4
  71.  
  72.     move.w    Point3(pc),d0
  73.     move.w    Point3+2(pc),d1
  74.     move.w    Point4(pc),d2
  75.     move.w    Point4+2(pc),d3
  76.     lea    bitplane,a0
  77.     bsr.w    Drawline
  78.  
  79. ; disegna la linea tra i punti 4 e 1
  80.  
  81.     move.w    Point4(pc),d0
  82.     move.w    Point4+2(pc),d1
  83.     move.w    Point1(pc),d2
  84.     move.w    Point1+2(pc),d3
  85.     lea    bitplane,a0
  86.     bsr.w    Drawline
  87.  
  88.     moveq    #0,d0
  89.     moveq    #0,d1
  90.     lea    bitplane+178*40-2,a0
  91.     bsr.w    Fill
  92.  
  93.     btst    #6,$bfe001    ; mouse premuto?
  94.     bne.w    mouse
  95.     rts
  96.  
  97. ;***************************************************************************
  98. ; Questa routine legge da una tabella le coordinate dei vari punti e le
  99. ; memorizza nelle apposite variabili.
  100. ;***************************************************************************
  101.  
  102. ;              _
  103. ;         _/\/¯/
  104. ;         \___/
  105. ;         /   \
  106. ;        / o O \
  107. ;       (_______)
  108. ;       _| / \ |_
  109. ;      / |(___)| \
  110. ;     /  l_____|  \
  111. ;    Y    | U |    Y
  112. ;    |  ¦ l___| ¦ .|
  113. ;    |  ¡       ¡ :|
  114. ;    l__|-------l__|
  115. ;      |        .|
  116. ;      |    ¡   :|
  117. ;      |    ¦   ·|
  118. ;      |    ¦    |
  119. ;    .-`----·----'-.
  120. ;    ¡_____| l_____¡bHe
  121.     
  122. MuoviPunti:
  123.     ADDQ.L    #2,TABXPOINT        ; Fai puntare alla word successiva
  124.     MOVE.L    TABXPOINT(PC),A0    ; indirizzo contenuto in long TABXPOINT
  125.                     ; copiato in a0
  126.     CMP.L    #FINETABX-2,A0      ; Siamo all'ultima word della TAB?
  127.     BNE.S    NOBSTARTX        ; non ancora? allora continua
  128.     MOVE.L    #TABX-2,TABXPOINT     ; Riparti a puntare dalla prima word-2
  129. NOBSTARTX:
  130.     MOVE.W    (A0),Point1        ; copia il valore della coordinata
  131.                     ; del punto 1 nella variabile apposita
  132.  
  133.     LEA    50(A0),A0        ; Coordinata del punto seguente
  134.     CMP.L    #FINETABX-2,A0          ; Siamo all'ultima word della TAB?
  135.     BLE.S    NOBSTARTX2        ; no allora leggi
  136.     SUB.L    #FINETABX-TABX,A0     ; altrimenti torna indietro nella
  137.                     ; tabella
  138. NOBSTARTX2:
  139.     MOVE.W    (A0),Point2        ; copia il valore della coordinata
  140.                     ; del punto 2 nella variabile apposita
  141.  
  142.     LEA    50(A0),A0        ; Coordinata del punto seguente
  143.     CMP.L    #FINETABX-2,A0          ; Siamo all'ultima word della TAB?
  144.     BLE.S    NOBSTARTX3        ; no allora leggi
  145.     SUB.L    #FINETABX-TABX,A0     ; altrimenti torna indietro nella
  146.                     ; tabella
  147. NOBSTARTX3:
  148.     MOVE.W    (A0),Point3        ; copia il valore della coordinata
  149.                     ; del punto 3 nella variabile apposita
  150.  
  151.     LEA    50(A0),A0        ; Coordinata del punto seguente
  152.     CMP.L    #FINETABX-2,A0          ; Siamo all'ultima word della TAB?
  153.     BLE.S    NOBSTARTX4        ; no allora leggi
  154.     SUB.L    #FINETABX-TABX,A0     ; altrimenti torna indietro nella
  155.                     ; tabella
  156. NOBSTARTX4:
  157.     MOVE.W    (A0),Point4        ; copia il valore della coordinata
  158.                     ; del punto 4 nella variabile apposita
  159.  
  160.     ADDQ.L    #2,TABYPOINT        ; Fai puntare alla word successiva
  161.     MOVE.L    TABYPOINT(PC),A0    ; indirizzo contenuto in long TABYPOINT
  162.                     ; copiato in a0
  163.     CMP.L    #FINETABY-2,A0      ; Siamo all'ultima word della TAB?
  164.     BNE.S    NOBSTARTY        ; non ancora? allora continua
  165.     MOVE.L    #TABY-2,TABYPOINT     ; Riparti a puntare dalla prima word-2
  166. NOBSTARTY:
  167.     MOVE.W    (A0),Point1+2        ; copia il valore della coordinata
  168.                     ; del punto 1 nella variabile apposita
  169.  
  170.     LEA    50(A0),A0        ; Coordinata del punto seguente
  171.     CMP.L    #FINETABY-2,A0          ; Siamo all'ultima word della TAB?
  172.     BLE.S    NOBSTARTY2        ; no allora leggi
  173.     SUB.L    #FINETABY-TABY,A0     ; altrimenti torna indietro nella
  174.                     ; tabella
  175. NOBSTARTY2:
  176.     MOVE.W    (A0),Point2+2        ; copia il valore della coordinata
  177.                     ; del punto 2 nella variabile apposita
  178.  
  179.     LEA    50(A0),A0        ; Coordinata del punto seguente
  180.     CMP.L    #FINETABY-2,A0          ; Siamo all'ultima word della TAB?
  181.     BLE.S    NOBSTARTY3        ; no allora leggi
  182.     SUB.L    #FINETABY-TABY,A0     ; altrimenti torna indietro nella
  183.                     ; tabella
  184. NOBSTARTY3:
  185.     MOVE.W    (A0),Point3+2        ; copia il valore della coordinata
  186.                     ; del punto 3 nella variabile apposita
  187.  
  188.     LEA    50(A0),A0        ; Coordinata del punto seguente
  189.     CMP.L    #FINETABY-2,A0          ; Siamo all'ultima word della TAB?
  190.     BLE.S    NOBSTARTY4        ; no allora leggi
  191.     SUB.L    #FINETABY-TABY,A0     ; altrimenti torna indietro nella
  192.                     ; tabella
  193. NOBSTARTY4:
  194.     MOVE.W    (A0),Point4+2        ; copia il valore della coordinata
  195.                     ; del punto 4 nella variabile apposita
  196.     rts
  197.  
  198. TABXPOINT:
  199.     dc.l    TABX    ; puntatore alla tabella X
  200.  
  201. ; tabella posizioni X
  202.  
  203. TABX:
  204.     DC.W    $00D2,$00D2,$00D1,$00D1,$00D0,$00CF,$00CE,$00CD,$00CB,$00C9
  205.     DC.W    $00C8,$00C6,$00C3,$00C1,$00BF,$00BC,$00B9,$00B7,$00B4,$00B1
  206.     DC.W    $00AE,$00AB,$00A8,$00A5,$00A2,$009E,$009B,$0098,$0095,$0092
  207.     DC.W    $008F,$008C,$0089,$0087,$0084,$0081,$007F,$007D,$007A,$0078
  208.     DC.W    $0077,$0075,$0073,$0072,$0071,$0070,$006F,$006F,$006E,$006E
  209.     DC.W    $006E,$006E,$006F,$006F,$0070,$0071,$0072,$0073,$0075,$0077
  210.     DC.W    $0078,$007A,$007D,$007F,$0081,$0084,$0087,$0089,$008C,$008F
  211.     DC.W    $0092,$0095,$0098,$009B,$009E,$00A2,$00A5,$00A8,$00AB,$00AE
  212.     DC.W    $00B1,$00B4,$00B7,$00B9,$00BC,$00BF,$00C1,$00C3,$00C6,$00C8
  213.     DC.W    $00C9,$00CB,$00CD,$00CE,$00CF,$00D0,$00D1,$00D1,$00D2,$00D2
  214.  
  215. FINETABX:
  216.  
  217. TABYPOINT:
  218.     dc.l    TABY    ; puntatore alla tabella Y
  219.  
  220. TABY:
  221.     DC.W    $0081,$0084,$0087,$008A,$008D,$0090,$0093,$0096,$0098,$009B
  222.     DC.W    $009E,$00A0,$00A2,$00A5,$00A7,$00A8,$00AA,$00AC,$00AD,$00AE
  223.     DC.W    $00AF,$00B0,$00B0,$00B1,$00B1,$00B1,$00B1,$00B0,$00B0,$00AF
  224.     DC.W    $00AE,$00AD,$00AC,$00AA,$00A8,$00A7,$00A5,$00A2,$00A0,$009E
  225.     DC.W    $009B,$0098,$0096,$0093,$0090,$008D,$008A,$0087,$0084,$0081
  226.     DC.W    $007D,$007A,$0077,$0074,$0071,$006E,$006B,$0068,$0066,$0063
  227.     DC.W    $0060,$005E,$005C,$0059,$0057,$0056,$0054,$0052,$0051,$0050
  228.     DC.W    $004F,$004E,$004E,$004D,$004D,$004D,$004D,$004E,$004E,$004F
  229.     DC.W    $0050,$0051,$0052,$0054,$0056,$0057,$0059,$005C,$005E,$0060
  230.     DC.W    $0063,$0066,$0068,$006B,$006E,$0071,$0074,$0077,$007A,$007D
  231. FINETABY:
  232.  
  233. ; Qui sono memorizzate i volta in volta le coordinate dei punti del poligono
  234.  
  235. Point1:    dc.w    100,20
  236. Point2:    dc.w    200,20
  237. Point3:    dc.w    200,40
  238. Point4:    dc.w    100,40
  239.  
  240.  
  241. ;****************************************************************************
  242. ; Questa routine copia un rettangolo di schermo da una posizione fissa
  243. ; ad un indirizzo specificato come parametro. Il rettangolo di schermo che
  244. ; viene copiato racchiude interamente le 2 linee.
  245. ; Durante la copia viene effettuato anche il riempmento. Il tipo di riempimento
  246. ; e` specificato tramite i parametri.
  247. ; I parametri sono:
  248. ; A0 - indirizzo rettangolo da fillare
  249. ; D0 - se vale 0 allora effettua fill inclusivo, altrimenti fa fill esclusivo
  250. ; D1 - se vale 0 allora effettua FILL_CARRYIN=0, altrimenti FILL_CARRYIN=1
  251. ;****************************************************************************
  252.  
  253. Fill:
  254.     btst    #6,2(a5) ; dmaconr
  255. WBlit1:
  256.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  257.     bne.s    wblit1
  258.  
  259.     move.w    #$09f0,$40(a5)        ; BLTCON0 copia normale
  260.  
  261.     tst.w    d0            ; testa D0 per decidere il tipo di fill
  262.     bne.s    fill_esclusivo
  263.     move.w    #$000a,d2        ; valore di BLTCON1: settati i bit del
  264.                     ; fill inclusivo e del modo discendente
  265.     bra.s    test_fill_carry
  266.  
  267. fill_esclusivo:
  268.     move.w    #$0012,d2        ; valore di BLTCON1: settati i bit del
  269.                     ; fill esclusivo e del modo discendente
  270.  
  271. test_fill_carry:
  272.     tst.w    d1            ; testa D1 per vedere se deve settare
  273.                     ; il bit FILL_CARRYIN
  274.  
  275.     beq.s    fatto_bltcon1        ; se D1=0 salta..
  276.     bset    #2,d2            ; altrimenti setta il bit 2 di D2
  277.  
  278. fatto_bltcon1:
  279.     move.w    d2,$42(a5)        ; BLTCON1
  280.  
  281.     move.w    #0,$64(a5)        ; BLTAMOD larghezza 20 words (40-40=0)
  282.     move.w    #0,$66(a5)        ; BLTDMOD (40-40=0)
  283.  
  284.     move.l    a0,$50(a5)        ; BLTAPT - indirizzo al rettangolo
  285.                     ; il rettangolo sorgente racchiude
  286.                     ; interamente il poligono
  287.                     ; puntiamo l'ultima word del rettangolo
  288.                     ; per via del modo discendente
  289.  
  290.     move.l    a0,$54(a5)        ; BLTDPT - indirizzo rettangolo
  291.     move.w    #(64*100)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  292.                     ; larghezza 20 words
  293.     rts                ; altezza 100 righe (1 plane)
  294.  
  295.  
  296. ;******************************************************************************
  297. ; Questa routine effettua il disegno della linea. prende come parametri gli
  298. ; estremi della linea P1 e P2, e l'indirizzo del bitplane su cui disegnarla.
  299. ; D0 - X1 (coord. X di P1)
  300. ; D1 - Y1 (coord. Y di P1)
  301. ; D2 - X2 (coord. X di P2)
  302. ; D3 - Y2 (coord. Y di P2)
  303. ; A0 - indirizzo bitplane
  304. ;******************************************************************************
  305.  
  306. ; costanti
  307.  
  308. DL_Fill        =    1        ; 0=NOFILL / 1=FILL
  309.  
  310.     IFEQ    DL_Fill
  311. DL_MInterns    =    $CA
  312.     ELSE
  313. DL_MInterns    =    $4A
  314.     ENDC
  315.  
  316.  
  317. DrawLine:
  318.     sub.w    d1,d3    ; D3=Y2-Y1
  319.  
  320.     IFNE    DL_Fill
  321.     beq.s    .end    ; per il fill non servono linee orizzontali 
  322.     ENDC
  323.  
  324.     bgt.s    .y2gy1    ; salta se positivo..
  325.     exg    d0,d2    ; ..altrimenti scambia i punti
  326.     add.w    d3,d1    ; mette in D1 la Y piu` piccola
  327.     neg.w    d3    ; D3=DY
  328. .y2gy1:
  329.     mulu.w    #40,d1        ; offset Y
  330.     add.l    d1,a0
  331.     moveq    #0,d1        ; D1 indice nella tabella ottanti
  332.     sub.w    d0,d2        ; D2=X2-X1
  333.     bge.s    .xdpos        ; salta se positivo..
  334.     addq.w    #2,d1        ; ..altrimenti sposta l'indice
  335.     neg.w    d2        ; e rendi positiva la differenza
  336. .xdpos:
  337.     moveq    #$f,d4        ; maschera per i 4 bit bassi
  338.     and.w    d0,d4        ; selezionali in D4
  339.         
  340.     IFNE    DL_Fill        ; queste istruzioni vengono assemblate
  341.                 ; solo se DL_Fill=1
  342.     move.b    d4,d5        ; calcola numero del bit da invertire
  343.     not.b    d5        ; (la BCHG numera i bit in modo inverso    
  344.     ENDC
  345.  
  346.     lsr.w    #3,d0        ; offset X:
  347.                 ; Allinea a byte (serve per BCHG)
  348.     add.w    d0,a0        ; aggiunge all'indirizzo
  349.                 ; nota che anche se l'indirizzo
  350.                 ; e` dispari non fa nulla perche`
  351.                 ; il blitter non tiene conto del
  352.                 ; bit meno significativo di BLTxPT
  353.  
  354.     ror.w    #4,d4        ; D4 = valore di shift A
  355.     or.w    #$B00+DL_MInterns,d4    ; aggiunge l'opportuno
  356.                     ; Minterm (OR o EOR)
  357.     swap    d4        ; valore di BLTCON0 nella word alta
  358.         
  359.     cmp.w    d2,d3        ; confronta DiffX e DiffY
  360.     bge.s    .dygdx        ; salta se >=0..
  361.     addq.w    #1,d1        ; altrimenti setta il bit 0 del'indice
  362.     exg    d2,d3        ; e scambia le Diff
  363. .dygdx:
  364.     add.w    d2,d2        ; D2 = 2*DiffX
  365.     move.w    d2,d0        ; copia in D0
  366.     sub.w    d3,d0        ; D0 = 2*DiffX-DiffY
  367.     addx.w    d1,d1        ; moltiplica per 2 l'indice e
  368.                 ; contemporaneamente aggiunge il flag
  369.                 ; X che vale 1 se 2*DiffX-DiffY<0
  370.                 ; (settato dalla sub.w)
  371.     move.b    Oktants(PC,d1.w),d4    ; legge l'ottante
  372.     swap    d2            ; valore BLTBMOD in word alta
  373.     move.w    d0,d2            ; word bassa D2=2*DiffX-DiffY
  374.     sub.w    d3,d2            ; word bassa D2=2*DiffX-2*DiffY
  375.     moveq    #6,d1            ; valore di shift e di test per
  376.                     ; la wait blitter 
  377.  
  378.     lsl.w    d1,d3        ; calcola il valore di BLTSIZE
  379.     add.w    #$42,d3
  380.  
  381.     lea    $52(a5),a1    ; A1 = indirizzo BLTAPTL
  382.                 ; scrive alcuni registri
  383.                 ; consecutivamente con delle 
  384.                 ; MOVE #XX,(Ax)+
  385.  
  386.     btst    d1,2(a5)    ; aspetta il blitter
  387. .wb:
  388.     btst    d1,2(a5)
  389.     bne.s    .wb
  390.  
  391.     IFNE    DL_Fill        ; questa istruzione viene assemblata
  392.                 ; solo se DL_Fill=1
  393.     bchg    d5,(a0)        ; Inverte il primo bit della linea
  394.     ENDC
  395.  
  396.     move.l    d4,$40(a5)    ; BLTCON0/1
  397.     move.l    d2,$62(a5)    ; BLTBMOD e BLTAMOD
  398.     move.l    a0,$48(a5)    ; BLTCPT
  399.     move.w    d0,(a1)+    ; BLTAPTL
  400.     move.l    a0,(a1)+    ; BLTDPT
  401.     move.w    d3,(a1)        ; BLTSIZE
  402. .end:
  403.     rts
  404.  
  405. ;­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
  406. ; se vogliamo eseguire linee per il fill, il codice ottante setta ad 1 il bit
  407. ; SING attraverso la costante SML
  408.  
  409.     IFNE    DL_Fill
  410. SML        =     2
  411.     ELSE
  412. SML        =    0
  413.     ENDC
  414.  
  415. ; tabella ottanti
  416.  
  417. Oktants:
  418.     dc.b    SML+1,SML+1+$40
  419.     dc.b    SML+17,SML+17+$40
  420.     dc.b    SML+9,SML+9+$40
  421.     dc.b    SML+21,SML+21+$40
  422.  
  423. ;******************************************************************************
  424. ; Questa routine setta i registri del blitter che non devono essere
  425. ; cambiati tra una line e l'altra
  426. ;******************************************************************************
  427.  
  428. InitLine:
  429.     btst    #6,2(a5) ; dmaconr
  430. WBlit_Init:
  431.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  432.     bne.s    Wblit_Init
  433.  
  434.     moveq    #-1,d5
  435.     move.l    d5,$44(a5)        ; BLTAFWM/BLTALWM = $FFFF
  436.     move.w    #$8000,$74(a5)        ; BLTADAT = $8000
  437.     move.w    #40,$60(a5)        ; BLTCMOD = 40
  438.     move.w    #40,$66(a5)        ; BLTDMOD = 40
  439.     rts
  440.  
  441. ;******************************************************************************
  442. ; Questa routine definisce il pattern che deve essere usato per disegnare
  443. ; le linee. In pratica si limita a settare il registro BLTBDAT.
  444. ; D0 - contiene il pattern della linea 
  445. ;******************************************************************************
  446.  
  447. SetPattern:
  448.     btst    #6,2(a5) ; dmaconr
  449. WBlit_Set:
  450.     btst    #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
  451.     bne.s    Wblit_Set
  452.  
  453.     move.w    d0,$72(a5)    ; BLTBDAT = pattern linee
  454.     rts
  455.  
  456. ;****************************************************************************
  457. ; Questa routine cancella lo schermo mediante il blitter.
  458. ;****************************************************************************
  459.  
  460. CancellaSchermo:
  461.     move.l    #bitplane+78*40,a0    ; indirizzo area da cancellare
  462.  
  463.     btst    #6,2(a5)
  464. WBlit3:
  465.     btst    #6,2(a5)         ; attendi che il blitter abbia finito
  466.     bne.s    wblit3
  467.  
  468.     move.l    #$01000000,$40(a5)    ; BLTCON0 e BLTCON1: Cancella
  469.     move.w    #$0000,$66(a5)        ; BLTDMOD=0
  470.     move.l    a0,$54(a5)        ; BLTDPT
  471.     move.w    #(64*100)+20,$58(a5)    ; BLTSIZE (via al blitter !)
  472.                     ; cancella tutto lo schermo
  473.     rts
  474.  
  475.  
  476. ;****************************************************************************
  477.  
  478.     SECTION    GRAPHIC,DATA_C
  479.  
  480. COPPERLIST:
  481.     dc.w    $8E,$2c81    ; DiwStrt
  482.     dc.w    $90,$2cc1    ; DiwStop
  483.     dc.w    $92,$38        ; DdfStart
  484.     dc.w    $94,$d0        ; DdfStop
  485.     dc.w    $102,0        ; BplCon1
  486.     dc.w    $104,0        ; BplCon2
  487.     dc.w    $108,0        ; Bpl1Mod
  488.     dc.w    $10a,0        ; Bpl2Mod
  489.  
  490.     dc.w    $100,$1200    ; Bplcon0 - 1 bitplane lowres
  491.  
  492. BPLPOINTERS:
  493.     dc.w    $e0,$0000,$e2,$0000    ;primo     bitplane
  494.  
  495.     dc.w    $0180,$000    ; color0
  496.     dc.w    $0182,$eee    ; color1
  497.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  498.  
  499. ;****************************************************************************
  500.  
  501.     Section    IlMioPlane,bss_C
  502.  
  503. BITPLANE:
  504.     ds.b    40*256        ; bitplane azzerato lowres
  505.  
  506.     end
  507.  
  508. ;****************************************************************************
  509.  
  510. In questo esempio realizziamo un poligono che ruota.
  511. Il poligono e` formato da 4 punti la cui posizione viene modificata ad ogni
  512. frame leggendola da una tabella precalcolata. Questa tecnica comporta un grande
  513. spreco di memoria. Piu` in la` nel corso vedremo come calcolare le coordinate
  514. dei punti mediante formule matematiche.
  515. Per disegnare il poligono e` sufficente disegnare i lati e fillare. Prima
  516. delle operazioni di disegno e` ovviamente necessario cancellare lo schermo
  517. con il blitter.
  518. L'area di schermo da cancellare e quella da fillare sono state calcolate
  519. in modo da comprendere sempre tutto il poligono.
  520.  
  521.