home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / plasma / plasm6.s < prev    next >
Encoding:
Text File  |  1995-12-06  |  22.6 KB  |  665 lines

  1.  
  2. ; Plasma6.s    Plasma RGB a 4-bitplanes e ondulazione
  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    "startup2.s"    ; Salva Copperlist Etc.
  11. *****************************************************************************
  12.  
  13.         ;5432109876543210
  14. DMASET    EQU    %1000001111000000    ; copper,bitplane,blitter DMA
  15.  
  16. Waitdisk    EQU    10
  17.  
  18. Largh_plasm    equ    40        ; larghezza del plasma espressa
  19.                     ; come numero di gruppi di 8 pixel
  20.  
  21. ; numero di bytes occupati nella copperlist da ogni riga del plasma: ogni
  22. ; istruzione copper occupa 4 bytes. Ogni riga e` formata da 1 WAIT, Largh_plasm
  23. ; "copper moves" per il plasma.
  24.  
  25. BytesPerRiga    equ    (Largh_plasm+1)*4
  26.  
  27. Alt_plasm    equ    190        ; altezza del plasma espressa
  28.                     ; come numero di linee
  29.  
  30. NuovaRigaR    equ    -4        ; valore sommato all'indice R nella
  31.                     ; SinTab tra una riga e l'altra
  32.                     ; Puo` essere variato ottenendo plasmi
  33.                     ; diversi, ma DEVE ESSERE SEMPRE PARI!!
  34.  
  35. NuovoFrameR    equ    16        ; valore sottratto all'indice R nella
  36.                     ; SinTab tra un frame e l'altro
  37.                     ; Puo` essere variato ottenendo plasmi
  38.                     ; diversi, ma DEVE ESSERE SEMPRE PARI!!
  39.  
  40. NuovaRigaG    equ    -22        ; come "NuovaRigaR" ma per componente G
  41. NuovoFrameG    equ    2        ; come "NuovoFrameR" ma componente G
  42.  
  43. NuovaRigaB    equ    40        ; come "NuovaRigaR" ma per componente B
  44. NuovoFrameB    equ    4        ; come "NuovoFrameR" ma componente B
  45.  
  46. NuovaRigaO    equ    4        ; come "NuovaRigaR" ma per oscillazioni
  47. NuovoFrameO    equ    2        ; come "NuovoFrameR" ma oscillazioni
  48.  
  49.  
  50. START:
  51.  
  52. ;    Puntiamo l'immagine nelle copperlist
  53.  
  54.     LEA    COPPERLIST1,A1    ; puntatori COP 1
  55.     LEA    COPPERLIST2,A2    ; puntatori COP 2
  56.     MOVE.L    #BUFFER,d0    ; dove puntare
  57.     move.w    d0,6(a1)    ; scrive in copperlist 1 
  58.     move.w    d0,6(a2)    ; scrive in copperlist 2
  59.     swap    d0
  60.     move.w    d0,2(a1)    ; scrive in copperlist 1
  61.     move.w    d0,2(a2)    ; scrive in copperlist 2
  62.  
  63. ; bitplane 2 - parte 2 bytes piu` avanti
  64.  
  65.     MOVE.L    #BUFFER+2,d0
  66.     move.w    d0,6+8(a1)
  67.     move.w    d0,6+8(a2)
  68.     swap    d0
  69.     move.w    d0,2+8(a1)
  70.     move.w    d0,2+8(a2)
  71.  
  72. ; bitplane 3 - parte 2 bytes piu` avanti
  73.  
  74.     MOVE.L    #BUFFER+2,d0
  75.     move.w    d0,6+8*2(a1)
  76.     move.w    d0,6+8*2(a2)
  77.     swap    d0
  78.     move.w    d0,2+8*2(a1)
  79.     move.w    d0,2+8*2(a2)
  80.  
  81. ; bitplane 4 - parte 4 bytes piu` avanti
  82.  
  83.     MOVE.L    #BUFFER+4,d0
  84.     move.w    d0,6+8*3(a1)
  85.     move.w    d0,6+8*3(a2)
  86.     swap    d0
  87.     move.w    d0,2+8*3(a1)
  88.     move.w    d0,2+8*3(a2)
  89.  
  90.     lea    $dff000,a5        ; CUSTOM REGISTER in a5
  91.  
  92.     bsr    InitPlasma        ; inizializza la copperlist
  93.  
  94. ; Inizializza i registri del blitter
  95.  
  96.     Btst    #6,2(a5)
  97. WaitBlit_init:
  98.     Btst    #6,2(a5)        ; aspetta il blitter
  99.     bne.s    WaitBlit_init
  100.  
  101.     moveq    #-1,d0            ; D0 = $FFFFFFFF
  102.     move.l    d0,$44(a5)        ; BLTAFWM/BLTALWM
  103.  
  104.     move.w    #$8000,$42(a5)        ; BLTCON1 - shift 8 pixel canale B
  105.                     ; (usato per il plasma)
  106.  
  107. mod_A    set    0            ; modulo canale A
  108. mod_D    set    BytesPerRiga-2        ; modulo canale D: va a riga seguente
  109.  
  110.     move.l    #mod_A<<16+mod_D,$64(a5)    ; carica i registri modulo
  111.  
  112. ; moduli canali B e C = 0
  113.  
  114.     moveq    #0,d0
  115.     move.l    d0,$60(a5)        ; scrive BLTBMOD e BLTCMOD
  116.  
  117.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  118.     move.l    #COPPERLIST1,$80(a5)    ; Puntiamo la nostra COP
  119.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  120.  
  121. ; Inizializza altri registri hardware
  122. ; D0=0
  123.     move.w    d0,$1fc(a5)        ; Disattiva l'AGA
  124.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  125.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  126.     move.l    d0,$180(a5)        ; COLOR00 e COLOR01 - nero
  127.     move.w    #$30b8,$8e(a5)        ; DiwStrt - usiamo una finestra piu`
  128.                     ; piccola dello schermo per mascherare
  129.                     ; i bordi ondulati.
  130.     move.w    #$ee90,$90(a5)        ; DiwStop
  131.  
  132.     move.w    #$0038,$92(a5)        ; DDFStrt - vengono fetchati 40 bytes
  133.     move.w    #$00d0,$94(a5)        ; DDFStop
  134.     move.w    d0,$104(a5)        ; BPLCON2
  135.     move.w    #$0080,$102(a5)        ; BPLCON1 - i planes pari sono shiftati
  136.                     ; di 8 pixel a destra
  137.     move.w    #4,$108(a5)        ; BPL1MOD = 4 - fetcha 40 bytes su 44
  138.     move.w    #4,$10a(a5)        ; BPL2MOD = 4 - fetcha 40 bytes su 44
  139.     move.w    #$4200,$100(a5)        ; BPLCON0 - 4 bitplanes attivi
  140.  
  141. mouse2:
  142.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  143.     MOVE.L    #$13000,d2    ; linea da aspettare = $130, ossia 304
  144. Waity2:
  145.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  146.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  147.     CMPI.L    D2,D0        ; aspetta la linea $130 (304)
  148.     BNE.S    Waity2
  149.  
  150.     bsr    ScambiaClists    ; scambia le copperlist
  151.  
  152.     bsr    DoOriz        ; effetto oscillazione orizzontale
  153.     bsr    DoPlasma
  154.  
  155.     btst    #6,$bfe001    ; mouse premuto?
  156.     bne.s    mouse2
  157.     rts
  158.  
  159. ;****************************************************************************
  160. ; Questa routine crea i bitplanes realizzando l'effetto di oscillazione.
  161. ; Il buffer all'indirizzo "PlasmaLine" contiene una riga della figura.
  162. ; Questo buffer viene copiato nel buffer video tante volte quanto e` alto
  163. ; il plasma, formando cosi` tutta la figura. Ogni riga viene shiftata verso
  164. ; destra di un valore variabile, creando cosi` l'ondulazione.
  165. ;****************************************************************************
  166.  
  167. DoOriz:
  168.     lea    OrizTab(pc),a0        ; indirizzo tabella oscillazioni
  169.     lea    BUFFER,a1        ; indirizzo buffer video (destinazione)
  170.     lea    PlasmaLine,a3        ; indirizzo buffer che contiene la
  171.                     ; linea (sorgente)
  172.  
  173.     move.w    #1*64+19,d2        ; dimensione blittata:
  174.                     ; larghezza 40 bytes
  175.                     ; altezza 1 linea
  176.  
  177. ; legge e modifica indice
  178.  
  179.     move.w    IndiceO(pc),d4        ; legge l'indice di partenza del
  180.                     ; frame precedente
  181.     sub.w    #NuovoFrameO,d4        ; modifica l'indice nella tabella
  182.                     ; dal frame precedente
  183.     and.w    #$00FF,d4        ; tiene l'indice nell'intervallo
  184.                     ; 0 - 255 (offset in una tabella di
  185.                     ; 256 bytes)
  186.     move.w    d4,IndiceO        ; memorizza l'indice di partenza per
  187.                     ; il prossimo frame
  188.  
  189.     move.w    #Alt_plasm-1,d3        ; loop per ogni riga
  190. OrizLoop:
  191.     move.b    0(a0,d4.w),d0        ; leggi valore dell'oscillazione
  192.  
  193.     moveq    #0,d1            ; pulisce D1
  194.     move.b    d0,d1            ; copia valore oscillazione
  195.     and.w    #$000f,d0        ; lascia solo i 4 bit bassi
  196.     ror.w    #4,d0            ; li sposta nelle prime posizioni
  197.     or.w    #$09f0,d0        ; valore da scrivere in BLTCON0
  198.  
  199.     asr.w    #4,d1            
  200.     add.w    d1,d1            ; calcola numero di bytes
  201.     lea    (a1,d1.w),a2        ; indirizzo sorgente
  202.  
  203.     Btst    #6,2(a5)
  204. WaitBlit_Oriz:
  205.     Btst    #6,2(a5)        ; aspetta il blitter
  206.     bne.s    WaitBlit_Oriz
  207.  
  208.     move.w    d0,$40(a5)        ; BLTCON0 - copia da A a D con shift
  209.     move.l    a3,$50(a5)        ; BLTAPT - indirizzo sorgente
  210.     move.l    a2,$54(a5)        ; BLTDPT - indirizzo destinazione
  211.     move.w    d2,$58(a5)        ; BLTSIZE
  212.  
  213.     lea    44(a1),a1        ; punta alla prossima riga 
  214.                     ; del buffer video
  215.  
  216. ; modifica indice per prossima riga
  217.  
  218.     add.w    #NuovaRigaO,d4        ; modifica l'indice nella tabella
  219.                     ; per la prossima riga
  220.  
  221.     and.w    #$00FF,d4        ; tiene l'indice nell'intervallo
  222.                     ; 0 - 255 (offset in una tabella di
  223.                     ; 256 bytes)
  224.     dbra    d3,OrizLoop
  225.     rts
  226.  
  227. ;****************************************************************************
  228. ; Questa routine realizza il "double buffer" tra le copperlist.
  229. ; In pratica prende la clist dove si e` disegnato, e la visualizza copiandone
  230. ; l'indirizzo in COP1LC. Scambia le variabili, in modo tale che nel frame
  231. ; che segue si disegna sull'altra copper list
  232. ;****************************************************************************
  233.  
  234. ScambiaClists:
  235.     move.l    draw_clist(pc),d0    ; indirizzo clist su cui si e` scritto
  236.     move.l    view_clist(pc),draw_clist    ; scambia le clists
  237.     move.l    d0,view_clist
  238.  
  239.     move.l    d0,$80(a5)        ; copia l'indirizzo della clist
  240.                     ; in COP1LC in maniera che venga
  241.                     ; visualizzata nel prossimo frame
  242.     rts
  243.  
  244.  
  245. ;****************************************************************************
  246. ; Questa routine inizializza la copperlist che genera il plasma. Sistema le
  247. ; istruzioni WAIT e le prima meta` delle COPPERMOVE.
  248. ;****************************************************************************
  249.  
  250. InitPlasma:
  251.     lea    Plasma1,a0    ; indirizzo plasma 1
  252.     lea    Plasma2,a1    ; indirizzo plasma 2
  253.     move.l    #$303FFFFE,d0    ; carica la prima istruzione wait in D0.
  254.                 ; aspetta la riga $30 e la posizione
  255.                 ; orizzontale $3F
  256.  
  257.     move.w    #Alt_plasm-1,d3        ; loop per ogni riga
  258. InitLoop1:
  259.  
  260.     move.l    d0,(a0)+        ; scrive la WAIT - (clist 1)
  261.     move.l    d0,(a1)+        ; scrive la WAIT - (clist 2)
  262.     add.l    #$01000000,d0        ; modifica la WAIT per aspettare
  263.                     ; la riga seguente
  264.  
  265.     moveq    #Largh_plasm/8-1,d2    ; ogni iterazione scrive 8 copper moves
  266.  
  267. InitLoop2:
  268.  
  269. ; copperlist 1
  270.  
  271.     move.w    #$0194,(a0)+        ;comb 10
  272.     addq.w    #2,a0            ; spazio per la seconda parte
  273.                     ; della "copper move"
  274.     move.w    #$019a,(a0)+        ; colore 13
  275.     addq.w    #2,a0
  276.     move.w    #$018c,(a0)+        ; colore 6
  277.     addq.w    #2,a0
  278.     move.w    #$0196,(a0)+        ; colore 11
  279.     addq.w    #2,a0
  280.     move.w    #$018a,(a0)+        ; colore 5
  281.     addq.w    #2,a0
  282.     move.w    #$0184,(a0)+        ; colore 2
  283.     addq.w    #2,a0
  284.     move.w    #$0192,(a0)+        ; colore 9
  285.     addq.w    #2,a0
  286.     move.w    #$0188,(a0)+        ; colore 4
  287.     addq.w    #2,a0
  288.  
  289. ; copperlist 2
  290.  
  291.     move.w    #$0194,(a1)+        ; colore 10
  292.     addq.w    #2,a1            ; spazio per la seconda parte
  293.                     ; della "copper move"
  294.     move.w    #$019a,(a1)+        ; colore 13
  295.     addq.w    #2,a1
  296.     move.w    #$018c,(a1)+        ; colore 6
  297.     addq.w    #2,a1
  298.     move.w    #$0196,(a1)+        ; colore 11
  299.     addq.w    #2,a1
  300.     move.w    #$018a,(a1)+        ; colore 5
  301.     addq.w    #2,a1
  302.     move.w    #$0184,(a1)+        ; colore 2
  303.     addq.w    #2,a1
  304.     move.w    #$0192,(a1)+        ; colore 9
  305.     addq.w    #2,a1
  306.     move.w    #$0188,(a1)+        ; colore 4
  307.     addq.w    #2,a1
  308.     dbra    d2,InitLoop2
  309.     dbra    d3,InitLoop1
  310.     rts
  311.  
  312.  
  313. ;****************************************************************************
  314. ; Questa routine realizza il plasma. Effettua un loop di blittate, ciascuna
  315. ; delle quali scrive una "colonna" del plasma, cioe` scrive i colori nelle
  316. ; COPPERMOVES messe in colonna.
  317. ; I colori scritti in ogni colonna sono letti da una tabella, a partire da
  318. ; un indirizzo che varia tra una colonna e l'altra in base a degli offset
  319. ; letti da un'altra tabella. Inoltre tra un frame e l'altro gli offset
  320. ; variano, realizzando l'effetto di movimento.
  321. ;****************************************************************************
  322.  
  323. DoPlasma:
  324.     lea    Color,a0        ; indirizzo colori
  325.     lea    SinTab,a6        ; indirizzo tabella offsets
  326.     move.l    draw_clist(pc),a1    ; indirizzo copperlist dove scrivere
  327.     lea    38(a1),a1        ; indirizzo prima word della prima
  328.                     ; colonna del plasma
  329. ; legge e modifica indice componente R
  330.  
  331.     move.w    IndiceR(pc),d4        ; legge l'indice di partenza del
  332.                     ; frame precedente
  333.     sub.w    #NuovoFrameR,d4        ; modifica l'indice nella tabella
  334.                     ; dal frame precedente
  335.     and.w    #$00FF,d4        ; tiene l'indice nell'intervallo
  336.                     ; 0 - 255 (offset in una tabella di
  337.                     ; 128 words)
  338.     move.w    d4,IndiceR        ; memorizza l'indice di partenza per
  339.                     ; il prossimo frame
  340. ; legge e modifica indice componente G
  341.  
  342.     move.w    IndiceG(pc),d5        ; legge l'indice di partenza del
  343.                     ; frame precedente
  344.     sub.w    #NuovoFrameG,d5        ; modifica l'indice nella tabella
  345.                     ; dal frame precedente
  346.     and.w    #$00FF,d5        ; tiene l'indice nell'intervallo
  347.                     ; 0 - 255 (offset in una tabella di
  348.                     ; 128 words)
  349.     move.w    d5,IndiceG        ; memorizza l'indice di partenza per
  350.                     ; il prossimo frame
  351. ; legge e modifica indice componente B
  352.  
  353.     move.w    IndiceB(pc),d6        ; legge l'indice di partenza del
  354.                     ; frame precedente
  355.     sub.w    #NuovoFrameB,d6        ; modifica l'indice nella tabella
  356.                     ; dal frame precedente
  357.     and.w    #$00FF,d6        ; tiene l'indice nell'intervallo
  358.                     ; 0 - 255 (offset in una tabella di
  359.                     ; 128 words)
  360.     move.w    d6,IndiceB        ; memorizza l'indice di partenza per
  361.                     ; il prossimo frame
  362.  
  363.     move.w    #Alt_plasm<<6+1,d3    ; dimensione blittata
  364.                     ; largh. 1 word, alta tutto il plasma
  365.  
  366.     moveq    #Largh_plasm-6-1,d2    ; il loop NON viene ripetuto per tutta
  367.                     ; la larghezza. Le colonne piu` a
  368.                     ; destra non sono visibili,
  369.                     ; quindi e` inutile blittarle.
  370.  
  371.     Btst    #6,2(a5)        ; inizializza i registri blitter
  372. WaitBlit_Plasma:            ; per il plasma
  373.     Btst    #6,2(a5)        ; aspetta il blitter
  374.     bne.s    WaitBlit_Plasma
  375.  
  376.     move.w    #$4FFE,$40(a5)        ; BLTCON0 - D=A+B+C, shift A = 4 pixel
  377.  
  378. PlasmaLoop:                ; inizio loop blittate
  379.  
  380. ; calcola indirizzo di partenza componente R
  381.  
  382.     move.w    (a6,d4.w),d1        ; legge offset dalla tabella
  383.  
  384.     lea    (a0,d1.w),a2        ; indirizzo di partenza = ind. colori
  385.                     ; piu` offset
  386.  
  387. ; calcola indirizzo di partenza componente G
  388.  
  389.     move.w    (a6,d5.w),d1        ; legge offset dalla tabella
  390.  
  391.     lea    (a0,d1.w),a3        ; indirizzo di partenza = ind. colori
  392.                     ; piu` offset
  393.  
  394. ; calcola indirizzo di partenza componente B
  395.  
  396.     move.w    (a6,d6.w),d1        ; legge offset dalla tabella
  397.  
  398.     lea    (a0,d1.w),a4        ; indirizzo di partenza = ind. colori
  399.                     ; piu` offset
  400.  
  401.     Btst    #6,2(a5)
  402. WaitBlit:
  403.     Btst    #6,2(a5)        ; aspetta il blitter
  404.     bne.s    WaitBlit
  405.  
  406.     move.l    a2,$48(a5)        ; BLTCPT - indirizzo sorgente R
  407.     move.l    a3,$50(a5)        ; BLTAPT - indirizzo sorgente G
  408.     move.l    a4,$4C(a5)        ; BLTBPT - indirizzo sorgente B
  409.     move.l    a1,$54(a5)        ; BLTDPT - indirizzo destinazione
  410.     move.w    d3,$58(a5)        ; BLTSIZE
  411.  
  412.     addq.w    #4,a1            ; punta a prossima colonna di 
  413.                     ; "copper moves" nella copper list
  414.  
  415. ; modifica indice componente R per prossima riga
  416.  
  417.     add.w    #NuovaRigaR,d4        ; modifica l'indice nella tabella
  418.                     ; per la prossima riga
  419.  
  420.     and.w    #$00FF,d4        ; tiene l'indice nell'intervallo
  421.                     ; 0 - 255 (offset in una tabella di
  422.                     ; 128 words)
  423.  
  424. ; modifica indice componente G per prossima riga
  425.  
  426.     add.w    #NuovaRigaG,d5        ; modifica l'indice nella tabella
  427.                     ; per la prossima riga
  428.  
  429.     and.w    #$00FF,d5        ; tiene l'indice nell'intervallo
  430.                     ; 0 - 255 (offset in una tabella di
  431.                     ; 128 words)
  432.  
  433. ; modifica indice componente B per prossima riga
  434.  
  435.     add.w    #NuovaRigaB,d6        ; modifica l'indice nella tabella
  436.                     ; per la prossima riga
  437.  
  438.     and.w    #$00FF,d6        ; tiene l'indice nell'intervallo
  439.                     ; 0 - 255 (offset in una tabella di
  440.                     ; 128 words)
  441.     dbra    d2,PlasmaLoop
  442.     rts
  443.  
  444.  
  445. ; Queste 2 variabili contengono gli indirizzi delle 2 copperlist
  446.  
  447. view_clist:    dc.l    COPPERLIST1    ; indirizzo clist visualizzata
  448. draw_clist:    dc.l    COPPERLIST2    ; indirizzo clist dove disegnare
  449.  
  450. ; Questa variabile contiene il valore dell'indice nella tabella delle
  451. ; oscillazioni
  452.  
  453. IndiceO:    dc.w    0
  454.  
  455. ; Questa tabella contiene i valori delle oscillazioni
  456.  
  457. OrizTab:
  458.     DC.B    $1C,$1D,$1E,$1E,$1F,$20,$20,$21,$22,$22,$23,$24,$24,$25,$25,$26
  459.     DC.B    $27,$27,$28,$28,$29,$2A,$2A,$2B,$2B,$2C,$2C,$2D,$2D,$2E,$2E,$2F
  460.     DC.B    $2F,$30,$30,$31,$31,$31,$32,$32,$33,$33,$33,$34,$34,$34,$35,$35
  461.     DC.B    $35,$35,$36,$36,$36,$36,$36,$36,$37,$37,$37,$37,$37,$37,$37,$37
  462.     DC.B    $37,$37,$37,$37,$37,$37,$37,$37,$36,$36,$36,$36,$36,$36,$35,$35
  463.     DC.B    $35,$35,$34,$34,$34,$33,$33,$33,$32,$32,$31,$31,$31,$30,$30,$2F
  464.     DC.B    $2F,$2E,$2E,$2D,$2D,$2C,$2C,$2B,$2B,$2A,$2A,$29,$28,$28,$27,$27
  465.     DC.B    $26,$25,$25,$24,$24,$23,$22,$22,$21,$20,$20,$1F,$1E,$1E,$1D,$1C
  466.     DC.B    $1C,$1B,$1A,$1A,$19,$18,$18,$17,$16,$16,$15,$14,$14,$13,$13,$12
  467.     DC.B    $11,$11,$10,$10,$0F,$0E,$0E,$0D,$0D,$0C,$0C,$0B,$0B,$0A,$0A,$09
  468.     DC.B    $09,$08,$08,$07,$07,$07,$06,$06,$05,$05,$05,$04,$04,$04,$03,$03
  469.     DC.B    $03,$03,$02,$02,$02,$02,$02,$02,$01,$01,$01,$01,$01,$01,$01,$01
  470.     DC.B    $01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$02,$03,$03
  471.     DC.B    $03,$03,$04,$04,$04,$05,$05,$05,$06,$06,$07,$07,$07,$08,$08,$09
  472.     DC.B    $09,$0A,$0A,$0B,$0B,$0C,$0C,$0D,$0D,$0E,$0E,$0F,$10,$10,$11,$11
  473.     DC.B    $12,$13,$13,$14,$14,$15,$16,$16,$17,$18,$18,$19,$1A,$1A,$1B,$1C
  474.  
  475. ; Queste variabili contengono i valori degli indici per la prima colonna
  476.  
  477. IndiceR:    dc.w    0
  478. IndiceG:    dc.w    0
  479. IndiceB:    dc.w    0
  480.  
  481. ; Questa tabella contiene gli offset per l'indirizzo di partenza nella
  482. ; tabella dei colori
  483.  
  484. SinTab:
  485.     DC.W    $0034,$0036,$0038,$003A,$003C,$0040,$0042,$0044,$0046,$0048
  486.     DC.W    $004A,$004C,$004E,$0050,$0052,$0054,$0056,$0058,$005A,$005A
  487.     DC.W    $005C,$005E,$005E,$0060,$0060,$0062,$0062,$0062,$0064,$0064
  488.     DC.W    $0064,$0064,$0064,$0064,$0064,$0064,$0062,$0062,$0062,$0060
  489.     DC.W    $0060,$005E,$005E,$005C,$005A,$005A,$0058,$0056,$0054,$0052
  490.     DC.W    $0050,$004E,$004C,$004A,$0048,$0046,$0044,$0042,$0040,$003C
  491.     DC.W    $003A,$0038,$0036,$0034,$0030,$002E,$002C,$002A,$0028,$0024
  492.     DC.W    $0022,$0020,$001E,$001C,$001A,$0018,$0016,$0014,$0012,$0010
  493.     DC.W    $000E,$000C,$000A,$000A,$0008,$0006,$0006,$0004,$0004,$0002
  494.     DC.W    $0002,$0002,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
  495.     DC.W    $0002,$0002,$0002,$0004,$0004,$0006,$0006,$0008,$000A,$000A
  496.     DC.W    $000C,$000E,$0010,$0012,$0014,$0016,$0018,$001A,$001C,$001E
  497.     DC.W    $0020,$0022,$0024,$0028,$002A,$002C,$002E,$0030
  498. EndSinTab:
  499.  
  500. ;****************************************************************************
  501.  
  502.     SECTION    GRAPHIC,DATA_C
  503.  
  504. ; Abbiamo 2 copperlists 
  505.  
  506. COPPERLIST1:
  507.     dc.w    $e0,$0000,$e2,$0000    ; bitplane 1
  508.     dc.w    $e4,$0000,$e6,$0000    ; bitplane 2
  509.     dc.w    $e8,$0000,$ea,$0000    ; bitplane 3
  510.     dc.w    $ec,$0000,$ee,$0000    ; bitplane 4
  511.  
  512. ; Qui viene lasciato dello spazio vuoto per il pezzo di copperlist che genera
  513. ; il plasma. Questo spazio viene riempito dalle routine dell'effetto.
  514.  
  515. PLASMA1:
  516.     dcb.b    alt_plasm*BytesPerRiga,0
  517.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  518.  
  519. ;****************************************************************************
  520.  
  521. COPPERLIST2:
  522.     dc.w    $e0,$0000,$e2,$0000    ; bitplane 1
  523.     dc.w    $e4,$0000,$e6,$0000    ; bitplane 2
  524.     dc.w    $e8,$0000,$ea,$0000    ; bitplane 3
  525.     dc.w    $ec,$0000,$ee,$0000    ; bitplane 4
  526.  
  527. ; Qui viene lasciato dello spazio vuoto per il pezzo di copperlist che genera
  528. ; il plasma. Questo spazio viene riempito dalle routine dell'effetto.
  529.  
  530. PLASMA2:
  531.     dcb.b    alt_plasm*BytesPerRiga,0
  532.  
  533.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  534.  
  535.  
  536. ;****************************************************************************
  537. ; Qui c'e` la tabella di colori che viene scritta nel plasma.
  538. ; Devono esserci abbastanza colori da essere letti qualunque sia l'indirizzo
  539. ; di partenza. In questo esempio l'indirizzo di partenza puo` variare da
  540. ; "Color" (primo colore) fino a "Color+100" (50-esimo colore), perche`
  541. ; 100 e` il massimo offset sontenuto nella "SinTab".
  542. ; Se Alt_plasm=190 vuol dire che ogni blittata legge 190 colori.
  543. ; Quindi in totale devono esserci 240 colori.
  544.  
  545. Color:
  546.     dc.w    $0f00,$0f00,$0e00,$0e00,$0e00,$0d00,$0d00,$0d00
  547.     dc.w    $0c00,$0c00,$0c00,$0b00,$0b00,$0b00,$0a00,$0a00,$0a00
  548.     dc.w    $0900,$0900,$0900,$0800,$0800,$0800,$0700,$0700,$0700
  549.     dc.w    $0600,$0600,$0600,$0500,$0500,$0500,$0400,$0400,$0400
  550.     dc.w    $0300,$0300,$0300,$0200,$0200,$0200,$0100,$0100,$0100
  551.     dcb.w    18,0
  552.     dc.w    $0100,$0100,$0100,$0100,$0200,$0200,$0200,$0200
  553.     dc.w    $0300,$0300,$0300,$0300,$0400,$0400,$0400,$0400
  554.     dc.w    $0500,$0500,$0500,$0500,$0600,$0600,$0600,$0600
  555.     dc.w    $0700,$0700,$0700,$0700,$0800,$0800,$0800,$0800
  556.     dc.w    $0900,$0900,$0900,$0900,$0a00,$0a00,$0a00,$0a00
  557.     dc.w    $0b00,$0b00,$0b00,$0b00,$0c00,$0c00,$0c00,$0c00
  558.     dc.w    $0d00,$0d00,$0d00,$0d00,$0e00,$0e00,$0e00,$0e00
  559.     dc.w    $0f00,$0f00,$0f00,$0f00
  560.  
  561.     dc.w    $0f00,$0f00,$0f00,$0f00,$0e00,$0e00,$0e00,$0e00
  562.     dc.w    $0d00,$0d00,$0d00,$0d00,$0c00,$0c00,$0c00,$0c00
  563.     dc.w    $0b00,$0b00,$0b00,$0b00,$0a00,$0a00,$0a00,$0a00
  564.     dc.w    $0900,$0900,$0900,$0800,$0800,$0800,$0800
  565.     dc.w    $0700,$0700,$0700,$0700,$0600,$0600,$0600,$0600
  566.     dc.w    $0500,$0500,$0500,$0500,$0400,$0400,$0400,$0400
  567.     dc.w    $0300,$0300,$0300,$0300,$0200,$0200,$0200,$0200
  568.     dc.w    $0100,$0100,$0100
  569.     dcb.w    18,0
  570.     dc.w    $0100,$0100,$0100,$0200,$0200,$0200,$0300,$0300,$0300
  571.     dc.w    $0400,$0400,$0400,$0500,$0500,$0500,$0600,$0600,$0600
  572.     dc.w    $0700,$0700,$0700,$0800,$0800,$0900,$0900,$0900
  573.     dc.w    $0a00,$0a00,$0a00,$0b00,$0b00,$0b00,$0c00,$0c00,$0c00
  574.     dc.w    $0d00,$0d00,$0d00,$0e00,$0e00,$0e00,$0f00
  575.  
  576. ;****************************************************************************
  577. ; Buffer contenente una riga dell'immagine (44 bytes) che costituisce i planes
  578. ; L'immagine viene formata copiando questo buffer tante volte quanto e` alto
  579. ; il plasma nel buffer video.
  580. ;****************************************************************************
  581.  
  582. PlasmaLine:
  583.     rept    5
  584.     dc.l    $00ff00ff,$ff00ff00
  585.     endr
  586.     dc.l    $00ff00ff
  587.  
  588. ;****************************************************************************
  589.  
  590.     SECTION    PlasmaBit,BSS_C
  591.  
  592. ; Spazio per i bitplane. Per tutti e 4 i bitplanes si usa un'immagine larga
  593. ; 44 bytes e alta come tutto il plasma
  594.  
  595. BUFFER:
  596.     ds.b    44*Alt_Plasm
  597.  
  598.     end
  599.  
  600.  
  601.  
  602. ;****************************************************************************
  603.  
  604. In questo esempio mostriamo un plasma a 4 bitplane con ondulazione di ampiezza
  605. pari a 56 pixel.
  606. Per raggiungere questo risultato utilizziamo 8 registri colore nel plasma che
  607. vengono cambiati ciclicamente. Questo vuol dire che un registro mantiene un
  608. valore costante per 8*8=64 pixel. Quindi un gruppo di 8 pixel puo` muoversi
  609. di 64-8=56 pixel rimanendo sempre all'interno della fascia in cui il colore e`
  610. costante. Per realizzare ondulazioni cosi` ampie non possiamo usare lo scroll
  611. hardware. Come conseguenza non possiamo usare per tutta l'immagine la stessa
  612. riga ripetuta con il modulo negativo. Abbiamo bisogno di un'immagine completa,
  613. in maniera tale che ogni riga possa essere shiftata indipendentemente dalle
  614. altre. Procediamo in questo modo. Abbiamo un buffer dove viene memorizzata la
  615. riga che costituisce l'immagine. Il contenuto di questo buffer viene copiato
  616. in buffer video, tante volte quante sono le righe che costituiscono il plasma
  617. in modo da costruire l'immagine voluta riga per riga. Ogni riga viene
  618. opportunamente shiftata per realizzare l'ondulazione.
  619. Se dovessimo copiare tutte le righe di tutti i bitplanes dovremmo effettuare
  620. un gran numero di blittate. Per ridurre il numero di blittate usiamo un
  621. trucco. In pratica usiamo la stessa immagine per tutti i bitplanes.
  622. Il buffer di partenza e` fatto nel modo seguente:
  623.  
  624.  dc.l    $00ff00ff,$ff00ff00,$00ff00ff,$ff00ff00 - - -
  625.  
  626. Una volta che lo abbiamo copiato nel buffer video puntiamo il primo bitplane
  627. all'inizio del buffer video, il secondo e il terzo 2 bytes dopo l'inizio
  628. del buffer video e il quarto, 4 bytes dopo l'inizio del buffer video.
  629. Inoltre i bitplanes pari li shiftiamo di 8 pixel.
  630. Riassumendo:
  631. bitplane 1 punta a BUFFER
  632. bitplane 2 punta a BUFFER+2 + shift di 8 pixel a destra
  633. bitplane 3 punta a BUFFER+2
  634. bitplane 4 punta a BUFFER+4 + shift di 8 pixel a destra
  635.  
  636. I planes si sovrappongono generando 8 colori:
  637.  
  638. bitplane 1: dc.l $00ff00ffff00ff0000 ff00ffff00ff0000 ff00ffff00ff0000
  639. bitplane 2: dc.l $--00ffff00ff0000ff 00ffff00ff0000ff 00ffff00ff0000
  640. bitplane 3: dc.l $00ffff00ff0000ff00 ffff00ff0000ff00 ffff00ff0000
  641. bitplane 4: dc.l $--ff00ff0000ff00ff ff00ff0000ff00ff ff00ff0000
  642.                    | | | | | | | | |  | | | | | | | |
  643. colore             --  06  05  09  10   06  05  09  10
  644.              13  11  02  04   13  11  02  04
  645.  
  646. come vedete si genera una ripetizione ciclica di 8 colori, che vengono usati
  647. nella copperlist per generare il plasma.
  648. In questo modo, abbiamo una sola immagine che viene usata per tutti e 4 i
  649. planes, e quindi copiando questa sola immagine copiamo 4 bitplanes con un colpo
  650. velocizzando molto l'effetto.
  651. Veniamo ora ai dettagli tecnici. Ogni bitplane e` largo 40 bytes. Poiche` il
  652. bitplane 4 inizia 4 bytes dopo il bitplane 1, dovra` anche finire 4 bytes dopo.
  653. A causa di questo fatto, il buffer video (che contiene tutti e 4 i bitplanes)
  654. e` largo 44 bytes, quindi i registri BPLxMOD avranno valore 4.
  655. Inoltre, a causa degli shift dei bitplane, l'immagine non e` rettangolare ma
  656. ha i bordi ondulati. Inoltre al bordo sinistro la corrispondenza dei bitplanes
  657. no e` perfetta. Per non mostrare i difetti ai bordi abbiamo ristretto la
  658. finestra video con i registri DIWSTRT e DIWSTOP. Se volete vedere cosa accade
  659. ai bordi allargatela. 
  660. A causa di questo restringimento, le colonne piu` a destra del plasma non si
  661. vedono e quindi e` inutile blittarle (quelle piu` a sinistra anche se non
  662. si vedono vanno comunue blittate perche` la fascia nella quale un colore rimane
  663. costante e` parzialmente visibile).
  664.  
  665.