	addsym
	exeobj
	caseoff
	include	"lvo.asm"
	include	"strucdef.asm"
	code

start:	lea	ytab,a0
	clr	d0
	move	#199,d1
1$:	move	d0,(a0)+
	add	#40,d0
	dbra	d1,1$
	lea	bytenum,a0
	lea	bitnum,a1
	clr	d0
	move	#319,d1
2$:	move	d0,d2
	and	#7,d2
	neg	d2
	add	#7,d2
	move.b	d2,(a1)+
	move	d0,d2
	lsr	#3,d2
	move	d2,(a0)+
	addq	#1,d0
	dbra	d1,2$
	move.l	4,a6
	lea	varbase,a5
	lea	gfxname(a5),a1
	moveq	#0,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,gfxbase(a5)
	lea	intuiname(a5),a1
	moveq	#0,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,intuibase(a5)
	move.l	a5,a6
	bsr	setmode
	bsr	get_pnts
	bsr	get_deltas
outer
	bsr	get_deltas
	bsr	random
	mulu	#20,d0
	swap	d0
	add	#50,d0
	move	d0,ctdn(a6)
	addq	#1,color(a6)
b_loop:	movem.l	v0(a6),d0-d3
	bsr	draw_bezier
	bsr	update_coords
	btst	#6,$bfe001
	beq.s	cleanup
	subq	#1,ctdn(a6)
	bne.s	b_loop
	bra	outer
cleanup:	move.l	myscreen(a6),a0
	move.l	intuibase(a6),a6
	jsr	_LVOCloseScreen(a6)
	move.l	4,a6
	rts

setmode:	lea	mns(a6),a0
	move.l	intuibase(a6),a6
	jsr	_LVOOpenScreen(a6)
	move.l	d0,myscreen
	move.l	d0,a0
	lea	sc_RastPort(a0),a2
	lea	varbase,a6
	move.l	a2,the_rp(a6)
	rts
	
; return random word in d0
random:	move.w	seed(a6),d0
	mulu	#$1efd,d0
	add.w	#$dff,d0
	move.w	d0,seed(a6)
	rts

rand_xy:
; ret rnd x/y in d1/d2
	bsr	random
	move	#300*32,d1
	mulu	d0,d1
	clr	d1
	swap	d1
	add	#10,d1
	bsr	random
	move	#179*32,d2
	mulu	d0,d2
	clr	d2
	swap	d2
	add	#10,d2
	rts

get_pnts:	lea	v0(a6),a0
	moveq	#3,d3
1$:	bsr	rand_xy
	movem	d1/d2,(a0)
	lea	4(a0),a0
	dbra	d3,1$
	rts


get_deltas:	lea	dx0(a6),a0
	moveq	#7,d1
1$:	bsr	random
	mulu	#512,d0
	swap	d0
	sub	#256,d0
	move	d0,(a0)+
	dbra	d1,1$
	bsr	random
	rts

update_coords:
	lea	v0(a6),a0
	lea	dx0(a6),a1
	moveq	#3,d0
pt_loop:
	clr	d3
1$:	move	(a0),d1		; x
	move	(a1)+,d2		; dx
	add.w	d2,d1
	bmi.s	2$
	cmp	#319*32,d1
	blt.s	3$
2$:	neg	-2(a1)
	moveq	#1,d3
3$:	move	d1,d4
do_y:
1$:	move	2(a0),d1		; x
	move	(a1)+,d2		; dx
	add.w	d2,d1
	bmi.s	2$
	cmp	#199*32,d1
	blt.s	3$
2$:	moveq	#1,d3
	neg	-2(a1)
3$:	tst	d3
	bne.s	4$
	move	d4,(a0)
	move	d1,2(a0)
4$:	lea	4(a0),a0
	dbra	d0,pt_loop
	rts


draw_bezier	move.l	myscreen(a6),a0
	lea	sc_BitMap+bm_Planes(a0),a0
	lea	ytab(a6),a2
	move	color(a6),a3
	lea	bitnum(a6),a1
	lea	bytenum(a6),a6
	bsr	bez_draw
	lea	varbase,a6
	rts


pstep	macro
	move.l	(a4)+,a5
	add	d1,a5
	bclr	d2,(a5)
	lsr	#1,d3
	bcc.s	no_or\@
	bset	d2,(a5)
no_or\@:
	endm

set_it:	move.l	d0,d1
	swap	d0
	lsr	#5,d0
	lsr	#5,d1
set_pixel:
; d0,d1=x,y
; a0=bm array
; a1=bit #'s
; a2=ytab
; a3=color
; a6=bytenum
	add	d1,d1
	move	0(a2,d1),d1
	move.b	0(a1,d0),d2
	add	d0,d0
	add	0(a6,d0),d1
	move.l	a0,a4
	move	a3,d3
	pstep
	pstep
	pstep
	pstep
	move.l	(a4),a5
	add	d1,a5
	bclr	d2,(a5)
	tst	d3
	beq.s	no_or
	bset	d2,(a5)
no_or:	rts


bez_draw:	move	d0,d4
	sub.w	d3,d4
	bpl.s	1$
	neg	d4
1$:	move.l	d0,d5
	swap	d5
	swap	d3
	sub	d3,d5
	bpl.s	2$
	neg	d5
2$:	swap	d3
	add	d4,d5
	cmp	#64,d5
	blt.s	set_it
subdivide:	move	#$7fff,d7
	move.l	d0,d4
	add.l	d1,d4
	lsr.l	#1,d4
	and	d7,d4		; d4=s1
	move.l	d1,d5
	add.l	d2,d5
	lsr.l	#1,d5
	and	d7,d5		; d5=t
	move.l	d4,d6
	add.l	d5,d6
	lsr.l	#1,d6
	and	d7,d6		; d6=s2
	add.l	d3,d2
	lsr.l	#1,d2
	and	d7,d2		; d2=t2
	add.l	d2,d5
	lsr.l	#1,d5
	and	d7,d5		; d5=t1
	move.l	d6,d7
	add.l	d5,d7
	lsr.l	#1,d7
	bclr	#15,d7		; d7=s3,t0
	movem.l	d7/d5/d2/d3,-(a7)
	move.l	d4,d1
	move.l	d6,d2
	move.l	d7,d3
	bsr	bez_draw
	movem.l	(a7)+,d7/d5/d2/d3
	move.l	d7,d0
	move.l	d5,d1
	bra	bez_draw


pt	macro
	dc.l	65536*32*\1+32*\2
	endm

	section	vars,DATA
varbase
v0	pt	0,100
v1	pt	100,50
v2	pt	200,150
v3	pt	300,125

dx0	dc.l	0
dx1	dc.l	0
dx2	dc.l	0
dx3	dc.l	0

ctdn	dc.w	20000
color	dc.w	1
gfxbase	dc.l	0
intuibase	dc.l	0
myscreen	dc.l	0
the_rp	dc.l	0
seed	dc.w	$5232
mns	dc.w	0,0,320,200,5
	dc.w	-1,0,CUSTOMSCREEN
	dc.l	0,0,0,0

ytab	ds.w	200
bytenum	ds.w	320
bitnum	ds.b	320
gfxname	dc.b	'graphics.library',0
intuiname	dc.b	'intuition.library',0

	end
