	; ##########################
	; # PLASMA  T.Landspurg 91 #
	; ##########################
	; A assembler sous devpac
	opt c+,o+,ow-

NB_COL_COP = 53		; Nombre de changements de couleur par ligne
NB_LIG_COP = 200		; Nombre de lignes de la plasma

NB_BYTE_PLASMA = (NB_COL_COP+1+1)*4  	; Taille d'un ligne de la copperlist
taillecop = 20+(NB_COL_COP+2)*4*NB_LIG_COP; Taille de la copperlist
NB_DEG = 15*3		; Utilise pour la creation de degrade
NB_REP = 10		; idem
CUSTOM = $dff000	; Registres hardware

	incdir	"include:"
	include	exec/exec_lib.i
	include	exec/types.i
	include	graphics/graphics_lib.i
	include	intuition/intuition_lib.i
	include	graphics/gfxbase.i
	include	hardware/custom.i
	include libraries/dos.i

	XDEF.L	_dark
	XREF	_duree,_my_rand

;	section	plasma,CODE_C
	; DEBUT DU PROGRAMME
_dark:
	movem.l	d0-d7/a0-a6,-(a7)


	lea	b(pc),a4	; a4 POINTERA TOUJOURS SUR LA BASE!
	lea	graphname(pc),a1; Ouverture de la graphics
	clr.l	d0
	CALLEXEC	OpenLibrary
	move.l	d0,_GfxBase-b(a4)
	lea	intuiname(pc),a1
	clr.l	d0
	CALLEXEC	OpenLibrary
	move.l	d0,_IntuitionBase-b(a4)

	lea	CUSTOM,a5	; Base des coprocesseurs
;	move.w	vposr(a5),seed
	bsr	initcop		; initialisation de la copper  list
	bsr	init_col	; initialisation des couleurs de
				; la plasma
	lea	CUSTOM,a5	; Base des coprocesseurs
;	move.w	intenar(a5),save_intena-b(a4)
;	or.w	#$c000,save_intena-b(a4)
;	move.w	#$7fff,intena(a5)
;	move.w	#$0020,dmacon(a5); controle DMA
;	move.w	#$8400,dmacon(a5) ; Bltpri
;	move.b	#%10000111,$bfd100 ; ARRET DU DRIVE (BEURK!)
waitbout:			; BOUCLE PRINCIPALE
	sub.w	#1,tempo
	tst.w	tempo
	bne.s	pas_end_temp
	bsr	initcop
pas_end_temp:

sync:
	btst	#0,vposr+1(a5)
	bne.s	sync
sync1:
	cmp.b	#30,vhposr(a5)	; Syncronisation
	bne.s	sync1
	CALLGRAF	OwnBlitter
	movem.l	p_coplist(pc),d0/d1
	exg	d0,d1
	movem.l	d0/d1,p_coplist-b(a4)
	move.l	d0,cop1lc(a5)
	clr.w	copjmp1(a5)
	CALLGRAF	WaitBlit
	bsr	move_plasma
	CALLGRAF	DisownBlitter
	btst	#6,$bfe001	; Test le bouton de la souris
	beq.s	out

	moveq	#0,d0
	moveq	#0,d1
	movem.l	d1-d7/a0-a6,-(a7)
	CALLEXEC	SetSignal
	and.l	#SIGBREAKF_CTRL_C,d0
	movem.l	(a7)+,d1-d7/a0-a6
	tst.l	d0
	beq	waitbout
out:
	lea	CUSTOM,a5	; a5 pointera sur les registres hardware
;	move.w	save_intena-b(a4),intena(a5)	; interuption
	move.l	_GfxBase(pc),a0 ; On restore l'ancienne copperlist
	move.l	$32(a0),d0
	move.l	$26(a0),cop1lc(a5)

;	CALLINT	RethinkDisplay

	move.l	_GfxBase(pc),a1 ; On referme la libraire
	CALLEXEC CloseLibrary
	move.l	_IntuitionBase(pc),a1 ; On referme la libraire
	CALLEXEC CloseLibrary
;	move.w	#$0400,dmaconr(a5)
;	move.w	#$8020,dmaconr(a5)
	movem.l	(a7)+,d0-d7/a0-a6
	moveq	#0,d0
	rts
save_intena:dc.w	0
waitblit:macro
waitblit\@:
	btst	#14,dmaconr(a5)
	bne	waitblit\@
	endm
graphname:
	GRAFNAME
intuiname:
	INTNAME
	even
_IntuitionBase:dc.l	0
_GfxBase:
	dc.l	0


	; INITIALISATION DE LA COPPER LIST
initcop:
;	move.l	_duree,d0
;	lsl.w	#3,d0
;	move.w	d0,tempo

;	move.w	#5,-(a7)
;	bsr	_my_rand
;	lea	2(a7),a7
;	sub.w	#2,d0
;	tst.w	d0
;	move.w	d0,step_sinusx1
;	move.w	#10,d0

;	move.w	#5,d0
;	bsr	random
;	sub.w	#2,d0
;	tst.w	d0
;;	move.w	d0,speed_sinusx1

;	move.w	#5,d0
;	bsr	random
;	sub.w	#2,d0
;	tst.w	d0
;	move.w	d0,step_sinusy1
;	move.w	#10,d0

;	move.w	#5,d0
;	bsr	random
;	sub.w	#2,d0
;	tst.w	d0
;	move.w	d0,speed_sinusy1

	lea	coplist,a0
	move.w	#NB_LIG_COP-1,d7
	move.l	#$01000000,(a0)+	; 0 bitplane
	move.w	#$4031,d0	; Premiere ligne de l'ecran
next_lig_plasma:		; pour une ligne de plasma
	move.w	d0,(a0)+	; le wait
	move.w	#$fffe,(a0)+
	move.l	#$01020000,(a0)+ ; decalage horizontal
	add.w	#$0100,d0	; prochaine ligne
	moveq.w	#NB_COL_COP-1,d6; on met le changmenents
	move.w	d7,d1		; de couleur pour une ligne
next_col_plasma:		; donnee
	move.l	#$1800000,(a0)+
	dbf	d6,next_col_plasma
	dbf	d7,next_lig_plasma
	move.l	#$01000000,(a0)+	; 0 bitplane
	move.l	#$fffffffe,(a0)+	; fin de la copperlist

	lea	coplist,a0
	lea	coplist+taillecop,a1
	move.w	#taillecop/4-1,d7
next_recopie:
	move.l	(a0)+,(a1)+
	dbf	d7,next_recopie

	rts
	; MOVEMENT DES PLASMAS
move_plasma:	; C'est le coeur du programme
	move.l	p_coplist(pc),a0; Pointeur sur la copperlist
	lea	4(a0),a0
	lea	tabsin(pc),a2	; Tableau de sinus
	move.w	#$ff,d5		; masque=taille de la table de sinus
		; D'abord on va creer les decalages sur y
	move.w	p_sinusy1(pc),d1	; premiere wave sur y
	add.w	speed_sinusy1(pc),d1
	move.w	d1,p_sinusy1-b(a4)

	move.w	p_sinusy2(pc),d2 ; premiere wave sur y
	add.w	speed_sinusy2(pc),d2
	move.w	d2,p_sinusy2-b(a4)

	move.w	#NB_LIG_COP-1,d7 ; Nombre de lignes
next_lig_plasma2
	and.w	d5,d1
	and.w	d5,d2
	move.b	(a2,d1.w),d3	; decalage sinus
	ext.w	d3
	move.b	(a2,d2.w),d4	; decalage sinus
	ext.w	d4
	add.w	d4,d3		; On ajoute les deux sinus

	asr.w	#4,d3		; Le decalage sur y de faible amplitude
	add.w	#$20,d3
	bset	#0,d3
	move.b	d3,1(a0)	; on le met dans la copperlist
	add.w	step_sinusy1(pc),d1
	add.w	step_sinusy2(pc),d2
	lea	NB_BYTE_PLASMA(a0),a0
	dbf	d7,next_lig_plasma2
		; Maintenant les decalages sur X
	waitblit	; attent que le blitter soit libre
	move.w	#$09f0,bltcon0(a5) ; Mode=recopie
	clr.w	bltcon1(a5)	; mode suite
	move.l	#-1,bltafwm(a5)	; Masque a -1
	move.w	#NB_BYTE_PLASMA-2,bltdmod(a5) ; Modulo
	clr.w	bltamod(a5)	; En source pas de modulo
	move.w	#((NB_LIG_COP)<<6+1),d6 ; Taille=une colonne

	move.l	p_coplist(pc),a0
	lea	4(a0),a0
	lea	tab_col_plasma+128,a1

	move.w	p_sinusx1(pc),d1; premiere wave sur x
	add.w	speed_sinusx1(pc),d1
	move.w	d1,p_sinusx1-b(a4)
	move.w	p_sinusx2(pc),d2; deuxieme wave sur x
	add.w	speed_sinusx2(pc),d2
	move.w	d2,p_sinusx2-b(a4)

	lea	6+4(a0),a0	; a0 pointe sur le debut de couleurs
	moveq.w	#NB_COL_COP-2,d7
	move.w	step_sinusx1(pc),d0
next_col_plasma2
	add.w	d0,d1
	add.w	step_sinusx2(pc),d2
	and.w	d5,d2
	and.w	d5,d1

	move.b	(a2,d1.w),d3	; decalage sinus
	ext.w	d3
	move.b	(a2,d2.w),d4	; decalage sinus
	ext.w	d4
	add.w	d4,d3		; On ajoute les deux sinus

	asr.w	#1,d3		; d3 contient l'offset dans la table de couleur
	lea	(a1,d3.w),a3
	waitblit
	move.l	a3,bltapt(a5)	; Source=table de couleur
	move.l	a0,bltdpt(a5)	; Destination=copperlist
	move.w	d6,bltsize(a5) ; Taille=une colonne
	lea	4(a0),a0
	dbf	d7,next_col_plasma2
	rts
	; Variables qui contiennent les donnees pour
	; la plasma
p_sinusx1:dc.w	0
p_sinusx2:dc.w	0
p_sinusy1:dc.w	0
p_sinusy2:dc.w	0
step_sinusx1:dc.w	-3
speed_sinusx1:dc.w	2
step_sinusx2:dc.w	-4
speed_sinusx2:dc.w	1
step_sinusy1:dc.w	2
speed_sinusy1:dc.w	1
step_sinusy2:dc.w	-3
speed_sinusy2:dc.w	-5

	; Cree le degrade de couleur pour la plasma
init_col:
	lea	tab_col_plasma,a0	; Table du degrade de couleurs
	move.w	#$fff,d0
	move.w	#-$110,d1		; on modifie la composante vert
	bsr	cree_one_deg		; On cree trois degrades
	move.w	#$100,d1		; idem avec la composante rouge
	bsr	cree_one_deg
	move.w	#-$1,d1			; et la composante jaune
	bsr	cree_one_deg
	rts
cree_one_deg:	; Cree un degradee en modifiant une composante de la couleur
	move.w	#NB_DEG/3-1,d7	; Nombre d'iterations
l2:	move.w	#NB_REP-1,d6	; Nombdre de fois ou l'on garde
l1:	move.w	d0,(a0)+	; la meme couleur
	dbf	d6,l1		;
	add.w	d1,d0		; Prochaine couleur
	dbf	d7,l2		; Tant qu'il y a des couleurs
	rts
random:
;	move.w	seed(pc),d1
;	mulu	#25173,d1
;	add.w	#13849,d1
;	move.w	d1,seed-b(a4)
;	divu	d0,d1
;	swap	d1
;	move.w	d1,d0
;	rts

b:
p_coplist:	dc.l	coplist
p_coplist_old:	dc.l 	coplist+taillecop
dir:		dc.w	-1
seed:		dc.w	$DEAD
tempo:		dc.w	0
 ; Le fichier datasin est cree avec le petit  programme GFA donne en annexe

tabsin:
	incbin	datasin

	; Section qui contient les donnees
	section	plasma,BSS_C
tab_col_plasma:
	dcb.w	NB_DEG*NB_REP
coplist:dcb.b	taillecop*2

