		************************************
		*       /\/\                       *
		*      /    \                      *
		*     / /\/\ \ O R B_I D           *
		*    / /    \ \   / /              *
		*   / /    __\ \ / /               *
		*   ŻŻ     \ \ŻŻ/ / I S I O N S    *
		*           \ \/ /                 *
		*            \  /                  *
		*             \/                   *
		*     Feel the DEATH inside!       *
		************************************
		* Coded by:                        *
		* The Dark Coder / Morbid Visions  *
		************************************

; Plasma6.s	Plasma RGB a 4-bitplanes e ondulazione
;		tasto sinistro per uscire

	SECTION	DK,code

	incdir	"MV_code:"
	include	MVstartup.s		; Codice di startup: prende il
					; controllo del sistema e chiama
					; la routine START: ponendo
					; A5=$DFF000

		;5432109876543210
DMASET	EQU	%1000001111000000	; copper,bitplane,blitter DMA

Largh_plasm	equ	40		; larghezza del plasma espressa
					; come numero di gruppi di 8 pixel

; numero di bytes occupati nella copperlist da ogni riga del plasma: ogni
; istruzione copper occupa 4 bytes. Ogni riga e` formata da 1 WAIT, Largh_plasm
; CMOVEs per il plasma.
BytesPerRiga	equ	(Largh_plasm+1)*4

Alt_plasm	equ	190		; altezza del plasma espressa
					; come numero di linee

NuovaRigaR	equ	-4		; valore sommato all'indice R nella
					; SinTab tra una riga e l'altra
					; Puo` essere variato ottenendo plasmi
					; diversi, ma DEVE ESSERE SEMPRE PARI!!

NuovoFrameR	equ	16		; valore sottratto all'indice R nella
					; SinTab tra un frame e l'altro
					; Puo` essere variato ottenendo plasmi
					; diversi, ma DEVE ESSERE SEMPRE PARI!!

NuovaRigaG	equ	-2		; come "NuovaRigaR" ma per componente G
NuovoFrameG	equ	2		; come "NuovoFrameR" ma componente G

NuovaRigaB	equ	4		; come "NuovaRigaR" ma per componente B
NuovoFrameB	equ	4		; come "NuovoFrameR" ma componente B

NuovaRigaO	equ	4		; come "NuovaRigaR" ma per oscillazioni
NuovoFrameO	equ	2		; come "NuovoFrameR" ma oscillazioni


START:

;	Puntiamo l'immagine nelle copperlist

	lea	copperlist1,a1	; puntatori cop 1
	lea	copperlist2,a2	; puntatori cop 2
	move.l	#buffer,d0	; dove puntare
	move	d0,6(a1)	; scrive in copperlist 1 
	move	d0,6(a2)	; scrive in copperlist 2
	swap	d0
	move	d0,2(a1)	; scrive in copperlist 1
	move	d0,2(a2)	; scrive in copperlist 2

; bitplane 2 - parte 2 bytes piu` avanti
	move.l	#buffer+2,d0
	move	d0,6+8(a1)
	move	d0,6+8(a2)
	swap	d0
	move	d0,2+8(a1)
	move	d0,2+8(a2)

; bitplane 3 - parte 2 bytes piu` avanti
	move.l	#buffer+2,d0
	move	d0,6+8*2(a1)
	move	d0,6+8*2(a2)
	swap	d0
	move	d0,2+8*2(a1)
	move	d0,2+8*2(a2)

; bitplane 4 - parte 4 bytes piu` avanti
	move.l	#buffer+4,d0
	move	d0,6+8*3(a1)
	move	d0,6+8*3(a2)
	swap	d0
	move	d0,2+8*3(a1)
	move	d0,2+8*3(a2)

	bsr	InitPlasma		; inizializza la copperlist

; Inizializza i registri del blitter
WaitBlit_init:
	Btst	#6,dmaconr(a5)		; aspetta il blitter
	bne.s	WaitBlit_init

	moveq	#-1,d0
	move.l	d0,bltafwm(a5)

	move	#$8000,bltcon1(a5)	; BLTCON1 - shift 8 pixel canale B
					; (usato per il plasma)

mod_A	set	0			; modulo canale A
mod_D	set	BytesPerRiga-2		; modulo canale D: va a riga seguente
	move.l	#mod_A<<16+mod_D,bltamod(a5)	; carica i registri modulo

; moduli canali B e C = 0
	moveq	#0,d0
	move.l	d0,bltcmod(a5)		; scrive BLTBMOD e BLTCMOD

; Inizializza altri registri hardware
; D0=0
	move.l	d0,$180(a5)		; COLOR00 e COLOR01 - nero

	move	#$30b8,diwstrt(a5)	; DiwStrt - usiamo una finestra piu`
					; piccola dello schermo
	move	#$ee90,diwstop(a5)	; DiwStop
	move	#$0038,ddfstrt(a5)	; DDFStrt - vengono fetchati 40 bytes
	move	#$00d0,ddfstop(a5)	; DDFStop
	move	#$0080,bplcon1(a5)	; BPLCON1 - i planes pari sono shiftati
					; di 8 pixel a destra
	move	d0,bplcon2(a5)		; BPLCON1/2
	move	#4,bpl1mod(a5)		; BPL1MOD = 4 - fetcha 40 bytes su 44
	move	#4,bpl2mod(a5)		; BPL2MOD = 4 - fetcha 40 bytes su 44

	move	#$4200,bplcon0(a5)	; BPLCON0 - 1 bitplane attivo
	move.l	#COPPERLIST1,cop1lc(a5)	; attiva copperlist
	move	d0,copjmp1(a5)
	move	#dmaset,dmacon(a5)	; DMACON - abilita bitplane, copper


mouse2:

	move.l	#$1ff00,d1
	move.l	#$13000,d2
.wait
	move.l	vposr(a5),d0
	and.l	d1,d0
	cmp.l	d2,d0
	bne.s	.wait

	bsr	ScambiaClists	; scambia le copperlist

	bsr	DoOriz		; effetto oscillazione orizzontale
	bsr	DoPlasma

	btst	#6,$bfe001	; mouse premuto?
	bne.s	mouse2

	rts

;****************************************************************************
; Questa routine crea i bitplanes realizzando l'effetto di oscillazione.
; Il buffer all'indirizzo "PlasmaLine" contiene una riga della figura.
; Questo buffer viene copiato nel buffer video tante volte quanto e` alto
; il plasma, formando cosi` tutta la figura. Ogni riga viene shiftata verso
; destra di un valore variabile, creando cosi` l'ondulazione.

DoOriz:
	lea	OrizTab(pc),a0		; indirizzo tabella oscillazioni
	lea	BUFFER,a1		; indirizzo buffer video (destinazione)
	lea	PlasmaLine,a3		; indirizzo buffer che contiene la
					; linea (sorgente)

	move	#1*64+19,d2		; dimensione blittata:
					; larghezza 40 bytes
					; altezza 1 linea

; legge e modifica indice
	move	IndiceO(pc),d4		; legge l'indice di partenza del
					; frame precedente
	sub	#NuovoFrameO,d4		; modifica l'indice nella tabella
					; dal frame precedente
	and	#$00FF,d4		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 256 bytes)
	move	d4,IndiceO		; memorizza l'indice di partenza per
					; il prossimo frame

	move	#Alt_plasm-1,d3		; loop per ogni riga
OrizLoop:
	move.b	0(a0,d4.w),d0		; leggi valore dell'oscillazione

	moveq	#0,d1			; pulisce D1
	move.b	d0,d1			; copia valore oscillazione
	and	#$000f,d0		; lascia solo i 4 bit bassi
	ror	#4,d0			; li sposta nelle prime posizioni
	or	#$09f0,d0		; valore da scrivere in BLTCON0

	asr	#4,d1			
	add	d1,d1			; calcola numero di bytes
	lea	(a1,d1.w),a2		; indirizzo sorgente

.WaitBlit
	btst	#6,dmaconr(a5)		; aspetta il blitter
	bne.s	.WaitBlit

	move	d0,bltcon0(a5)		; BLTCON0 - copia da A a D con shift
	move.l	a3,bltapt(a5)		; BLTAPT - indirizzo sorgente
	move.l	a2,bltdpt(a5)		; BLTDPT - indirizzo destinazione
	move	d2,bltsize(a5)		; BLTSIZE

	lea	44(a1),a1		; punta alla prossima riga 
					; del buffer video

; modifica indice per prossima riga
	add	#NuovaRigaO,d4		; modifica l'indice nella tabella
					; per la prossima riga

	and	#$00FF,d4		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 256 bytes)

	dbra	d3,OrizLoop

	rts

;****************************************************************************
; Questa routine realizza il "double buffer" tra le copperlist.
; In pratica prende la clist dove si e` disegnato, e la visualizza copiandone
; l'indirizzo in COP1LC. Scambia le variabili, in modo tale che nel frame
; che segue si disegna sull'altra copper list
ScambiaClists:
	move.l	draw_clist(pc),d0	; indirizzo clist su cui si e` scritto
	move.l	view_clist(pc),draw_clist	; scambia le clists
	move.l	d0,view_clist

	move.l	d0,cop1lc(a5)		; copia l'indirizzo della clist
					; in COP1LC in maniera che venga
					; visualizzata nel prossimo frame

	rts


;****************************************************************************
; Questa routine inizializza la copperlist che genera il plasma. Sistema le
; istruzioni WAIT e le prima meta` delle COPPERMOVE.

InitPlasma:
	lea	Plasma1,a0	; indirizzo plasma 1
	lea	Plasma2,a1	; indirizzo plasma 2
	move.l	#$303FFFFE,d0	; carica la prima istruzione wait in D0.
				; aspetta la riga $30 e la posizione
				; orizzontale $3F

	move	#Alt_plasm-1,d3		; loop per ogni riga
InitLoop1:

	move.l	d0,(a0)+		; scrive la WAIT - (clist 1)
	move.l	d0,(a1)+		; scrive la WAIT - (clist 2)
	add.l	#$01000000,d0		; modifica la WAIT per aspettare
					; la riga seguente

	moveq	#Largh_plasm/8-1,d2	; ogni iterazione scrive 8 copper moves

InitLoop2:

; copperlist 1
	move	#color00+10*2,(a0)+	; colore 10
	addq.l	#2,a0			; spazio per la seconda parte
					; della CMOVE

	move	#color00+13*2,(a0)+	; colore 13
	addq.l	#2,a0
	
	move	#color00+6*2,(a0)+	; colore 6
	addq.l	#2,a0

	move	#color00+11*2,(a0)+	; colore 11
	addq.l	#2,a0

	move	#color00+5*2,(a0)+	; colore 5
	addq.l	#2,a0

	move	#color00+2*2,(a0)+	; colore 2
	addq.l	#2,a0

	move	#color00+9*2,(a0)+	; colore 9
	addq.l	#2,a0

	move	#color00+4*2,(a0)+	; colore 4
	addq.l	#2,a0

; copperlist 2
	move	#color00+10*2,(a1)+	; colore 10
	addq.l	#2,a1			; spazio per la seconda parte
					; della CMOVE

	move	#color00+13*2,(a1)+	; colore 13
	addq.l	#2,a1
	
	move	#color00+6*2,(a1)+	; colore 6
	addq.l	#2,a1

	move	#color00+11*2,(a1)+	; colore 11
	addq.l	#2,a1

	move	#color00+5*2,(a1)+	; colore 5
	addq.l	#2,a1

	move	#color00+2*2,(a1)+	; colore 2
	addq.l	#2,a1

	move	#color00+9*2,(a1)+	; colore 9
	addq.l	#2,a1

	move	#color00+4*2,(a1)+	; colore 4
	addq.l	#2,a1

	dbra	d2,InitLoop2

	dbra	d3,InitLoop1
	
	rts


;****************************************************************************
; Questa routine realizza il plasma. Effettua un loop di blittate, ciascuna
; delle quali scrive una "colonna" del plasma, cioe` scrive i colori nelle
; COPPERMOVES messe in colonna.
; I colori scritti in ogni colonna sono letti da una tabella, a partire da
; un indirizzo che varia tra una colonna e l'altra in base a degli offset
; letti da un'altra tabella. Inoltre tra un frame e l'altro gli offset
; variano, realizzando l'effetto di movimento.

DoPlasma:

	lea	ColorTab,a0		; indirizzo colori
	lea	SinTab,a6		; indirizzo tabella offsets
	move.l	draw_clist(pc),a1	; indirizzo copperlist dove scrivere
	lea	38(a1),a1		; indirizzo prima word della prima
					; colonna del plasma

; legge e modifica indice componente R
	move	IndiceR(pc),d4		; legge l'indice di partenza del
					; frame precedente
	sub	#NuovoFrameR,d4		; modifica l'indice nella tabella
					; dal frame precedente
	and	#$00FF,d4		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)
	move	d4,IndiceR		; memorizza l'indice di partenza per
					; il prossimo frame

; legge e modifica indice componente G
	move	IndiceG(pc),d5		; legge l'indice di partenza del
					; frame precedente
	sub	#NuovoFrameG,d5		; modifica l'indice nella tabella
					; dal frame precedente
	and	#$00FF,d5		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)
	move	d5,IndiceG		; memorizza l'indice di partenza per
					; il prossimo frame

; legge e modifica indice componente B
	move	IndiceB(pc),d6		; legge l'indice di partenza del
					; frame precedente
	sub	#NuovoFrameB,d6		; modifica l'indice nella tabella
					; dal frame precedente
	and	#$00FF,d6		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)
	move	d6,IndiceB		; memorizza l'indice di partenza per
					; il prossimo frame

	move	#Alt_plasm<<6+1,d3	; dimensione blittata
					; largh. 1 word, alta tutto il plasma

	moveq	#Largh_plasm-6-1,d2	; il loop NON viene ripetuto per tutta
					; la larghezza. Le colonne piu` a
					; destra non sono visibili,
					; quindi e` inutile blittarle.

; inizializza i registri blitter per il plasma
.WaitBlit
	btst	#6,dmaconr(a5)		; aspetta il blitter
	bne.s	.WaitBlit

	move	#$4FFE,bltcon0(a5)	; BLTCON0 - D=A+B+C, shift A = 4 pixel

PlasmaLoop:				; inizio loop blittate

; calcola indirizzo di partenza componente R
	move	(a6,d4.w),d1		; legge offset dalla tabella

	lea	(a0,d1.w),a2		; indirizzo di partenza = ind. colori
					; piu` offset

; calcola indirizzo di partenza componente G
	move	(a6,d5.w),d1		; legge offset dalla tabella

	lea	(a0,d1.w),a3		; indirizzo di partenza = ind. colori
					; piu` offset

; calcola indirizzo di partenza componente B
	move	(a6,d6.w),d1		; legge offset dalla tabella

	lea	(a0,d1.w),a4		; indirizzo di partenza = ind. colori
					; piu` offset

.WaitBlit
	btst	#6,dmaconr(a5)		; aspetta il blitter
	bne.s	.WaitBlit

	move.l	a2,bltcpt(a5)		; BLTCPT - indirizzo sorgente R
	move.l	a3,bltapt(a5)		; BLTAPT - indirizzo sorgente G
	move.l	a4,bltbpt(a5)		; BLTBPT - indirizzo sorgente B
	move.l	a1,bltdpt(a5)		; BLTDPT - indirizzo destinazione
	move	d3,bltsize(a5)		; BLTSIZE

	addq.l	#4,a1			; punta a prossima colonna di 
					; CMOVEs nella copper list

; modifica indice componente R per prossima riga
	add	#NuovaRigaR,d4		; modifica l'indice nella tabella
					; per la prossima riga

	and	#$00FF,d4		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)

; modifica indice componente G per prossima riga
	add	#NuovaRigaG,d5		; modifica l'indice nella tabella
					; per la prossima riga

	and	#$00FF,d5		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)

; modifica indice componente B per prossima riga
	add	#NuovaRigaB,d6		; modifica l'indice nella tabella
					; per la prossima riga

	and	#$00FF,d6		; tiene l'indice nell'intervallo
					; 0 - 255 (offset in una tabella di
					; 128 words)

	dbra	d2,PlasmaLoop

	rts


; Queste 2 variabili contengono gli indirizzi delle 2 copperlist
view_clist	dc.l	COPPERLIST1	; indirizzo clist visualizzata
draw_clist	dc.l	COPPERLIST2	; indirizzo clist dove disegnare

; Questa variabile contiene il valore dell'indice nella tabella delle
; oscillazioni
IndiceO	dc.w	0

; Questa tabella contiene i valori delle oscillazioni
OrizTab:
	DC.B	$1C,$1D,$1E,$1E,$1F,$20,$20,$21,$22,$22,$23,$24,$24,$25,$25,$26
	DC.B	$27,$27,$28,$28,$29,$2A,$2A,$2B,$2B,$2C,$2C,$2D,$2D,$2E,$2E,$2F
	DC.B	$2F,$30,$30,$31,$31,$31,$32,$32,$33,$33,$33,$34,$34,$34,$35,$35
	DC.B	$35,$35,$36,$36,$36,$36,$36,$36,$37,$37,$37,$37,$37,$37,$37,$37
	DC.B	$37,$37,$37,$37,$37,$37,$37,$37,$36,$36,$36,$36,$36,$36,$35,$35
	DC.B	$35,$35,$34,$34,$34,$33,$33,$33,$32,$32,$31,$31,$31,$30,$30,$2F
	DC.B	$2F,$2E,$2E,$2D,$2D,$2C,$2C,$2B,$2B,$2A,$2A,$29,$28,$28,$27,$27
	DC.B	$26,$25,$25,$24,$24,$23,$22,$22,$21,$20,$20,$1F,$1E,$1E,$1D,$1C
	DC.B	$1C,$1B,$1A,$1A,$19,$18,$18,$17,$16,$16,$15,$14,$14,$13,$13,$12
	DC.B	$11,$11,$10,$10,$0F,$0E,$0E,$0D,$0D,$0C,$0C,$0B,$0B,$0A,$0A,$09
	DC.B	$09,$08,$08,$07,$07,$07,$06,$06,$05,$05,$05,$04,$04,$04,$03,$03
	DC.B	$03,$03,$02,$02,$02,$02,$02,$02,$01,$01,$01,$01,$01,$01,$01,$01
	DC.B	$01,$01,$01,$01,$01,$01,$01,$01,$02,$02,$02,$02,$02,$02,$03,$03
	DC.B	$03,$03,$04,$04,$04,$05,$05,$05,$06,$06,$07,$07,$07,$08,$08,$09
	DC.B	$09,$0A,$0A,$0B,$0B,$0C,$0C,$0D,$0D,$0E,$0E,$0F,$10,$10,$11,$11
	DC.B	$12,$13,$13,$14,$14,$15,$16,$16,$17,$18,$18,$19,$1A,$1A,$1B,$1C

; Queste variabili contengono i valori degli indici per la prima colonna
IndiceR	dc.w	0
IndiceG	dc.w	0
IndiceB	dc.w	0

; Questa tabella contiene gli offset per l'indirizzo di partenza nella
; tabella dei colori
SinTab:
	DC.W	$0034,$0036,$0038,$003A,$003C,$0040,$0042,$0044,$0046,$0048
	DC.W	$004A,$004C,$004E,$0050,$0052,$0054,$0056,$0058,$005A,$005A
	DC.W	$005C,$005E,$005E,$0060,$0060,$0062,$0062,$0062,$0064,$0064
	DC.W	$0064,$0064,$0064,$0064,$0064,$0064,$0062,$0062,$0062,$0060
	DC.W	$0060,$005E,$005E,$005C,$005A,$005A,$0058,$0056,$0054,$0052
	DC.W	$0050,$004E,$004C,$004A,$0048,$0046,$0044,$0042,$0040,$003C
	DC.W	$003A,$0038,$0036,$0034,$0030,$002E,$002C,$002A,$0028,$0024
	DC.W	$0022,$0020,$001E,$001C,$001A,$0018,$0016,$0014,$0012,$0010
	DC.W	$000E,$000C,$000A,$000A,$0008,$0006,$0006,$0004,$0004,$0002
	DC.W	$0002,$0002,$0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	DC.W	$0002,$0002,$0002,$0004,$0004,$0006,$0006,$0008,$000A,$000A
	DC.W	$000C,$000E,$0010,$0012,$0014,$0016,$0018,$001A,$001C,$001E
	DC.W	$0020,$0022,$0024,$0028,$002A,$002C,$002E,$0030

EndSinTab:

;****************************************************************************

	SECTION	GRAPHIC,DATA_C

; Abbiamo 2 copperlists 

COPPERLIST1:
	cmove	0,bplpt			; primo	 bitplane
	cmove	0,bplpt+2		; word bassa bpl1pt
	cmove	0,bplpt+4		; secondo bitplane
	cmove	0,bplpt+6		; word bassa bpl2pt
	cmove	0,bplpt+8		; bpl3pt
	cmove	0,bplpt+10
	cmove	0,bplpt+12		; bpl4pt
	cmove	0,bplpt+14

; Qui viene lasciato dello spazio vuoto per il pezzo di copperlist che genera
; il plasma. Questo spazio viene riempito dalle routine dell'effetto.
PLASMA1:
	dcb.b	alt_plasm*BytesPerRiga,0
	cstop

COPPERLIST2:
	cmove	0,bplpt			; bpl1pt
	cmove	0,bplpt+2
	cmove	0,bplpt+4		; bpl2pt
	cmove	0,bplpt+6
	cmove	0,bplpt+8		; bpl3pt
	cmove	0,bplpt+10
	cmove	0,bplpt+12		; bpl4pt
	cmove	0,bplpt+14

; Qui viene lasciato dello spazio vuoto per il pezzo di copperlist che genera
; il plasma. Questo spazio viene riempito dalle routine dell'effetto.
PLASMA2:
	dcb.b	alt_plasm*BytesPerRiga,0
	cstop


;****************************************************************************
; Qui c'e` la tabella di colori che viene scritta nel plasma.
; Devono esserci abbastanza colori da essere letti qualunque sia l'indirizzo
; di partenza. In questo esempio l'indirizzo di partenza puo` variare da
; "ColorTab" (primo colore) fino a "ColorTab+100" (50-esimo colore), perche`
; 100 e` il massimo offset sontenuto nella "SinTab".
; Se Alt_plasm=190 vuol dire che ogni blittata legge 190 colori.
; Quindi in totale devono esserci 240 colori.

ColorTab:
	dc.w	$0f00,$0f00,$0e00,$0e00,$0e00,$0d00,$0d00,$0d00
	dc.w	$0c00,$0c00,$0c00,$0b00,$0b00,$0b00,$0a00,$0a00,$0a00
	dc.w	$0900,$0900,$0900,$0800,$0800,$0800,$0700,$0700,$0700
	dc.w	$0600,$0600,$0600,$0500,$0500,$0500,$0400,$0400,$0400
	dc.w	$0300,$0300,$0300,$0200,$0200,$0200,$0100,$0100,$0100
	dcb.w	18,0
	dc.w	$0100,$0100,$0100,$0100,$0200,$0200,$0200,$0200
	dc.w	$0300,$0300,$0300,$0300,$0400,$0400,$0400,$0400
	dc.w	$0500,$0500,$0500,$0500,$0600,$0600,$0600,$0600
	dc.w	$0700,$0700,$0700,$0700,$0800,$0800,$0800,$0800
	dc.w	$0900,$0900,$0900,$0900,$0a00,$0a00,$0a00,$0a00
	dc.w	$0b00,$0b00,$0b00,$0b00,$0c00,$0c00,$0c00,$0c00
	dc.w	$0d00,$0d00,$0d00,$0d00,$0e00,$0e00,$0e00,$0e00
	dc.w	$0f00,$0f00,$0f00,$0f00

	dc.w	$0f00,$0f00,$0f00,$0f00,$0e00,$0e00,$0e00,$0e00
	dc.w	$0d00,$0d00,$0d00,$0d00,$0c00,$0c00,$0c00,$0c00
	dc.w	$0b00,$0b00,$0b00,$0b00,$0a00,$0a00,$0a00,$0a00
	dc.w	$0900,$0900,$0900,$0800,$0800,$0800,$0800
	dc.w	$0700,$0700,$0700,$0700,$0600,$0600,$0600,$0600
	dc.w	$0500,$0500,$0500,$0500,$0400,$0400,$0400,$0400
	dc.w	$0300,$0300,$0300,$0300,$0200,$0200,$0200,$0200
	dc.w	$0100,$0100,$0100
	dcb.w	18,0
	dc.w	$0100,$0100,$0100,$0200,$0200,$0200,$0300,$0300,$0300
	dc.w	$0400,$0400,$0400,$0500,$0500,$0500,$0600,$0600,$0600
	dc.w	$0700,$0700,$0700,$0800,$0800,$0900,$0900,$0900
	dc.w	$0a00,$0a00,$0a00,$0b00,$0b00,$0b00,$0c00,$0c00,$0c00
	dc.w	$0d00,$0d00,$0d00,$0e00,$0e00,$0e00,$0f00

; Buffer contenente una riga dell'immagine (44 bytes) che costituisce i planes
; L'immagine viene formata copiando questo buffer tante volte quanto e` alto
; il plasma nel buffer video.
PlasmaLine:
	rept	5
	dc.l	$00ff00ff,$ff00ff00
	endr
	dc.l	$00ff00ff

	SECTION	PlasmaBit,BSS_C

; Spazio per i bitplane. Per tutti e 4 i bitplanes si usa un'immagine larga
; 44 bytes e alta come tutto il plasma
BUFFER:
	ds.b	44*Alt_Plasm

	end



;****************************************************************************

In questo esempio mostriamo un plasma a 4 bitplane con ondulazione di ampiezza
pari a 56 pixel.
Per raggiungere questo risultato utilizziamo 8 registri colore nel plasma che
vengono cambiati ciclicamente. Questo vuol dire che un registro mantiene un
valore costante per 8*8=64 pixel. Quindi un gruppo di 8 pixel puo` muoversi
di 64-8=56 pixel rimanendo sempre all'interno della fascia in cui il colore e`
costante. Per realizzare ondulazioni cosi` ampie non possiamo usare lo scroll
hardware. Come conseguenza non possiamo usare per tutta l'immagine la stessa
riga ripetuta con il modulo negativo. Abbiamo bisogno di un'immagine completa,
in maniera tale che ogni riga possa essere shiftata indipendentemente dalle
altre. Procediamo in questo modo. Abbiamo un buffer dove viene memorizzata la
riga che costituisce l'immagine. Il contenuto di questo buffer viene copiato
in buffer video, tante volte quante sono le righe che costituiscono il plasma
in modo da costruire l'immagine voluta riga per riga. Ogni riga viene
opportunamente shiftata per realizzare l'ondulazione.
Se dovessimo copiare tutte le righe di tutti i bitplanes dovremmo effettuare
un gran numero di blittate. Per ridurre il numero di blittate usiamo un
trucco. In pratica usiamo la stessa immagine per tutti i bitplanes.
Il buffer di partenza e` fatto nel modo seguente:

 dc.l	$00ff00ff,$ff00ff00,$00ff00ff,$ff00ff00 - - -

Una volta che lo abbiamo copiato nel buffer video puntiamo il primo bitplane
all'inizio del buffer video, il secondo e il terzo 2 bytes dopo l'inizio
del buffer video e il quarto, 4 bytes dopo l'inizio del buffer video.
Inoltre i bitplanes pari li shiftiamo di 8 pixel.
Riassumendo:
bitplane 1 punta a BUFFER
bitplane 2 punta a BUFFER+2 + shift di 8 pixel a destra
bitplane 3 punta a BUFFER+2
bitplane 4 punta a BUFFER+4 + shift di 8 pixel a destra

I planes si sovrappongono generando 8 colori:

bitplane 1: dc.l $00ff00ffff00ff0000 ff00ffff00ff0000 ff00ffff00ff0000
bitplane 2: dc.l $--00ffff00ff0000ff 00ffff00ff0000ff 00ffff00ff0000
bitplane 3: dc.l $00ffff00ff0000ff00 ffff00ff0000ff00 ffff00ff0000
bitplane 4: dc.l $--ff00ff0000ff00ff ff00ff0000ff00ff ff00ff0000
                   | | | | | | | | |  | | | | | | | |
colore             --  06  05  09  10   06  05  09  10
		     13  11  02  04   13  11  02  04

come vedete si genera una ripetizione ciclica di 8 colori, che vengono usati
nella copperlist per generare il plasma.
In questo modo, abbiamo una sola immagine che viene usata per tutti e 4 i
planes, e quindi copiando questa sola immagine copiamo 4 bitplanes con un colpo
velocizzando molto l'effetto.
Veniamo ora ai dettagli tecnici. Ogni bitplane e` largo 40 bytes. Poiche` il
bitplane 4 inizia 4 bytes dopo il bitplane 1, dovra` anche finire 4 bytes dopo.
A causa di questo fatto, il buffer video (che contiene tutti e 4 i bitplanes)
e` largo 44 bytes, quindi i registri BPLxMOD avranno valore 4.
Inoltre, a causa degli shift dei bitplane, l'immagine non e` rettangolare ma
ha i bordi ondulati. Inoltre al bordo sinistro la corrispondenza dei bitplanes
no e` perfetta. Per non mostrare i difetti ai bordi abbiamo ristretto la
finestra video con i registri DIWSTRT e DIWSTOP. Se volete vedere cosa accade
ai bordi allargatela. 
A causa di questo restringimento, le colonne piu` a destra del plasma non si
vedono e quindi e` inutile blittarle (quelle piu` a sinistra anche se non
si vedono vanno comunue blittate perche` la fascia nella quale un colore rimane
costante e` parzialmente visibile).

