*----------------------------------------------------------------------------
          ****  DOT PLOTTER FOR OUTCAST - CALL EACH FRAME ***
*----------------------------------------------------------------------------

dot_plotter:

	move.l #$dff000,a0
	move.l #dot_vars,a1
	addq.w #1,screen(a1)	;swap bitplanes
	cmpi.w #2,screen(a1)
	bne.s notloop
	clr.w screen(a1)

notloop	move.l #dot_bpln,a6
	move.w screen(a1),d7
scordrlp	move.l #firstscreen,d2
	move.w #84*166,d1
	mulu d7,d1
	add.l d1,d2
	move.w d2,$6(a6)
	swap d2
	move.w d2,$2(a6)

*----------------------------------------------------------------------------
* Calculate dot-dot vectors..
*----------------------------------------------------------------------------

cornerangle equ 19

	tst.w dospin(a1)
	beq not_spin

	move.l #sinetable,a2	;SIN TABLE
	lea 90*2(a2),a3		;COS TABLE

	move.w dots_rotation_ang(a1),d0	;orientation fix for sin / cos
	move.w d0,d7			;alignment
	lsl.w #1,d0		;work out rotated position Point a
	move.w $00(a2,d0.w),d1	;sin y
	move.w $00(a3,d0.w),d2	;cos x
	muls spread1(a1),d1
	muls spread2(a1),d2	
	move.l d1,firstpointx
	move.l d2,firstpointy
	add.w #180-cornerangle,d7	;to get to point b...
	cmpi.w #359,d7
	bls.s noovlp1
	sub.w #360,d7		
noovlp1	lsl.w #1,d7		;work out rotated position Point 2
	move.w $00(a2,d7.w),d3
	move.w $00(a3,d7.w),d4
	muls spread1(a1),d3
	muls spread2(a1),d4	
	sub.l d1,d3		;displacement Ay > By (*32768)
	sub.l d2,d4		;	    Ax > Bx (*32768)
	asr.l #6,d3		;gives disps * 512
	asr.l #6,d4		'
	divs #63,d3		;1/63th step  Ay > By
	divs #63,d4		;       step  Ax > Bx
	andi.l #$ffff,d3
	andi.l #$ffff,d4
	ext.l d3
	ext.l d4
	lsl.l #6,d3		;sets step integer into high word
	lsl.l #6,d4		;
	move.l d3,abxstep
	move.l d4,abystep

	move.w dots_rotation_ang(a1),d0
	add.w #180-cornerangle,d0
	cmpi.w #359,d0
	bls.s noovlp2
	sub.w #360,d0
noovlp2	move.w d0,d7	
	lsl.w #1,d0		;work out rotated position Point b
	move.w $00(a2,d0.w),d1	;sin y
	move.w $00(a3,d0.w),d2	;cos x
	muls spread1(a1),d1
	muls spread2(a1),d2	
	add.w #cornerangle,d7		;point 2 = 40degress on...
	cmpi.w #359,d7
	bls.s noovlp3
	sub.w #360,d7
noovlp3	lsl.w #1,d7		;work out rotated position Point c
	move.w $00(a2,d7.w),d3
	move.w $00(a3,d7.w),d4
	muls spread1(a1),d3
	muls spread2(a1),d4	
	sub.l d1,d3		;displacement By > Cy (*32768)
	sub.l d2,d4		;	    Bx > Cx (*32768)
	asr.l #6,d3		;gives disps * 512
	asr.l #6,d4		'
	divs #7,d3		;1/7th step  By > Cy
	divs #7,d4		;      step  Bx > Cx
	andi.l #$ffff,d3
	andi.l #$ffff,d4
	ext.l d3
	ext.l d4
	lsl.l #6,d3		;sets step integer into high word
	lsl.l #6,d4		;
	move.l d3,bcxstep
	move.l d4,bcystep

*----------------------------------------------------------------------------
* Create coord list 
*----------------------------------------------------------------------------

	move.l firstpointx,d1		;init x pos
	move.l firstpointy,d2		;init y pos
	move.l abxstep,d3
	move.l abystep,d4
	
	move.l #coordlist,a2	;create coord list
	lea $2(a2),a3		

	moveq #8-1,d0		;lines-1
bcloop	move.l d1,d5
	move.l d2,d6
	moveq #(64/8)-1,d7		;(columns/4)-1
abloop	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	move.l d5,(a2)+		;y coord
	move.l d6,(a3)+		;x coord
	add.l d3,d5
	add.l d4,d6
	dbf d7,abloop
	add.l bcxstep,d1
	add.l bcystep,d2
	dbf d0,bcloop

*----------------------------------------------------------------------------
* Erase old set 1 points
*----------------------------------------------------------------------------

	move.l #eraseadds,a0	
	move.w screen(a1),d0	
	eori.w #1,d0
	move.w d0,d1
	mulu #512*4,d0
	mulu #166*84,d1
	add.w d0,a0
	move.l a0,d5

	move.w #13,d6		;(512 / 36) - 1
rublp	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	dbf d6,rublp
	movem.l (a0)+,a1-a6		;last remaining 8
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a2
	clr.b (a1)
	clr.b (a2)

*----------------------------------------------------------------------------
* Plot new pixels
*----------------------------------------------------------------------------

	move.l d5,a3		;plot new pixels
	move.l #firstscreen,d7	
	add.l d1,d7

	move.l #dot_vars,a1
	move.w originx(a1),d4		;origin x
	move.w originy(a1),d3		;origin y
	
	move.l #coordlist,a0	
	move.l #yoffsets,a1
	move.l #bytearray,a4
	move.l #0,a2
	moveq #7,d5
	move.w #165,a5
	move.w #639,a6
	move.w #511,d6

loop10	tst.b (a4)+
	beq.s nextplot
	move.w (a0)+,d0		;y coord
	add.w d3,d0		;origin added
	cmp.w a5,d0		;check against screen boundarires
	bhi nextplot1
	move.w (a0)+,d1		;x coord
	add.w d4,d1		;origin added

*	cmp.w a6,d1		;check x against screen boundaries
*	bhi nextplot2		;WARNING! REMOVED FOR A500 speed!

	move.l d7,a2		;screen address
	lsl.w #1,d0		;y=y*2
	add.w $00(a1,d0.w),a2	;screen line offset added
	lsl.w #1,d1
	move.w d1,d0		;xpos saved
	lsr.w #3,d0		;x = x / 8
	add.w d0,a2		;byte position added to screen
	and.w d5,d1		;x = x and 7
	eor.w d5,d1		;flip bits
	bset d1,(a2)		;set pixel
	move.l a2,(a3)+		;save address for rub out
nextplot2	dbf d6,loop10
	bra plotsdone
nextplot1	addq.w #2,a0
	dbf d6,loop10
	bra plotsdone
nextplot	addq.w #4,a0
	dbf d6,loop10
	
plotsdone

*-----------------------------------------------------------------------------

Maxsize equ 159*2

	move.l #dot_vars,a1
	add.w #3,dots_rotation_ang(a1)
	cmpi.w #359,dots_rotation_ang(a1)
	bls.s noovlp4
	sub.w #360,dots_rotation_ang(a1)
noovlp4
	move.l #sinetable,a2
	move.w sizesinstep(a1),d0
	lsl.w #1,d0
	move.w $00(a2,d0.w),d0
	lsl.w #1,d0
	mulu #maxsize,d0
	swap d0
	move.w d0,spread1(a1)
	move.w d0,spread2(a1)
	addq.w #1,sizesinstep(a1)
	cmpi.w #179,sizesinstep(a1)
	bls.s nowrp2
	sub.w #180,sizesinstep(a1)
nowrp2		
	rts

*-----------------------------------------------------------------------------

firstpointx	dc.l $0
firstpointy	dc.l $0
abxstep		dc.l $0
abystep		dc.l $0
bcxstep		dc.l $0
bcystep		dc.l $0

*-----------------------------------------------------------------------------
DOT_VARS		dcb.b $20,0

dots_rotation_ang	equ $0
spread1		equ $2
screen		equ $4
originx		equ $6
originy		equ $8
spread2		equ $a
sizesinstep	equ $c
dospin		equ $e

xrad1		equ $10
yrad1		equ $12
xrad2		equ $14
yrad2		equ $16
adddeg1		equ $18
adddeg2		equ $1a

	dc.b "<here-$10 xrad1   yrad1   xrad1   yrad2   adeg1   adeg2"
	even

startdeg1		dc.w $011e
startdeg2		dc.w $00b4
adddegframe1	dc.w $02ce
adddegframe2	dc.w $0004

	dc.b "here-$8 startdeg1 startdeg 2 adperframedeg1 adperframedeg2"
	even

*-----------------------------------------------------------------------------
* Make Coord list
*-----------------------------------------------------------------------------

NOT_SPIN:

	move.l #coordlist,a0
	move.l #dot_vars,a1
	move.l #sinetable,a2
	lea 90*2(a2),a3 
	move.w startdeg1,d0
	move.w startdeg2,d1
	move.w #119,d7		;120 dots
	
mclloop	move.w 0(a2,d0.w),d2
	move.w 0(a3,d0.w),d3
	muls xrad1(a1),d2
	muls yrad1(a1),d3
	move.w 0(a2,d1.w),d4
	move.w 0(a3,d1.w),d5
	muls xrad2(a1),d4
	muls yrad2(a1),d5
	add.l d4,d2
	add.l d5,d3
	lsl.l #1,d2
	lsl.l #1,d3
	swap d2
	swap d3
	move.w d3,(a0)+
	move.w d2,(a0)+	
	add.w adddeg1(a1),d0
	cmpi.w #359*2,d0
	bls.s nodwrp1
	sub.w #360*2,d0
nodwrp1	add.w adddeg2(a1),d1
	cmpi.w #359*2,d1
	bls.s nodwrp2
	sub.w #360*2,d1
nodwrp2	dbf d7,mclloop

	move.w adddegframe1,d0
	move.w adddegframe2,d1
	add.w d0,startdeg1
	cmpi.w #359*2,startdeg1
	bls.s nodwrp3
	sub.w #360*2,startdeg1
nodwrp3	add.w d1,startdeg2
	cmpi.w #359*2,startdeg2
	bls.s nodwrp4
	sub.w #360*2,startdeg2
nodwrp4

*-----------------------------------------------------------------------------
* Erase old dots
*-----------------------------------------------------------------------------
plots
	move.l #eraseadds,a0	
	move.w screen(a1),d0	
	eori.w #1,d0
	move.w d0,d1
	mulu #512*4,d0
	mulu #166*84,d1
	add.w d0,a0
	move.l a0,d5

	move.w #3,d6		;erase 120 points
rublp2	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	movem.l (a0)+,a1-a6
	clr.b (a1)
	clr.b (a2)
	clr.b (a3)
	clr.b (a4)
	clr.b (a5)
	clr.b (a6)
	dbf d6,rublp2

*-----------------------------------------------------------------------------
* Plot new dots
*-----------------------------------------------------------------------------

	move.l d5,a3		
	move.l #firstscreen,d7	
	add.l d1,d7
	move.w #320/2,d4		;origin x
	move.w #166/2,d3		;origin y
	
	move.l #coordlist,a0	
	move.l #yoffsets,a1
	move.l #0,a2
	moveq #7,d5
	move.w #165,a5
	move.w #639,a6
	move.w #119,d6		;120 dots

plotloop	move.w (a0)+,d0		;y coord
	add.w d3,d0		;origin added
	cmp.w a5,d0		;check against screen boundarires
	bhi nxtplot1
	move.w (a0)+,d1		;x coord
	add.w d4,d1		;origin added
	cmp.w a6,d1		;check x boundary
	bhi nxtplot2		;

	move.l d7,a2		;screen address
	lsl.w #1,d0		;y=y*2
	add.w $00(a1,d0.w),a2	;screen line offset added
	lsl.w #1,d1
	move.w d1,d0		;xpos saved
	lsr.w #3,d0		;x = x / 8
	add.w d0,a2		;byte position added to screen
	and.w d5,d1		;x = x and 7
	eor.w d5,d1		;flip bits
	bset d1,(a2)		;set pixel
	move.l a2,(a3)+		;save address for rub out
nxtplot2	dbf d6,plotloop
	bra plotsdone2
nxtplot1	addq.w #2,a0
	dbf d6,plotloop

plotsdone2

	rts

*-----------------------------------------------------------------------------

*-----------------------------------------------------------------------------


