;vector

rout			;when this is off, the routine-file will be
			;assembled, on=testing
			
;debug			;when this is on, colors in the background will
			;show how much time the routine needs.

;ntsctest		;when this is on, the routineplayer is in ntsc-mode

;ocs			;off=AGA,on=OCS testing not possible on OCS !

routinemode	equ	256+15	;the routinemode !


; VideoTracker AGA developer source 25-12-93
; 24-bits colors, Super-HiRes, HAM8, maximum burstmode (64 pixels aligned)
; wich makes low-resolution overscan a bit ugly.
; no "interactive" support anymore, it's only used by Kick 1.3 users.

; the first part of the source handles the things that are necessary to
; show the picture/copper and playing of the routine.
; the part between the "***" lines is the routine-source.
; at the bottom of the file, there are the necessary incbin-files who
; are needed to test the routine.
; these are saved with "save effect" in videotracker. they are raw
; data files which can be fonts,pictures,landscapes,vectorobjects
; etcetra.
; the incbin-files are put in the "variables" table, in the routine-
; player-handler
; the place where it's done can be found by searching for "!!!"

	opt	a+	;devpac 3 optimize
	opt	o+

	ifnd	ocs
vew_wid	equ	48
	endc
	ifd	ocs
vew_wid	equ	44
	endc
	
vew_hgt	equ	290
win_hgt	equ	117
win_str	equ	$1a

		ifd	ocs
pic_wid		equ	4		;wide in bytes
pic_hgt		equ	6		;hoogte
pic_dpt		equ	8		;number planes
pic_ani		equ	10		;aantal effes (anim)
pic_vew		equ	12		;viewmode
pic_cycstr	equ	14		;cycle start (*4)
pic_cycend	equ	15		;cycle end (*4)
pic_cycspd	equ	16		;cycle speed (*4)
pic_cycadd	equ	17		;cycle add (*4)
pic_palnum	equ	30		;aantal kleuren
pic_pal		equ	32		;palette start
pic_palsiz	equ	256*2		;vaste palette size
pic_raw		equ	pic_pal+pic_palsiz	;palette start
		endc
		
		ifnd	ocs
pic_wid		equ	4		;wide in bytes
pic_hgt		equ	6		;hoogte
pic_dpt		equ	8		;number planes
pic_ani		equ	10		;aantal effes (anim)
pic_vew		equ	12		;viewmode
pic_cycstr	equ	14		;cycle start (*8)
pic_cycend	equ	15		;cycle end (*8)
pic_cycspd	equ	16		;cycle speed (*8)
pic_cycadd	equ	17		;cycle add (*8)
pic_widmod	equ	46		;animation-width modulo
pic_future	equ	50		;free future space
pic_palnum	equ	62		;aantal kleuren
pic_pal		equ	64		;palette start
pic_palsiz	equ	256*4		;vaste palette size (longwords)
pic_raw		equ	pic_pal+pic_palsiz	;palette start
		endc
		
var_len		equ	$300		;lengte vartabel

var__GfxBase	equ	$000		;graphics lib
var_pic1	equ	$004		;current picture
var_anispd1	equ	$008		;animspeed
var_anitel1	equ	$00c		;animcount
var_cprbck	equ	$010		;copperback
var_bck		equ	$014		;background
var_pic2	equ	$018		;current picture
var_ntsc	equ	$01c		;ntsc/pal frequence
var_lnd		equ	$020		;landscape
var_anilop1	equ	$024
var_rottrg	equ	$028		;effect trigger
var_txt1	equ	$040		;text
var_txt16	equ	15*4+var_txt1
var_vec1	equ	$080		;vectors
var_vec16	equ	15*4+var_vec1
var_fon1	equ	$0c0		;fonts
var_fon16	equ	15*4+var_fon1
var_cols1	equ	$100		;colorsets
var_cols16	equ	15*4+var_cols1
var_obj1	equ	$180		;objects
var_obj16	equ	15*4+var_obj1

	ifd	rout
	;videotracker routine-test

	incdir	"w:include/"
	include	"exec/types.i"
	include	"graphics/gfxbase.i"
	include	"lvo/graphics_lib.i"
	incdir	'videotracker:effect/'

	SECTION	1,CODE_C
tus
	lea	var,a0
	move.l	#rottube,var_vec1(a0)	;incbinfile !!!
;	move.l	#rotsrc,curpic1		;picture !!!
;	move.l	#rotsrc,curpal1		;palette !!!
;	move.l	#rotset,var_cols1(a0)	;colorset !!!

	bsr	paltabres

	move.l	($4).w,a6
	sub.l	a1,a1
	jsr	-$126(a6)		;findtask
	move.l	d0,curtsk
	move.l	d0,a0
	move.l	$b8(a0),tskpri

	lea	dosnam,a1		;doslib openen
	moveq.l	#0,d0
	move.l	(4).w,a6
	jsr	-408(a6)		;openlib
	move.l	d0,doslib

	bsr.s	label5			;videotracker opstarten
	
	move.l	curtsk,a0
	move.l	tskpri,$b8(a0)
	move.l	($4).w,a6
	jsr	-$84(a6)		;forbid

	move.l	doslib,a1
	move.l	(4).w,a6
	jsr	-414(a6)		;closelib

	moveq.l	#0,d0
	rts
	
label5
	move.l	(4).w,a6		;workbench gedoe

	move.b	530(a6),ntscmode	;50/60 hertz halen

	ifd	ntsctest
	move.b	#60,ntscmode		;60 hertz (ntsc)
	endc

	cmp.b	#50,ntscmode		;ntsc ?
	beq.s	str.ntsc
	move.l	#vew_hgt-56,hogscr	;set NTSC screen hight
str.ntsc

	lea	cprjmp,a2		;copjmp zetten !
	move.l	#cprbck-8,d0
	move.w	d0,6(a2)
	swap	d0
	move.w	d0,2(a2)

	lea	cprbck-8,a2		;copstr zetten !
	move.l	#cpr,d0
	move.w	d0,6(a2)
	swap	d0
	move.w	d0,2(a2)

	bsr	cprsprrem		;sprites legen

	lea	gfxnam,a1		;graphics lib openen
	move.l	(4).w,a6
	jsr	-408(a6)		;openlib
	move.l	d0,a6
	move.l	d0,gfxlib
	move.l	38(a6),oldcprlist

	bset	#1,$bfe001
	bsr	copbuf			;copper vullen

	bsr	sysoff

gadrun
	btst	#6,($bfe001).l
	bne	gadrun

scrend
scrend.play
	bsr	syson

	move.l	gfxlib,a1
	move.l	(4).w,a6
	jsr	-414(a6)		;closelib

scrend.qb
	moveq.l	#0,d0	
	rts
	
	;vertical blank interrupt, no blits.
	;handles counters,interlace,sprite
	;level 3

intvb
	bra.s	intvb.cnt
	dc.l	'VIDU'
	dc.l	'LOOP'
intvb.cnt
	movem.l	d0-d7/a0-a6,-(sp)
	lea	($dff000).l,a6

	move.w	$01e(a6),d0
	btst	#5,d0			;vblank ?
	bne.s	intvb.vb

	bra.s	intcop.end

intvb.vb
	bsr	grap
	bsr	palctr			;palette zetten
	bsr.s	copbuf			;copper vullen
	
intvb.end
	move.w	#$0020,$09c(a6)	;vb bit wissen
	movem.l	(sp)+,d0-d7/a0-a6	;multitask uit, shit !
	rte

intcop.end
	movem.l	(sp)+,d0-d7/a0-a6
	move.l	intvbold,-(sp)
	rts

	;transmission buffer empty routine, BLIT !
	;handles routines,animations
	
inttbe					;tbe interrupt
	movem.l	d0-d7/a0-a6,-(sp)
	lea	($dff000).l,a6

	move.w	$01e(a6),d0
	btst	#0,d0			;no tbe ?
	beq.s	intdskblk


	btst	#6,($bfe001).l		;muis ingedrukt ?
	beq.s	inttbe.cop
	btst	#2,($dff016).l
	beq.s	inttbe.cop

	ifd	debug
	move.w	#$700,$dff180
	endc
	
	bsr	rotply			;routineplayer BLIT !
	bsr.s	copbuf			;copper vullen

	ifd	debug
	move.w	#$070,$dff180
	endc
	
inttbe.cop

inttbe.end
	move.w	#$0001,$09c(a6)
	movem.l	(sp)+,d0-d7/a0-a6
	rte

intdskblk
	move.w	#$0001,$09c(a6)		;be sure for no tbe handling
	movem.l	(sp)+,d0-d7/a0-a6
	move.l	inttbeold,-(sp)
	rts


	;moves the copperbuffer to the copperlist
	;sort of double buffering
	
copbuf
	movem.l	d0-d7/a0-a6,-(sp)

	lea	($dff000).l,a6

copbuf.novb				;copperchange overslaan
	moveq.l	#0,d0
	move.b	$005(a6),d0
	lsl.w	#8,d0
	moveq.l	#0,d1
	move.b	$006(a6),d1
	add.w	d1,d0

	cmp.w	#$4,d0			;lower limit, all stations 100%
	blt	copbuf.novb

	cmp.b	#50,ntscmode
	beq.s	copbuf.pal
	cmp.w	#$133-72-8,d0		;ntsc grens
	bge	copbuf.novb
	bra.s	copbuf.cont
copbuf.pal
	cmp.w	#$133-8,d0		;pal grens
	bge	copbuf.novb
copbuf.cont

	lea	gra.s,a0		;buffer copieren
	lea	cprbuf,a1
copbuf_aga				;AGA stuff :)
	move.l	#(gra.ql)/4-1,d0
copbuf.a
	move.w	2(a0),2(a1)
	add.l	#4,a0
	add.l	#4,a1
	dbra	d0,copbuf.a

copbuf.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;goes back to the workbench
	
syson
	movem.l	d0-d7/a0-a6,-(sp)

	move.w	#$0001,$dff09a		;tbeint uit
	move.l	intvbold,($6c).w
	move.l	inttbeold,($64).w

	move.l	4,a6
	jsr	-138(a6)		;permit

	move.l	gfxlib,a6
	jsr	-462(a6)		;disownblitter

	move.l	wbview,a1
	move.l	gfxlib,a6
	jsr	_LVOLoadView(a6) 	; Fix view
	jsr	_LVOWaitTOF(a6)
	jsr	_LVOWaitTOF(a6)         ; wait for LoadView()

syson.ras
	cmp.b	#$c0,$dff006		;prevent copperjump
	bne	syson.ras

	move.l	gfxlib,a6
	move.l	gb_copinit(a6),$dff080	 ; Kick it into life

	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
	;goes back to the gadgetscreen
	
sysoff
	movem.l	d0-d7/a0-a6,-(sp)
 	
	move.l	gfxlib,a6
	move.l	gb_ActiView(a6),wbview	;current view
	sub.l	a1,a1			; clear a1
	jsr 	_LVOLoadView(a6) 	; Flush View to nothing
	jsr	_LVOWaitTOF(a6) 	; Wait once
	jsr	_LVOWaitTOF(a6) 	; Wait again.

	move.l	gfxlib,a6
	jsr	-456(a6)		;ownblitter

	move.l	4,a6
	jsr	-132(a6)		;forbid
		
	move.l	($6c).w,intvbold
	move.l	#intvb,($6c).w
	move.l	($64).w,inttbeold
	move.l	#inttbe,($64).w
	move.w	#$8001,$dff09a		;tbeint aan
	bsr	gracpr			;reset copper
	bsr	copbuf			;copy copper
	move.l	#cpr,$dff080

	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
cprsprrem
	movem.l	d0-d7/a0-a6,-(sp)
	lea	cprspr,a0
	move.l	#sprdat,d0
	move.w	#7,d1
cprsprrem.a
	move.w	d0,3*2(a0)
	swap	d0
	move.w	d0,1*2(a0)
	swap	d0
	add.l	#8,a0
	dbra	d1,cprsprrem.a
	movem.l	(sp)+,d0-d7/a0-a6
	rts

varset					;variablen neerzetten
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	#var,a0

	move.l	#cprbck,var_cprbck(a0)
	move.l	gfxlib,var__GfxBase(a0)
	move.b	ntscmode,var_ntsc(a0)

	move.l	curpic1,var_pic1(a0)	;variabel
	move.l	curpic2,var_pic2(a0)	;variabel
	move.w	anispd1,var_anispd1(a0)
	move.w	anitel1,var_anitel1(a0)
	move.b	anilop1,var_anilop1(a0)
	move.l	#rottrg,var_rottrg(a0)
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
	;this routine handles all videotracker-routines

rotply	
	movem.l	d0-d7/a0-a6,-(sp)

	moveq.l	#0,d0

	lea	currot1,a2		;routine 1
	move.w	rotinf1,d0		;routine info
	bsr.s	rotplyr

rotply.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;this routine handles 1 routine, BLIT !
	
rotplyr
	movem.l	d0-d7/a1-a6,-(sp)

	move.l	#rot,(a2)		;routinestart address

;	move.b	#50,ntscmode		;ntsc/pal hz
	clr.l	curpic2			;background picture
	move.w	#1,anispd1		;animationspeed
	clr.w	anitel1			;animation position

	lea	var,a0			;communication-table

	move.b	#0,anilop1		;animloop off/on !!!
	move.w	#32,anispd1		;animdelay !!!
	move.l	#routinemode,d0		;routinemode !!!

	sub.l	a0,a0			;picture info legen

	tst.l	(a2)			;is er een routine ?
	beq	rotplyr.end		;interlace handling

	move.l	intdel,d2		;delay
	move.l	inttel,d1		;teller
	cmp.w	d2,d1
	blt	rotplyr.end
	clr.l	inttel
				
	bsr	varset			;variabelen updaten

	move.l	(a2),a1			;routine halen
	move.l	#var,a0			;variablen tabel

	movem.l	d3-d7/a1-a6,-(sp)
	moveq.l	#0,d1			;vars wissen
	moveq.l	#0,d2
	moveq.l	#0,d3
	moveq.l	#0,d4
	moveq.l	#0,d5
	moveq.l	#0,d6
	moveq.l	#0,d7
	sub.l	a2,a2
	sub.l	a3,a3
	sub.l	a4,a4
	sub.l	a5,a5

	jsr	4(a1)			;routine afwerken
	movem.l	(sp)+,d3-d7/a1-a6

	;Routine:
	;
	;Input:
	;a0=variabelentabel
	;d0=routinemode
	;
	;Output:
	;a0=picture
	;d1=copperlist
	;d2=interruptdelay		(NOT used till now)
	
	move.w	#$0020,$dff09a		;vb off !

	move.l	d2,intdel		;delay

	lea	cprjmp,a3
	move.l	#cprbck-8,d0

	cmp.l	(a2),a1			;routine ondertussen gewipt ?
	bne.s	rotplyr.nocop
	tst.l	d1			;copperlist ?
	beq.s	rotplyr.nocop
	move.l	d1,d0
rotplyr.nocop
	move.w	d0,6(a3)
	swap	d0
	move.w	d0,2(a3)

	cmp.l	#0,a0			;picture ?
	beq.s	rotplyr.endvb

	move.l	a0,curpic1		;current picture (cycle)
	move.l	a0,curpal1		;current palette

	tst.b	rotdpl			;plane is geleverd
	beq.s	rotplyr.set
	clr.b	rotdpl
	clr.l	cycdel1			;cycle info wissen
	clr.l	4+cycdel1
	clr.l	curfrm1			;curfrm1, altijd planes zetten
rotplyr.set
	clr.b	dplctr
	bsr.s	grap
	bsr	grac			;colorset
rotplyr.endvb
	move.w	#$8020,$dff09a
rotplyr.end
	movem.l	(sp)+,d0-d7/a1-a6
	rts

	;removes possible routine-coppers
	
gracpr
	movem.l	d0-d7/a0-a6,-(sp)
	lea	cprjmp,a3
	move.l	#cprbck-8,d0		;copperlist resetten
	move.w	d0,6(a3)
	swap	d0
	move.w	d0,2(a3)
	movem.l	(sp)+,d0-d7/a0-a6
	rts

grap					;d7=anim
	movem.l	d0-d7/a0-a6,-(sp)

	clr.l	d7

	tst.l	curpic1			;current picture ?
	beq	grap.end

	move.l	curpic1,a2		;normal pic halen

	lea	gracprscr,a1		;window neerzetten
	move.l	hogscr,d1

	move.w	pic_hgt(a2),d3		;pic hoogte
	move.w	pic_vew(a2),d5
	btst	#2,d5			;interlace ?
	beq.s	grap.nohi4
	lsr.w	#1,d3			;/2
grap.nohi4
	cmp.w	d3,d1
	bge.s	grap.hog
	move.w	d1,d3
grap.hog
	sub.w	d3,d1
	lsr.w	#1,d1
	add.w	#win_str,d1
	move.w	d1,d2
	add.w	d3,d2

	move.b	d1,2(a1)		;y start
	move.b	d2,6(a1)		;y end

	move.w	pic_wid(a2),d4		;pic breedte in bytes
	lsl.l	#3,d4

	move.l	#vew_wid*8,d0
	move.l	#0,d1
	move.l	#$61,d6

	cmp.w	#40,pic_wid(a2)		;overscan ?
	ble.s	grap.noov1
	move.l	#$41,d6
grap.noov1

	move.w	pic_vew(a2),d5
	btst	#15,d5			;hires ?
	beq.s	grap.nohi2

	move.l	#(vew_wid)*8*2,d0
	move.l	#1,d1
	move.l	#$61,d6

	cmp.w	#80,pic_wid(a2)		;overscan ?
	ble.s	grap.nohi2
	move.l	#(vew_wid)*8*2,d0
	move.l	#$51,d6

	bra.s	grap.noshi2
grap.nohi2	
	btst	#6,d5			;super hires ?
	beq.s	grap.noshi2

	move.l	#(vew_wid)*8*4,d0
	move.l	#2,d1
	move.l	#$61,d6

	cmp.w	#80*2,pic_wid(a2)	;overscan ?
	ble.s	grap.noshi2
	move.l	#(vew_wid)*8*4,d0
	move.l	#$51,d6

grap.noshi2	

	clr.w	d5
	cmp.w	d0,d4			;breeder dan scherm ?
	ble.s	grap.c
	move.w	d4,d5
	move.w	d0,d4
	sub.w	d0,d5			;modulo
	lsr.w	#3,d5			;/8
grap.c
	lsr.w	d1,d0
	lsr.w	d1,d4

	move.w	d0,d2
	sub.w	d4,d2
	lsr.w	#1,d2			;/2

	add.w	d6,d2
	move.b	d2,3(a1)		;x start
	move.w	d2,d3			;d3 bewaren !

	add.w	d4,d2			;d4 bewaren !
	move.b	d2,7(a1)		;x end
	
	move.w	pic_vew(a2),d6
	btst	#15,d6			;hires ?
	beq.s	grap.nohi5	
	add.l	d4,d4			;*2
	bra.s	grap.noshi5
grap.nohi5
	btst	#6,d6			;super hires ?
	beq.s	grap.noshi5	
	add.l	d4,d4			;*4
	add.l	d4,d4
grap.noshi5

	move.l	d7,-(sp)
	move.w	pic_vew(a2),d6
	move.l	#17,d0
	move.l	#4,d1			;ecs 1
	move.l	#3,d7

	btst	#15,d6			;hires ?
	beq.s	grap.nohi3	
	move.l	#17,d0			;ecs 9
	move.l	#4,d1			;ecs 2
	move.l	#2,d7
	bra.s	grap.noshi3
grap.nohi3
	btst	#6,d6			;super hires ?
	beq.s	grap.noshi3	
	move.l	#17,d0			;ecs 9
	move.l	#4,d1			;ecs 2
	move.l	#1,d7
grap.noshi3
	sub.w	d0,d3
	lsr.w	#1,d3
	move.w	d3,10(a1)		;ddfstrt
	
	move.w	d4,d2			;pic breedte in pixels
	lsr.w	#4,d2			;/16
	sub.w	d1,d2			;-1

	lsl.w	d7,d2			;*8
	add.w	d2,d3
	move.w	d3,14(a1)		;ddfstop
	move.l	(sp)+,d7
	
	lea	pic_raw(a2),a0

	moveq.l	#0,d2
	move.w	pic_dpt(a2),d2
	sub.l	#1,d2
	muls	pic_wid(a2),d2
	add.w	d2,d5

	move.w	pic_vew(a2),d2		;viewmode add
	btst	#2,d2
	beq.s	grap.nolace4

	moveq.l	#0,d2
	move.w	pic_dpt(a2),d2
	muls	pic_wid(a2),d2
	add.w	d2,d5			;interlace gedoe
grap.nolace4

	lea	gracprbpl,a4		;iffpln neerzetten
	lea	gracprpln,a0		;iffpln neerzetten
	moveq.l	#0,d2
	move.w	pic_dpt(a2),d2		;plnnummer 1 halen
	move.l	#8,d6			;copper step !

	tst.l	curpic2			;2de picture ?
	bne.s	grap.pic2
grap.nopic2
	move.w	d5,34(a1)		;modulo oneven zetten
	bra	grap.nodpl
grap.pic2
	move.l	curpic2,a3		;oneven plane
	move.l	curpic2+4,a6		;oneven plane
	move.l	currot2,a5		;oneven plane
	clr.l	curpic2			;mischien niet goed
	clr.l	curpic2+4		;mischien niet goed
	clr.l	curpal2			;mischien niet goed
	clr.l	currot2			;mischien niet goed

	cmp.l	curpic1,a3		;picture hetzelfde ?
	beq.s	grap.nopic2
	
	cmp.l	#0,currot1		;routine ?	
	beq.s	grap.norot
	cmp.l	currot1,a5		;routine hetzelfde ?
	beq.s	grap.nopic2
grap.norot
	cmp.b	#4,d2			;> 16 kleuren ? (AGA)
	bgt	grap.nopic2

	move.w	pic_dpt(a3),d3		;plnnummer 2 halen
	cmp.b	d2,d3			;gelijke plnummers ?
	bne.s	grap.nopic2
	move.w	pic_vew(a2),d1
	cmp.w	pic_vew(a3),d1		;view gelijk ?
	bne.s	grap.nopic2

	move.w	pic_vew(a2),d1		;groter dan view test
	btst	#6,d1			;super hires ?
	beq.s	grap.nohi2a
	move.l	#vew_wid*4,d1
	bra.s	grap.nohi2b
grap.nohi2a
	btst	#15,d1			;hires ?
	beq.s	grap.noshi2a
	move.l	#vew_wid*2,d1
	bra.s	grap.nohi2b
grap.noshi2a
	move.l	#vew_wid,d1
grap.nohi2b
	cmp.w	pic_wid(a2),d1		;breder dan view ?
	bgt.s	grap.small
	cmp.w	pic_wid(a3),d1		;breder dan view ?
	bgt.s	grap.small

	move.w	pic_vew(a2),d1
	btst	#2,d1
	beq.s	grap.nolace8a
	move.l	hogscr,d1
	add.l	d1,d1
	bra.s	grap.nolace8b
grap.nolace8a
	move.l	hogscr,d1
grap.nolace8b
	cmp.w	pic_hgt(a2),d1		;hoger dan view ?
	bgt.s	grap.small
	cmp.w	pic_hgt(a3),d1		;hoger dan view ?
	bgt.s	grap.small
	bra.s	grap.big

grap.small
	move.w	pic_hgt(a2),d1		;wid+hgt<vew
	cmp.w	pic_hgt(a3),d1		;hoogte gelijk ?
	bne	grap.nopic2
	move.w	pic_wid(a2),d1
	cmp.w	pic_wid(a3),d1		;breedte gelijk ?
	bne	grap.nopic2

grap.big
	move.l	a3,curpic2		;toch wel goed !
	move.l	a6,curpic2+4
	move.l	a3,curpal2
	move.l	a5,currot2

	tst.b	dplctr			;dual playfield al gezet ?
	beq	grap.nocop

	move.w	30(a1),34(a1)		;modulo copieren

	move.w	2(a4),d1		;bplcon0
	btst	#10,d1			;al dual playfield ?
	beq.s	grap.ta

	move.w	2(a0),10(a0)		;plane 0>1 copieren
	move.w	6(a0),14(a0)

	move.w	18(a0),26(a0)		;plane 2>3 copieren
	move.w	22(a0),30(a0)

	move.w	34(a0),42(a0)		;plane 4>5 copieren
	move.w	38(a0),46(a0)

	move.w	50(a0),58(a0)		;plane 6>7 copieren
	move.w	54(a0),62(a0)

	bra.s	grap.tb
grap.ta
	move.w	24(a0),58(a0)		;plane 3>7 copieren
	move.w	28(a0),62(a0)

	move.w	18(a0),42(a0)		;plane 2>5 copieren
	move.w	22(a0),46(a0)

	move.w	10(a0),26(a0)		;plane 1>3 copieren
	move.w	14(a0),30(a0)

	move.w	2(a0),10(a0)		;plane 0>1 copieren
	move.w	6(a0),14(a0)

grap.tb
	move.l	#palette,a3		;palette copieren

	move.w	#16-1,d1
grap.pal
	move.l	(a3)+,60(a3)
	dbra	d1,grap.pal

grap.nocop
	add.w	d3,d2			;aantal bitplanes
	cmp.w	#8,d2			;8 bitplanes ?
	blt	grap.no8planes2
	move.w	#%10000,d2		;only bit 4
	bra	grap.8planes2
grap.no8planes2
	lsl.w	#8,d2
	lsl.w	#4,d2
grap.8planes2
	or.w	#$400,d2		;dual playfield aan
	move.w	d2,2(a4)		;bplcon0

	movem.l	d0-d7/a0-a6,-(sp)

	move.l	curpic,a2		;animpic ?
	move.l	curfrm,d7
	cmp.l	#0,a2
	bne.s	grap.noanipic

	move.l	curpic2,a2		;normal pic ?
	move.l	curfrm2,d7
	cmp.l	#0,a2
	beq.s	grap.nodplpic

grap.noanipic
	add.l	d6,a0
	add.w	d6,d6
	bsr.s	grappln			;a2,d6,d7,d0
grap.nodplpic
	movem.l	(sp)+,d0-d7/a0-a6
	add.w	d6,d6
	bra.s	grap.nodpla


grap.nodpl				;geen dual playfield
	cmp.w	#8,d2			;8 bitplanes ?
	blt	grap.no8planes
	move.w	#%10000,d2		;only bit 4
	bra	grap.8planes
grap.no8planes
	lsl.w	#8,d2
	lsl.w	#4,d2
grap.8planes
	move.w	d2,2(a4)		;bplcon0

grap.nodpla
	move.w	d5,30(a1)		;modulo even

	moveq.l	#0,d3
	add.w	pic_vew(a2),d3		;viewmode add
	moveq.l	#0,d2
	move.w	2(a4),d2
	or.l	d3,d2

	ifd	gui
	tst.b	genlck
	bne	grap.genset
	endc

	or.l	#$100,d2		;genlock off ($302)

	ifd	gui
	bra	grap.gencont
grap.genset
	or.l	#$102,d2		;genlock on ($302)
grap.gencont
	endc
	
	move.w	d2,2(a4)
	
	bsr.s	grappln			;a2,d6,d7,d0

grap.end
	
	movem.l	(sp)+,d0-d7/a0-a6
	rts
		

	;sets on of the 2 possible pictures to the copper
	;handles interlace

	;d7=framenummer
	;d6=copperliststap
	;d0=raw planes positie
	;a2=current picture
grappln					;planes invullen 
	movem.l	d0-d7/a0-a6,-(sp)

	lea	pic_raw(a2),a1
	move.l	a1,d0			;raw planes
	
	moveq.l	#0,d2			;x*y
	move.w	pic_wid(a2),d2
	lsr.l	#1,d2			;/2
	moveq.l	#0,d3
	move.w	pic_hgt(a2),d3
	muls	d3,d2
	
	move.l	d2,d4
	add.l	d2,d2

	move.w	pic_dpt(a2),d3
	muls	d3,d4			;hele picture size
	muls	d7,d4			;frame*size d7 !!!

	add.l	d4,d4

	add.l	d4,d0

	move.l	#vew_wid,d5		;max x view
	move.l	hogscr,d4		;max y view
	move.w	pic_vew(a2),d1		;viewmode add
	btst	#2,d1
	beq.s	grappln.nolace
	add.l	d4,d4			;max y view
grappln.nolace
	btst	#15,d1			;hires ?
	beq.s	grappln.nohi
	move.l	#vew_wid*2,d5		;max x view
	bra.s	grappln.noshi
grappln.nohi
	btst	#6,d1			;super hires ?
	beq.s	grappln.noshi
	move.l	#vew_wid*4,d5		;max x view
grappln.noshi

	moveq.l	#0,d3			;scherm centreren
	move.w	pic_wid(a2),d3		;pic breedte in bytes
	cmp.w	d5,d3			;breder dan scherm ?
	ble.s	grappln.qa
	sub.w	d5,d3			;-scherm breedte
	lsr.w	#2,d3			;/4

	add.l	d3,d3

	add.l	d3,d0
grappln.qa
	move.w	pic_hgt(a2),d3		;pic hoogte in bytes
	cmp.w	d4,d3			;hoger dan scherm ?
	ble.s	grappln.qb
	sub.w	d4,d3			;-scherm breedte
	lsr.w	#1,d3			;/2
	moveq.l	#0,d5
	move.w	pic_wid(a2),d5		;pic breedte in bytes
	muls	pic_dpt(a2),d5
	muls	d5,d3
	add.l	d3,d0
grappln.qb
	moveq.l	#0,d2
	move.w	pic_wid(a2),d2

	move.w	pic_vew(a2),d5		;interlace flipping ?
	btst	#2,d5
	beq.s	grappln.nolac7b

	move.w	$04(a6),d5		;even/oneven ?
	btst	#15,d5
	beq.s	grappln.nolac7b
	
	moveq.l	#0,d3
	move.w	pic_wid(a2),d3
	muls	pic_dpt(a2),d3
	add.l	d3,d0
grappln.nolac7b

	move.w	pic_dpt(a2),d1		;plnnummer 1 halen
	tst.w	d1			;0 planes ?
	beq	grappln.end
	sub.w	#1,d1
grappln.a
	move.w	d0,3*2(a0)
	swap	d0
	move.w	d0,1*2(a0)
	swap	d0
	add.l	d6,a0			;d6=copper step !
	add.l	d2,d0
	dbra	d1,grappln.a

	cmp.w	#8,pic_dpt(a2)		;8 planes ?
	bne	grappln.noham8
	btst	#3,pic_vew(a2)		;ham ?
	beq	grappln.noham8

	move.w	-14(a0),d0		;get 6
	move.w	-10(a0),d1
	move.w	-6(a0),d2		;get 7
	move.w	-2(a0),d3
	move.w	-18(a0),-2(a0)		;5>7
	move.w	-22(a0),-6(a0)		;5>7
	move.w	-26(a0),-10(a0)		;4>6
	move.w	-30(a0),-14(a0)		;4>6
	move.w	-34(a0),-18(a0)		;3>5
	move.w	-38(a0),-22(a0)		;3>5
	move.w	-42(a0),-26(a0)		;2>4
	move.w	-46(a0),-30(a0)		;2>4
	move.w	-50(a0),-34(a0)		;1>3
	move.w	-54(a0),-38(a0)		;1>3
	move.w	-58(a0),-42(a0)		;0>2
	move.w	-62(a0),-46(a0)		;0>2
	move.w	d0,-62(a0)		;6>0
	move.w	d1,-58(a0)		;6>0
	move.w	d2,-54(a0)		;7>1
	move.w	d3,-50(a0)		;7>1
grappln.noham8

grappln.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;sets palettes to palette-buffer
	
grac
	movem.l	d0-d7/a0-a6,-(sp)

	lea	curpal1,a3		;palette 1
	move.l	#palette,a1
	bsr.s	gracfrm

	lea	curpal2,a3		;palette 2 (dpl)
	move.l	#16*4+palette,a1
	bsr.s	gracfrm
	
	bsr	palctr			;palette-buffer to copper
grac.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts
		
	;moves palette from picture to palette-buffer

gracfrm
	movem.l	d0-d7/a0-a6,-(sp)
	tst.l	(a3)			;palette aanwezig ?
	beq.s	gracfrm.end

	move.l	(a3),a2			;current palette
	
	cmp.l	#'PALE',(a2)		;palette ?
	bne.s	gracfrm.pict
	lea	6(a2),a0		;palette
	move.w	4(a2),d0		;aantal kleuren
	bra.s	gracfrm.col
gracfrm.pict
	cmp.l	#'ANIM',(a2)		;animatie ?
	bne.s	gracfrm.noanim

	moveq.l	#0,d1
	move.w	pic_ani(a2),d1
	bclr	#7,d1			;behandelbit weghalen

	moveq.l	#0,d3
	move.w	pic_wid(a2),d3
	lsr.w	#1,d3			;/2
	muls	pic_hgt(a2),d3
	muls	pic_dpt(a2),d3

	add.l	d3,d3

	add.l	#pic_raw,d3
	move.l	d3,d5

	btst	#0,d1
	bne.s	gracfrm.buf2
	moveq.l	#0,d5
gracfrm.buf2
	add.l	d5,a2
gracfrm.noanim
	lea	pic_pal(a2),a0		;palette
	move.w	pic_palnum(a2),d0

	tst.w	d0			;0 planes ?
	beq.s	gracfrm.end
gracfrm.col
gracfrm.fa
	move.l	(a0)+,(a1)+
	dbra	d0,gracfrm.fa
gracfrm.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
	;handles colorcycling in the palette-buffer

palcycctr
	movem.l	d0-d7/a0-a6,-(sp)

	move.l	curpic1,a2		;current raw
	cmp.l	#0,a2
	beq.s	palcycctr.qb
	lea	cycdel1,a3		;cycle delays
	move.l	#paltab,a4
	bsr	palcyc
palcycctr.qb
	move.l	curpic2,a2		;current raw
	cmp.l	#0,a2
	beq.s	palcycctr.c
	lea	cycdel2,a3		;cycle delays
	move.l	#16*2+paltab,a4
	bsr	palcyc
palcycctr.c
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
	;copies palette-buffer to copper

palctr
	movem.l	d0-d7/a0-a6,-(sp)

	lea	gracprcol,a1		;AGA
	move.l	#palette,a0
	move.l	#paltab,a2
	move.w	#8-1,d6
palctr.e
	move.w	#32-1,d7
palctr.d
	move.w	(a2)+,d0			;get cycle-position
	move.w	(a0,d0),6(a1)			;high RGB bits
	move.w	2(a0,d0),((32+1)*4)+6(a1)	;low RGB bits
	add.l	#4,a1
	dbra	d7,palctr.d
	add.l	#((32+2)*4),a1
	dbra	d6,palctr.e
palctr.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;reset palette tabel, for proper color cycling

paltabres
	movem.l	d0-d7/a0-a6,-(sp)
	lea	paltab,a0
	clr.l	d0
	move.w	#256-1,d1
paltabres.a
	move.w	d0,(a0)+
	add.w	#4,d0			;aga color words, high RGB + low RGB
	dbra	d1,paltabres.a
paltabres.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;colorcyclinghandling of a palette

palcyc
	movem.l	d0-d7/a0-a6,-(sp)
	move.w	#4-1,d7			;4 cycles
palcyc.d
	tst.w	(a3)+			;delay klaar ?
	bne.s	palcyc.c
	
	moveq.l	#0,d1
	move.b	pic_cycstr(a2),d1	;start color
	lsl.b	#1,d1		;*2

	moveq.l	#0,d2
	move.b	pic_cycend(a2),d2	;end color
	lsl.b	#1,d2		;*2

	moveq.l	#0,d3
	move.b	pic_cycadd(a2),d3	;richting

	move.l	a4,a0			;palette pointer
	move.l	a0,a1
	add.l	d1,a0			;startcolor
	add.l	d2,a1			;endcolor
	
	cmp.b	#1,d3			;omhoog
	beq.s	palcyc.up	
	cmp.b	#3,d3			;omlaag
	beq.s	palcyc.down
	bra.s	palcyc.i

palcyc.up				;kleuren copieren
	move.w	(a1),d4			;laatst color bewaren
palcyc.f				;kleuren copieren
	cmp.l	a0,a1
	beq.s	palcyc.fa
	move.w	-(a1),2(a1)
	bra.s	palcyc.f
palcyc.fa
	move.w	d4,(a1)
	bra.s	palcyc.g	
	
palcyc.down
	move.w	(a0),d4			;laatst color bewaren
palcyc.h				;kleuren copieren
	cmp.l	a0,a1
	beq.s	palcyc.ha
	move.w	2(a0),(a0)+
	bra.s	palcyc.h
palcyc.ha
	move.w	d4,(a1)

palcyc.g
	move.b	pic_cycspd(a2),-1(a3)	;delay zetten
	bra.s	palcyc.i
palcyc.c
	sub.w	#1,-2(a3)		;cycle delay aftellen
palcyc.i
	add.l	#4,a2			;next cycle info
	dbra	d7,palcyc.d

palcyc.qb
	movem.l	(sp)+,d0-d7/a0-a6
	rts



;	SECTION	variabelen,DATA_c

	cnop	0,2
curtsk		dc.l	0
tskpri		dc.l	0
duplok		dc.l	0
inttel		dc.l	0
intdel		dc.l	0

form		dc.l	0
ifffil		dc.l	0
intvbold	dc.l	0
inttbeold	dc.l	0
patpos		dc.l	0
gfxlib		dc.l	0
doslib		dc.l	0
wbview  	dc.l	0
mt_data		dc.l	0
memvid		dc.l	0
oldcprlist	dc.l	0
hogscr		dc.l	vew_hgt

inspos		dc.l	-1
anispd1		dc.w	1	;nooit op 0 !
anispd2		dc.w	1

		cnop	0,2
varclr.s			;start wissen
oldrot		dc.l	0
curpic		dc.l	0
curfrm		dc.l	0
cycdel1		ds.w	4
cycdel2		ds.w	4

rotinf1		dc.w	0
rotinf2		dc.w	0

effspd		dc.w	0
efflop		dc.b	0
anilop1		dc.b	0
anilop2		dc.b	0
anipal1		dc.b	0
anipal2		dc.b	0
rotdpl		dc.b	1
rottrg		dc.b	0
dplctr		dc.b	0
		cnop	0,2

insdat		ds.l	4
inspri		dc.l	0
instel		dc.w	0

cureff		dc.l	0
efftel		dc.w	0

curpal1		dc.l	0
curpal2		dc.l	0
currot1		dc.l	0
currot2		dc.l	0
curpic1		dc.l	0
curpic2		dc.l	0
anitel1		dc.w	0
anitel2		dc.w	0
curfrm1		dc.l	0
curfrm2		dc.l	0
oldfrm1		dc.l	0
oldfrm2		dc.l	0

varclr.e
		dc.l	0			;wisruimte
	
varclr.ql	equ	varclr.e-varclr.s	;wislengte
	
ntscmode	dc.b	0
end		dc.b	0

pronam	dc.b	'VideoTracker',0
	cnop	0,2
dosnam	dc.b	'dos.library',0
	cnop	0,4
gfxnam	dc.b	'graphics.library',0
	cnop	0,4
	
	cnop	0,4
gra.s			;copperlist edit buffer
gracprscr
	dc.w	$8e,$3381,$90,$81c1,$92,$003c,$94,$00d0
gracprbpl
	dc.w	$100,$0000,$102,$0000,$104,$0020
	dc.w	$108,$0000,$10a,$0000,$1fc,$0003
gracprpln
	dc.w	$e0,$0000,$e2,$0000	;1
	dc.w	$e4,$0000,$e6,$0000	;2
	dc.w	$e8,$0000,$ea,$0000	;3
	dc.w	$ec,$0000,$ee,$0000	;4
	dc.w	$f0,$0000,$f2,$0000	;5
	dc.w	$f4,$0000,$f6,$0000	;6
	dc.w	$f8,$0000,$fa,$0000	;7
	dc.w	$fc,$0000,$fe,$0000	;8
gracprcol
	dc.w	$106,$0000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$0200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$2000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$2200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$4000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$4200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$6000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$6200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$8000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$8200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$a000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$a200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$c000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$c200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$e000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$e200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$1000

cprjmp
	dc.w	$080,0,$082,0
gra.e
gra.ql	equ	gra.e-gra.s		;block lengte

cpr					;real copperlist
	dc.w	$0001,$fffe
	dc.w	$09c,$8001		;tbeint
cprspr
	dc.w	$120,$0000,$122,$0000
	dc.w	$124,$0000,$126,$0000
	dc.w	$128,$0000,$12a,$0000
	dc.w	$12c,$0000,$12e,$0000
	dc.w	$130,$0000,$132,$0000
	dc.w	$134,$0000,$136,$0000
	dc.w	$138,$0000,$13a,$0000
	dc.w	$13c,$0000,$13e,$0000

cprbuf
	dc.w	$8e,$3381,$90,$81c1,$92,$003c,$94,$00d0
	dc.w	$100,$9000,$102,$0000,$104,$0020
	dc.w	$108,$0000,$10a,$0000,$1fc,$0003

	dc.w	$e0,$0000,$e2,$0000	;0
	dc.w	$e4,$0000,$e6,$0000	;1
	dc.w	$e8,$0000,$ea,$0000	;2
	dc.w	$ec,$0000,$ee,$0000	;3
	dc.w	$f0,$0000,$f2,$0000	;4
	dc.w	$f4,$0000,$f6,$0000	;5
	dc.w	$f8,$0000,$fa,$0000	;6
	dc.w	$fc,$0000,$fe,$0000	;7

	dc.w	$106,$0000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$0200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$2000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$2200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$4000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$4200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$6000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$6200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$8000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$8200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
 	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$a000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$a200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$c000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$c200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$e000
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0
	dc.w	$106,$e200
	dc.w	$180,0,$182,0,$184,0,$186,0,$188,0,$18a,0,$18c,0,$18e,0
	dc.w	$190,0,$192,0,$194,0,$196,0,$198,0,$19a,0,$19c,0,$19e,0
	dc.w	$1a0,0,$1a2,0,$1a4,0,$1a6,0,$1a8,0,$1aa,0,$1ac,0,$1ae,0
	dc.w	$1b0,0,$1b2,0,$1b4,0,$1b6,0,$1b8,0,$1ba,0,$1bc,0,$1be,0

	dc.w	$106,$1000

	dc.w	$080,0,$082,0
cprbuf.e

	dc.w	$088,$0000		;copjmp2
	dc.w	$080,0,$082,0		;moet achter cprbck blijven !
cprbck
sprdat
	dc.w	$ffff,$fffe

palette		ds.l	256		;palette 24-bits, far out !
paltab		ds.w	256		;palette cycle-tabel

	cnop	0,2
var	ds.b	$300	;variabelen voor routines

	
;	SECTION	10,CODE_C
		endc

; this is the routine-source
;**********************************************************************

;Test_Vec
;mx68882		;gebruik 68882 routine
;copperspeed		;gebruik copperbar om snelheid te meten
;Nodraw			;tekent geen lijnen om snelheid beter te meten

;	mc68882
;	machine 68882	;in devpac 3: Machine 68882 dacht ik...
			;Ik heb dit met maxxon gemaakt...

;	assembleren met devpac, dan met hunkwizard of zoiets
;	absoluut maken naar bijv. $80000 om de hunks enzo
;	weg te halen, het eerste lonword moet "ROUT" zijn
;	uiteindelijk, kijk uit dat hij volledig position-
;	independent blijft (geeft devpac aan en hw ook)


	;hier staan de picture-tabel offsets,begint met
	;longword "PICT"

;vew_wid	equ	44
;vew_hgt	equ	290

;pic_wid	equ	4		;width in bytes
;pic_hgt	equ	6		;hoogte in lijnen
;pic_dpt	equ	8		;number of planes
;pic_ani	equ	10		;aantal frames (anim)
;pic_vew	equ	12		;viewmode (bplcon0)

	;4 cycles mogelijk (deluxe paint)

;pic_cycstr	equ	14		;cycle start (*4)
;pic_cycend	equ	15		;cycle end (*4)
;pic_cycspd	equ	16		;cycle speed (*4)
;pic_cycadd	equ	17		;cycle add (*4)
;pic_palnum	equ	30		;aantal kleuren -1 (dbra)
;pic_pal	equ	32		;palette start
;pic_palsiz	equ	256*2		;vaste palette size
					;256 kleuren mogelijk
;pic_raw	equ	pic_pal+pic_palsiz	;raw planes start

	;zo opgebouwd:
	;plane 0 row 0
	;plane 1 row 0
	;plane 2 row 0
	;plane 0 row 1
	;plane 1 row 1
	;plane 2 row 1
	;voor snellere blits
	
	;dit is de vector-tabel, imagine en rot3d worden
	;in vt omgezet naar een eigen vector-tabel
	;ik heb een losse voorbeeld.bin erbij gepacked
	;begint met "VECT"


		ifnd	ocs
vec_xyzlen	equ	$4		;lengte xyzc tabel
vec_pollen	equ	$8		;lengte polygoon tabel
vec_faclen	equ	$c		;lengte face tabel
vec_palnum	equ	$10		;aantal kleuren
vec_pal		equ	$12		;palette
vec_xyz		equ	256*4+vec_pal	;start xyzc tabel
vec_xyznum	equ	vec_xyz		;aantal xyzc's
vec_len		equ	vec_xyz+4	;minimale lengte
		endc
		
		ifd	ocs

vec_siz		equ	vew_hgt		;vergroting
vec_xyzlen	equ	$4		;lengte xyzc tabel

	;xyzc tabel:
	;aantal xyzc's  -1		word
	;x,y,z coordinaten en c (kleur) in words

vec_pollen	equ	$8		;lengte polygoon tabel
	
	;polygonen tabel: (uit mijn hoofd, bugvrij ?)
	;aantal poly's -1		word
	;poly 1 aantal lijnen -1	word
	;poly 1 lijn 1 xyzc 1 xyzc 2	word,word,xyzc-tabel nummer
	;poly 1 lijn 2 xyzc 1 xyzc 2	word,word
	;etc.
	
vec_palnum	equ	$10		;aantal kleuren -1 (dbra)
vec_pal		equ	$12		;palette in words (256)
vec_xyz		equ	256*2+vec_pal	;start xyzc tabel
vec_xyznum	equ	vec_xyz		;aantal xyzc's

		endc
		
	;de variabelen-tabel, geeft nuttige informatie
	;voor de routines
	;de huidige tabel bevat meer info maar dat heeft de
	;vectorroutine toch niet nodig

;var_gfxlib	equ	$000		;graphics lib
;var_pic	equ	$004		;current picture 1
;var_anispd1	equ	$008		;animspeed
;var_anitel1	equ	$00c		;animspeed
;var_cprbck	equ	$010		;copperback
;var_bck	equ	$014		;background
;var_ntsc	equ	$01c		;frequency
;var_txt1	equ	$040		;text
;var_txt16	equ	15*4+var_txt1
;var_fon1	equ	$0c0		;fonts
;var_fon16	equ	15*4+var_fon1
;var_vec1	equ	$080		;vectors
;var_vec64	equ	63*4+var_vec1
;var_obj1	equ	$180		;objects
;var_obj64	equ	63*4+var_obj1



rot_vewh	equ	0;$8000		;bplcon0 width-mode low-res/hi-res
rot_vewl	equ	0;$4		;bplcon0 heigth-mode no-lace/interlace
rot_vew		equ	rot_vewh+rot_vewl
rot_dpt		equ	1		;aantal planes (depth)

;shade	;als dit label aan staat, is het de vectorshade routine
	;(1 plane,6 buffers,copperlijst)

	ifeq	rot_vewh-0
	ifeq	rot_dpt-1
rot_blit	equ	1		;aantal clear blits
	endc
	ifeq	rot_dpt-2
rot_blit	equ	1		;aantal clear blits
	endc
	ifeq	rot_dpt-3
rot_blit	equ	1		;aantal clear blits
	endc
	ifeq	rot_dpt-4
rot_blit	equ	2		;aantal clear blits
	endc
	ifeq	rot_dpt-5
rot_blit	equ	2		;aantal clear blits
	endc
	ifeq	rot_dpt-6
rot_blit	equ	2		;aantal clear blits
	endc
	endc
	
	ifeq	rot_vewh-$8000
	ifeq	rot_dpt-1
rot_blit	equ	1		;aantal clear blits
	endc
	ifeq	rot_dpt-2
rot_blit	equ	2		;aantal clear blits
	endc
	ifeq	rot_dpt-3
rot_blit	equ	2		;aantal clear blits
	endc
	ifeq	rot_dpt-4
rot_blit	equ	3		;aantal clear blits
	endc
	endc
	
		ifeq	rot_vewh-0
bck_wid		equ	vew_wid		;view width
rot_wid		equ	(384/8)		;breedte planes
rot_drot	equ	256		;max. grote vectorobj
		ifd	ocs
rot_cen		equ	0
		endc
		ifnd	ocs
rot_cen		equ	8
		endc
		endc
		ifeq	rot_vewh-$8000
bck_wid		equ	vew_wid*2
rot_wid		equ	(384/8)*2
rot_drot	equ	256*2
		ifd	ocs
rot_cen		equ	8
		endc
		ifnd	ocs
rot_cen		equ	0
		endc
		endc

		ifeq	rot_vewl-$0
bck_hgt		equ	vew_hgt		;viewable hoogte
rot_hgt		equ	384		;hoogte planes
		endc
		ifeq	rot_vewl-$4
bck_hgt		equ	vew_hgt*2
rot_hgt		equ	384*2
		endc



	
;	a0=variabelen tabel		(adres tabel)
;	d0=routinfo			(routinemode-waarde)

	SECTION	3,CODE
	cnop	0,8
rot
rotp
	ifnd	ocs
	dc.l	'ROTA'			;effect-longword-ID
	endc
	
	ifd	ocs
	dc.l	'ROTO'			;effect-longword-ID
	endc

	movem.l	d2-d7/a1-a6,-(sp)

	lea	rot,a6			;a6 prog base (zorgt ervoor
					;dat deze routine overal
					;in het geheugen kan staan)
	ifd	rout
	move.l	#rotc,a2
	endc
	move.l	a2,rotchp-rot(a6)

	lea	($dff000).l,a5		;a5 gebruikt ik in de hele file

	ifd	shade
	move.l	rotchp-rot(a6),a1
	add.l	#rotcop-rotc,a1		;copperback invullen
	move.l	var_cprbck(a0),d1	;copperlist terugjump
	sub.l	#8,d1			;adres naar vt-copperlist
	move.w	d1,6(a1)
	swap	d1
	move.w	d1,2(a1)
	endc
	
	ifnd	shade
	move.l	rotchp-rot(a6),a3
	add.l	#rotpal1-rotc,a3		;palette van zichtbare
	move.l	a3,a4			;buffer naar werkbuffer
	move.l	real-rot(a6),d1
	add.l	d1,a3			;destination
	eor.l	#rotpic_l,d1
	add.l	d1,a4			;source
	move.w	#1,d1
	lsl.w	#rot_dpt,d1
	sub.w	#1,d1
rotpalcop.c				;palette
	ifd	ocs
	move.w	(a4)+,(a3)+
	endc
	ifnd	ocs
	move.l	(a4)+,(a3)+
	endc
	dbra	d1,rotpalcop.c
	endc

	lea	var_obj1(a0),a2		;copy current balls 
	lea	rotbaltab-rot(a6),a1
	move.w	#16-1,d1
rotbal.cop
	move.l	(a2)+,(a1)+
	dbra	d1,rotbal.cop

	tst.l	var_vec1(a0)		;nieuwe vector ?
	beq.s	rot.novec
	move.l	var_vec1(a0),a1		;halen
	clr.l	var_vec1(a0)		;wissen
	cmp.l	curvec-rot(a6),a1	;zelfde ?
	beq.s	rot.novec		;palette niet copieren
	move.l	a1,curvec-rot(a6)	;current vector

	ifnd	shade
	move.w	vec_palnum(a1),d1
	cmp.w	#-1,d1			;geen kleuren ?
	beq.s	rot.novec
	move.w	#1,d2			;maximale color check
	lsl.w	#rot_dpt,d2
	sub.w	#1,d2
	cmp.w	d2,d1
	ble.s	rotpalcop.a
	move.w	d2,d1
rotpalcop.a				;vector palette copieren
	lea	vec_pal(a1),a2
	move.l	rotchp-rot(a6),a3
	add.l	#rotpal1-rotc,a3
	add.l	real-rot(a6),a3		;get current workbuffer
rotpalcop.bx
	ifd	ocs
	move.w	(a2)+,(a3)+
	endc
	ifnd	ocs
	move.l	(a2)+,(a3)+
	endc
	dbra	d1,rotpalcop.bx
	endc

rot.novec
	tst.l	curvec-rot(a6)		;vector aanwezig ?
	beq	rot.end
	move.l	curvec-rot(a6),a1
	cmp.l	#'VECT',(a1)		;file nog actueel ?
	bne	rot.end
		
	clr.l	d1			;info ombouwen
	move.l	d0,d1
	divs	#8192,d1
	and.l	#$ffff,d1
	tst.b	d1
	beq.s	rot.norotclr
	clr.w	XROT-rot(a6)		;xyz clear
	clr.w	YROT-rot(a6)
	clr.w	ZROT-rot(a6)
rot.norotclr
	muls	#8192,d1
	sub.l	d1,d0

	move.l	d0,d1
	divs	#4096,d1
	and.l	#$ffff,d1
	move.b	d1,clrmod-rot(a6)	;clear on/off
	muls	#4096,d1
	sub.l	d1,d0

	move.l	d0,d1
	divs	#2048,d1
	and.l	#$ffff,d1
	move.b	d1,bufmod-rot(a6)	;double buffer on/off
	muls	#2048,d1
	sub.l	d1,d0

	move.l	d0,d1
	divs	#128,d1
	and.l	#$ffff,d1
	move.l	d1,d7
	add.l	#1,d7
	muls	#2,d7			;d7 snelheid (add)
	muls	#128,d1
	sub.l	d1,d0

	move.w	d0,d1
	divs	#64,d1
	and.l	#$ffff,d1
	move.w	d1,d3			;d3 richting (d mov)
	muls	#64,d1
	sub.w	d1,d0

	move.w	d0,d1
	divs	#8,d1
	and.l	#$ffff,d1
	move.w	d1,d2			;d2 type line/pix/ball
	muls	#8,d1
	sub.w	d1,d0

	move.w	d0,d1
	divs	#4,d1
	and.l	#$ffff,d1
	move.w	d1,d6			;d6 x rot
	muls	#4,d1
	sub.w	d1,d0

	move.w	d0,d1
	divs	#2,d1
	and.l	#$ffff,d1
	move.w	d1,d5			;d5 y rot
	muls	#2,d1
	sub.w	d1,d0

	move.w	d0,d4			;d4 z rot

	muls	d7,d6
	muls	d7,d5
	muls	d7,d4
	
	move.w	d6,xadd-rot(a6)
	move.w	d5,yadd-rot(a6)
	move.w	d4,zadd-rot(a6)
	move.w	d3,dway-rot(a6)
	move.w	d7,dadd-rot(a6)

	tst.b	clrmod-rot(a6)		;clear off ?
	bne.s	rot.noclear

	movem.l	d0-d7/a0-a6,-(sp)	;clear screen
	
	move.l	rotchp-rot(a6),a3
	add.l	#rotpln1-rotc,a3		;plane + centreren
	add.l	#((rot_hgt-bck_hgt)/2*rot_wid*rot_dpt)+((rot_wid-bck_wid)/4*2),a3
	add.l	real-rot(a6),a3

	move.w	#0,$042(a5)
	move.w	#$100+$f0,$040(a5)

	move.w	#rot_wid-bck_wid,$064(a5)
	move.w	#rot_wid-bck_wid,$066(a5)

	move.w	#0,$074(a5)		;a dat
	move.l	#0,$044(a5)		;mask

	move.w	#rot_blit-1,d0
rot.blit1
	move.l	a3,$054(a5)		;destination
	move.w	#((bck_hgt/rot_blit)*rot_dpt)*64+(bck_wid/2),$058(a5)
	bsr	rot.wblit

	add.l	#(bck_hgt/rot_blit)*rot_dpt*rot_wid,a3

	dbra	d0,rot.blit1
	movem.l	(sp)+,d0-d7/a0-a6

rot.noclear
	tst.b	d2
	bne.s	rot.typa
	bsr	VECTOR			;calc coords
	bsr	rot.pxl			;pixel
	bra.s	rot.typend

rot.typa
	cmp.b	#1,d2
	bne.s	rot.typb
	bsr	VECTOR			;calc coords
	bsr	rotlin			;lijnen
	bra.s	rot.typend
rot.typb

	cmp.b	#2,d2
	bne.s	rot.typc
	bsr	VECTOR			;calc coords
	bsr	rotgls			;glas
	bra.s	rot.typend
rot.typc
	cmp.b	#3,d2
	bne.s	rot.typd
	bsr	VECTOR			;calc coords
	bsr	rotfil			;solide
	bra.s	rot.typend
rot.typd
	cmp.b	#4,d2
	bne.s	rot.type
	bsr	VECTOR			;calc coords
	bsr	rot.bal			;ballen
	bra.s	rot.typend
rot.type
	cmp.b	#5,d2
	bne.s	rot.typf
	bsr	VECTOR			;calc coords
	bsr	rotsym			;symetrisch solide
	bra	rot.typend
rot.typf

rot.typend
	
	move.w	xadd-rot(a6),d0
	move.w	yadd-rot(a6),d1
	move.w	zadd-rot(a6),d2

	move.w	dadd-rot(a6),d3
	move.w	dway-rot(a6),d4
	
	add.w	d0,XROT-rot(a6)		;hoek draaing
	add.w	d1,YROT-rot(a6)
	add.w	d2,ZROT-rot(a6)

	btst	#0,d4
	bne.s	rot.px
	add.w	d3,DROT-rot(a6)
	bra.s	rot.q
rot.px
	sub.w	d3,DROT-rot(a6)
rot.q
	cmp.w	#718,XROT-rot(a6)	;vergelijkingen
	ble.s	NOP1
	sub.w	#718,XROT-rot(a6)
	
NOP1:	cmp.w	#718,YROT-rot(a6)
	ble.s	NOP2
	sub.w	#718,YROT-rot(a6)
NOP2:
	cmp.w	#718,ZROT-rot(a6)
	ble.s	NOP3
	sub.w	#718,ZROT-rot(a6)
NOP3:
	cmp.w	#rot_drot,DROT-rot(a6)
	ble.s	NOP4
	move.w	#rot_drot,DROT-rot(a6)
NOP4
	cmp.w	#0,DROT-rot(a6)
	bge.s	NOP5
	move.w	#0,DROT-rot(a6)
NOP5


GETMEOUT:

rot.end
	clr.l	d1

	ifd	shade
	move.l	rotchp-rot(a6),a1
	add.l	#rotcop-rotc,a1
	move.l	a1,d1			;copperlist
	move.l	rotchp-rot(a6),a2
	add.l	#rotpic1-rotc,a2		;raw rotplanes
	move.l	real-rot(a6),d2
	move.w	#4-1,d4
rotend.kb
	sub.l	#rotpic_l,d2
	cmp.l	#0-rotpic_l,d2
	bne	rotend.ka
	move.l	#5*rotpic_l,d2
rotend.ka
	move.l	a2,d3
	add.l	d2,d3

	move.l	#((rot_hgt-vew_hgt)/2*rot_wid*rot_dpt)+((rot_wid-vew_wid)/2)+rotinf_l,d6
	cmp.b	#50,var_ntsc(a0)
	beq	rotend.pal
	move.l	#((rot_hgt-(vew_hgt-56))/2*rot_wid*rot_dpt)+((rot_wid-vew_wid)/2)+rotinf_l,d6
rotend.pal
	add.l	d6,d3
	move.w	d3,$e(a1)
	swap	d3
	move.w	d3,$a(a1)
	add.l	#8,a1
	dbra	d4,rotend.kb	
	endc

	move.l	rotchp-rot(a6),a0
	add.l	#rotpic1-rotc,a0		;raw rotplanes
	move.l	real-rot(a6),d0		;get scherm 2

	tst.b	bufmod-rot(a6)		;buffer on/off
	bne.s	rot.end2

	ifnd	shade
	eor.l	#rotpic_l,real-rot(a6)	;real=scherm 2
	endc

	ifd	shade
	move.l	real-rot(a6),d2
	add.l	#rotpic_l,d2
	cmp.l	#6*rotpic_l,d2
	bne	rotend.k
	clr.l	d2
rotend.k
	move.l	d2,real-rot(a6)
	endc

rot.end2
	add.l	d0,a0		
	movem.l	(sp)+,d2-d7/a1-a6
	rts

rot.wblit
	btst 	#6,$002(a5)
	bne 	rot.wblit
	rts
	
rot.bal
	movem.l	d0-d7/a0-a6,-(sp)

	move.w	#%1111111111111111,$044(a5)
	move.w	#%1111111111111111,$046(a5)

	move.l	rotbaltab-rot(a6),a1
	cmp.l	rotpal-rot(a6),a1	;nieuwe bal ?
	beq.s	rot.bala
	move.l	a1,rotpal-rot(a6)	;en opslaan

	ifnd	shade
	cmp.w	#rot_dpt,pic_dpt(a1)	;depth hetzelfde ?
	bne.s	rot.bala
	
	move.w	pic_palnum(a1),d0
	lea	pic_pal(a1),a1
	move.l	rotchp-rot(a6),a2
	add.l	#rotpal1-rotc,a2
	add.l	real-rot(a6),a2
rot.balpal
	ifd	ocs
	move.w	(a1)+,(a2)+
	endc
	ifnd	ocs
	move.l	(a1)+,(a2)+
	endc
	dbra	d0,rot.balpal
	endc
	
rot.bala

	clr.l	d0
	clr.l	d1
	clr.l	d2
	clr.l	d3
	clr.l	d4
rot.balb
	move.l	curvec-rot(a6),a4
	add.l	#vec_xyz,a4		;info overslaan
		
	lea	xy,a2
	move.l	#$7fff,d5
	move.w	(a4)+,d7		;aantal xyZ's-1 vanwege DBF_commando
rot.zaadbal
	move.w	4(a2),d3		;z
	beq.s	rot.zaadbala		;0 ?
	
	cmp.w	d5,d3			;groter ?
	bgt.s	rot.zaadbala
	move.w	d3,d5			;kleinste z bewaren
	move.l	a2,a3			;xyz posiite bewaren
	move.l	a4,a1			;kleur positie bewaren	
rot.zaadbala
	lea	6(a2),a2
	lea	8(a4),a4
	dbra	d7,rot.zaadbal

	cmp.w	#$7fff,d5		;klaar ?
	beq.s	rot.balend

	moveq.l	#0,d4
	move.w	6(a1),d4		;kleur
	add.w	d4,d4
	add.w	d4,d4			;*4
	movem.w	(a3),d0/d1/d3		;x,y,z
	bsr.s	rotobj			;a0,d0,d1,d4
	clr.w	4(a3)			;z wissen
	bra	rot.balb

rot.balend
	movem.l	(sp)+,d0-d7/a0-a6
	rts

rotobj					;d3
	movem.l	d0-d7/a0-a6,-(sp)

	lea	rotbaltab,a0
	add.l	d4,a0
		
	tst.l	(a0)			;ball file ?
	beq	rotobj.end
	move.l	(a0),a0
	cmp.l	#'OBJE',(a0)		;nog levend ?
	bne	rotobj.end
	cmp.w	#rot_dpt,pic_dpt(a0)	;depth hetzelfde ?
	bne	rotobj.end
	
	move.l	real-rot(a6),d6		;get scherm 2
	move.l	rotchp-rot(a6),a1
	add.l	#rotpln1-rotc,a1
	add.l	d6,a1
	
	clr.l	d2			;centreer x
	move.w	pic_wid(a0),d2
	sub.l	#2,d2			;-blitterscrollruimte
	lsl.l	#2,d2			;*8/2
	sub.l	d2,d0

	clr.l	d2			;centreer y
	move.w	pic_hgt(a0),d2
	lsr.l	#1,d2			;/2
	sub.l	d2,d1

	move.l	d0,d2
	lsr.l	#4,d0			;ruwe xpos
	lsl.l	#1,d0
	add.l	d0,a1

	muls	#rot_wid*rot_dpt,d1	;ypos
	add.l	d1,a1

	clr.l	d6
	move.w	pic_wid(a0),d6		;bltsize berekenen
	lsr.w	#1,d6			;/2
	clr.l	d5
	move.w	pic_hgt(a0),d5
	muls	pic_dpt(a0),d5
	lsl.w	#6,d5			;*64 voor bltsize
	add.w	d5,d6
	
	lsl.l	#3,d0			;bitscroll verder bereken
	sub.l	d0,d2
	lsl.w	#8,d2
	lsl.w	#4,d2
	move.w	d2,$42(a5)		;bltcon1
	add.w	#$0fca,d2
	move.w	d2,$40(a5)		;bltcon0

rotobj.da
	clr.l	d5
	move.w	pic_ani(a0),d5		;aantal brushes

	move.l	#256,d4			;maximale z !

	divs	d5,d4
	and.l	#$ffff,d4
	and.l	#$ffff,d3
	divs	d4,d3
	and.l	#$ffff,d3
	
	clr.l	d5
	move.w	pic_wid(a0),d5		;breedte
	muls	pic_hgt(a0),d5		;hoogte
	muls	pic_dpt(a0),d5		;plnnumes

	move.l	d5,d7
	add.l	d5,d5			;plus mask
	muls	d3,d5			;anipos

	lea	pic_raw(a0),a4		;obj picture
	add.l	d5,a4
	move.l	a4,a3
	add.l	d7,a3			;obj mask

	move.l	#rot_wid,d7
	sub.w	pic_wid(a0),d7
	move.w	d7,$60(a5)		;bltcmod
	move.w	d7,$66(a5)		;bltdmod

	move.w	#0,$62(a5)		;bltbmod
	move.w	#0,$64(a5)		;bltamod

	clr.l	d3
	move.w	pic_dpt(a0),d3		;bck opslaan

rotobj.a
	move.l	a1,$48(a5)		;bltcpt destination
	move.l	a4,$4c(a5)		;bltbpt picture
	move.l	a3,$50(a5)		;bltapt mask
	move.l	a1,$54(a5)		;bltdpt destination

	move.w	d6,$58(a5)		;bltsize
	bsr	rot.wblit

rotobj.bx
rotobj.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

rot.pxl					;pixels zetten
	movem.l	d0-d7/a0-a6,-(sp)
	clr.l	d0
	clr.l	d1
	clr.l	d3
	clr.l	d4

	lea	xy,a2
	
	move.l	#rot_wid,d6
	move.l	#rot_wid*rot_dpt,d5	;y
	move.l 	#7,d4			;x bit 8
	
	move.l	curvec-rot(a6),a1
	add.l	#vec_xyz,a1
	move.w	(a1)+,d7		;aantal xyZ's-1 vanwege DBF_commando

	move.l	rotchp-rot(a6),a0
	add.l	#rotpln1-rotc,a0
	add.l	real-rot(a6),a0		;get scherm 2
	add.l	#(rot_dpt-1)*rot_wid,a0
	move.l	a0,a3
rot.pxla

	ifeq	1-rot_dpt
	movem.w	(a2)+,d0-d1/d3		;xyz

;	muls	d5,d1			;y

	ifeq	rot_wid-(384/8*2)	;*96
	lsl.w	#5,d1			;*32
	move.w	d1,d3
	add.w	d1,d1			;*2
	add.w	d3,d1
	endc

	ifeq	rot_wid-(384/8)		;*48
	lsl.w	#4,d1			;*16
	move.w	d1,d3
	add.w	d1,d1			;*2
	add.w	d3,d1
	endc

	move.w	d0,d2
	lsr.w	#3,d2			;/8
	add.w	d2,d1
	move.w	d4,d2
	and.w 	d4,d0			;x bit 8
	sub.w	d0,d2

	move.l	a3,a0
	add.l	d1,a0
	bset	d2,(a0)
	dbra	d7,rot.pxla
	endc
	
	iflt	1-rot_dpt

	movem.w	(a2)+,d0-d1/d3		;xyz
	move.w	6(a1),d3		;kleur
	add.l	#8,a1
	muls	d5,d1			;y
	move.w	d0,d2
	lsr.w	#3,d2			;/8
	add.w	d2,d1
	move.w	d4,d2
	and.w 	d4,d0			;x bit 8
	sub.w	d0,d2

	move.l	a3,a0
	add.l	d1,a0
	move.w	#rot_dpt-1,d0
rot.pxlb
	btst	d0,d3
	beq	rot.pxlc
	bset	d2,(a0)
rot.pxlc
	sub.l	d6,a0
	dbra	d0,rot.pxlb
	dbra	d7,rot.pxla

rot.pxlx
	endc
	movem.l	(sp)+,d0-d7/a0-a6
	rts

;DRAWLINE-ROUTINE
;d0 = x1
;d1 = y1
;d2 = x2
;d3 = y2
;uses d0-d6

rotlin					;lijntjes trekken, joepie !
	movem.l	d0-d7/a0-a6,-(sp)

	move.l	curvec-rot(a6),a1
	add.l	4(a1),a1
	add.l	#vec_xyz,a1		;info overslaan

	lea	xy,a2
	clr.l	d4
	move.w	(a1)+,d6		;aantal poly's
	cmp.w	#-1,d6			;geen ?
	beq.s	rotlin.end
rotlin.a
	move.w	(a1)+,d7		;aantal lijnen
	lea	2(a1),a1		;kleur overslaan
rotlin.bx
	move.w	(a1)+,d4
	subq.w	#1,d4
	muls	#6,d4
	movem.w	(a2,d4.w),d0-d1

	move.w	(a1)+,d4
	subq.w	#1,d4
	muls	#6,d4
	movem.w	(a2,d4.w),d2-d3

	bsr 	DRAWLINE		;lijn tekenen
	dbra	d7,rotlin.bx
;	lea	2(a1),a1
	dbra	d6,rotlin.a
rotlin.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
rotfil					;solid poly's
	movem.l	d0-d7/a0-a6,-(sp)

	bsr	line_init1		;eventueel tabel vullen
	lea	xy,a2
	bsr	rotsor			;poly's sorteren

	cmp.w	#-1,d1			;geen ?
	beq	rotfil.end

	move.w	d1,d3			;aantal polies
	move.w	d1,d4			;aantal polies

rotfil.fa
	lea	rotdontab,a4		;done tabel
	sub.l	a1,a1
	move.w	#$7fff,d6		;maximale z positie
	move.w	d3,d2			;aantal poly's
rotfil.ca
	move.w	4(a4),d0		;poly z
	beq.s	rotfil.aa		;leeg ?
	cmp.w	d6,d0			;z positie groter ?
	bge.s	rotfil.aa
	move.l	a4,a1
	move.w	d0,d6
rotfil.aa
	lea	6(a4),a4
	dbra	d2,rotfil.ca

	cmp.l	#0,a1
	beq	rotfil.end		;voortijdige ejaculatie
	clr.w	4(a1)			;poly wissen

	movem.l	d0-d7/a0-a6,-(sp)
	move.l	(a1),a1			;poly halen
	move.w	(a1)+,d7		;aantal lijnen
	move.w	(a1)+,a0		;kleur

	moveq.l	#0,d0
	moveq.l	#0,d1
	moveq.l	#0,d2
	moveq.l	#0,d3
	move.l	#$7fff,d4		;minimale x
	move.l	#$7fff,d5		;minimale y
	sub.l	a3,a3			;maximale x
	sub.l	a4,a4			;maximale y
rotfil.bx
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d0-d1		;x1,y1
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d2-d3		;x2,y2

	bsr	line			;lijn tekenen

	cmp.w	d4,d0			;minimale x halen
	bge.s	rotfil.ba
	move.w	d0,d4
rotfil.ba
	cmp.w	d4,d2
	bge.s	rotfil.bb
	move.w	d2,d4
rotfil.bb
	cmp.w	d5,d1			;minimale y halen
	bge.s	rotfil.bc
	move.w	d1,d5
rotfil.bc
	cmp.w	d5,d3
	bge.s	rotfil.bd
	move.w	d3,d5
rotfil.bd

	move.l	a3,d6
	cmp.w	d6,d0			;maximale x halen
	ble.s	rotfil.be
	move.w	d0,a3
rotfil.be
	cmp.w	d6,d2
	ble.s	rotfil.bf
	move.w	d2,a3
rotfil.bf

	move.l	a4,d6
	cmp.w	d6,d1			;maximale y halen
	ble.s	rotfil.bg
	move.w	d1,a4
rotfil.bg
	cmp.w	d6,d3
	ble.s	rotfil.bh
	move.w	d3,a4
rotfil.bh

	dbra	d7,rotfil.bx

	bsr	rotpolfil

rotfil.noline
	movem.l	(sp)+,d0-d7/a0-a6

rotfil.ea
	dbra	d4,rotfil.fa

rotfil.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
rotsym					;solid lines
	movem.l	d0-d7/a0-a6,-(sp)

	bsr	line_init1		;eventueel tabel vullen
	lea	xy,a2
	bsr	rotsor			;poly's sorteren d1=aantal

	cmp.w	#-1,d1			;geen ?
	beq	rotsym.end

	move.w	d1,d3			;aantal polies
	add.w	#2,d1
	lsr.w	#1,d1			;/2
	sub.w	#1,d1

	tst.w	d1
	beq.s	rotsym.plot		;maar 1 poly !
	
	move.w	d1,d4			;aantal te wissen polies
rotsym.f
	lea	rotdontab,a4		;done tabel
	move.w	#$7fff,d6		;maximale z positie
	move.w	d3,d2			;aantal poly's
rotsym.c
	move.w	4(a4),d0		;poly z
	beq.s	rotsym.a		;leeg ?
	cmp.w	d6,d0			;z positie groter ?
	bgt.s	rotsym.a
	move.l	a4,a1
	move.w	d0,d6
rotsym.a
	lea	6(a4),a4
	dbra	d2,rotsym.c
	clr.w	4(a1)			;poly wissen
rotsym.e
	dbra	d4,rotsym.f
	
rotsym.plot
	move.w	d3,d4			;aantal polies
	sub.w	d1,d4			;- aantal te wissen polies
rotsym.fa
	lea	rotdontab,a4		;done tabel
	sub.l	a1,a1
	move.w	#$7fff,d6		;maximale z positie
	move.w	d3,d2			;aantal poly's
rotsym.ca
	move.w	4(a4),d0		;poly z
	beq.s	rotsym.aa		;leeg ?
	cmp.w	d6,d0			;z positie groter ?
	bge.s	rotsym.aa
	move.l	a4,a1
	move.w	d0,d6
rotsym.aa
	lea	6(a4),a4
	dbra	d2,rotsym.ca

	cmp.l	#0,a1
	beq	rotsym.end		;voortijdige ejaculatie
	clr.w	4(a1)			;poly wissen

	movem.l	d0-d7/a0-a6,-(sp)
	move.l	(a1),a1			;poly halen
	move.w	(a1)+,d7		;aantal lijnen
	move.w	(a1)+,a0		;kleur

	moveq.l	#0,d0
	moveq.l	#0,d1
	moveq.l	#0,d2
	moveq.l	#0,d3
	move.l	#$7fff,d4		;minimale x
	move.l	#$7fff,d5		;minimale y
	sub.l	a3,a3			;maximale x
	sub.l	a4,a4			;maximale y
rotsym.bx
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d0-d1	;x1,y1
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d2-d3	;x2,y2

	bsr	line			;lijn tekenen

	cmp.w	d4,d0			;minimale x halen
	bge.s	rotsym.ba
	move.w	d0,d4
rotsym.ba
	cmp.w	d4,d2
	bge.s	rotsym.bb
	move.w	d2,d4
rotsym.bb
	cmp.w	d5,d1			;minimale y halen
	bge.s	rotsym.bc
	move.w	d1,d5
rotsym.bc
	cmp.w	d5,d3
	bge.s	rotsym.bd
	move.w	d3,d5
rotsym.bd

	move.l	a3,d6
	cmp.w	d6,d0			;maximale x halen
	ble.s	rotsym.be
	move.w	d0,a3
rotsym.be
	cmp.w	d6,d2
	ble.s	rotsym.bf
	move.w	d2,a3
rotsym.bf

	move.l	a4,d6
	cmp.w	d6,d1			;maximale y halen
	ble.s	rotsym.bg
	move.w	d1,a4
rotsym.bg
	cmp.w	d6,d3
	ble.s	rotsym.bh
	move.w	d3,a4
rotsym.bh

	dbra	d7,rotsym.bx

	bsr	rotpolfil

rotsym.noline
	movem.l	(sp)+,d0-d7/a0-a6

rotsym.ea
	dbra	d4,rotsym.fa

rotsym.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
rotsor					;polies sorteren
	movem.l	d2-d7/a0-a6,-(sp)

	move.l	curvec-rot(a6),a1
	add.l	4(a1),a1
	add.l	#vec_xyz,a1		;info overslaan

	lea	rotdontab,a4		;done tabel wissen
	moveq.l	#0,d7
	move.w	(a1)+,d6		;aantal polies
	move.w	d6,d1

	cmp.w	#-1,d1			;geen ?
	beq.s	rotsor.end

rotsor.h
	move.w	(a1),d7			;aantal lijnen
	move.w	d7,d3			;aantal lijnen
	add.w	#1,d3
	
	move.l	a1,(a4)+		;poly opslaan
	lea	4(a1),a1		;+kleur
	moveq.l	#0,d0			;gemiddelde z positie
;	moveq.l	#0,d2
	moveq.l	#0,d4			;gemiddelde z positie
rotsor.dx
	move.w	(a1)+,d2		;coordinaat nummer
	subq.w	#1,d2
	muls	#6,d2
	move.w	4(a2,d2.w),d4		;z
	lea	2(a1),a1		;2de coordinaat overslaan
;	cmp.w	d2,d4
;	ble	rotsor.da
;	move.w	d4,d2
;rotsor.da
	add.l	d4,d0
	dbra	d7,rotsor.dx
;	add.l	d2,d0			;+hoogste z-positie
	divs	d3,d0			;/aantal lijnen
	move.w	d0,(a4)+		;poly gem. z opslaan

;	lea	2(a1),a1
	dbra	d6,rotsor.h
rotsor.g
rotsor.end
	movem.l	(sp)+,d2-d7/a0-a6
	rts

rotpolfil				;d4/d5/a3/a4
	movem.l	d0-d7/a0-a6,-(sp)
	move.l	rotchp-rot(a6),a2
	add.l	#rotpln1-rotc,a2
	move.l	a2,a1
	add.l	#rotplnw-rotpln1,a1	;workplane
	add.l	real-rot(a6),a2		;get scherm 2

	move.w	#rot_wid,d7		;wordt modulo

	sub.w	#16,d4			;ruimte voor min x
	add.w	#16,a3			;ruimte voor max x

;	sub.w	#2,d5			;ruimte voor min y
	add.w	#1,a4			;ruimte voor max y
	
	move.w	a4,d0			;maximale y
	sub.w	d5,d0			;-minimale y
	move.w	d0,d2			;y hoogte (in lijnen)
	lsl.w	#6,d0			;*64

	move.w	a3,d1			;maximale x
	sub.w	d4,d1			;-minimale x
	lsr.w	#4,d1			;/16
	move.w	d1,d3			;x breedte (in words)
	add.w	d1,d0			;bltsize
	
	muls	#rot_wid,d5		;minimale y
	add.l	d5,a1			;+workplane

	lsr.l	#1,d5			;/2 (voor hi-res)
	muls	#rot_dpt,d5		;minimale y
	lsl.l	#1,d5			;*2


	add.l	d5,a2			;+destination scherm
	lsr.w	#4,d4			;/16 minimale x
	lsl.w	#1,d4			;*2 minimale x
	add.l	d4,a1			;+workplane
	add.l	d4,a2			;+destination scherm
	
	muls	#rot_wid,d2		;y hoogte
	lsl.w	#1,d3			;*2 x breedte
	sub.w	d3,d7			;module aftrekken
	add.l	d3,d2
	move.l	a1,a3			;workscherm bewaren
	add.l	d2,a1			;reverse fill add

	move.l	a1,$4c(a5)			;bltbpt
	move.l	a1,$54(a5)			;bltdpt
	move.w	d7,$62(a5)			;bltbmod
	move.w	d7,$66(a5)			;bltdmod
	move	#%0000010111001100,$40(a5)	;bltcon0
	move	#%0000000000010010,$42(a5)	;bltcon1
	move	d0,$58(a5)			;bltsiz
	bsr	rot.wblit			;wait for blit

	add.l	#2,a3			;reverse ?
	add.l	#2,a2			;reverse ?

	move.w	#$f00+$ca,$040(a5)	;bltcon0
	move.w	#0,$042(a5)		;bltcon1
	move.l	#-1,$044(a5)		;mask

	move.w	d7,d6
	add.w	#rot_wid*(rot_dpt-1),d6

	move.w	d6,$60(a5)		;bltcmod
	move.w	d7,$62(a5)		;bltbmod
	move.w	d7,$64(a5)		;bltamod
	move.w	d6,$66(a5)		;bltdmod

	move.w	a0,d6			;kleur halen

	move.l	a3,a4			;empty positie
	add.l	#rotplne-rotplnw,a4

	add.l	#rot_wid*(rot_dpt-1),a2
	move.w	#rot_dpt-1,d1
rotpolfil.a
	move.l	a3,d2
	btst	d1,d6			;kleurnbit test

;	beq	rotpolfil.bx		;doorschijnend

	bne.s	rotpolfil.c
	move.l	a4,d2			;solid
rotpolfil.c
	move.l	a2,$48(a5)		;bltcpt destination
	move.l	d2,$4c(a5)		;bltbpt picture
	move.l	a3,$50(a5)		;bltapt mask
	move.l	a2,$54(a5)		;bltdpt destination
	move.w	d0,$58(a5)
	bsr	rot.wblit		;work > view
rotpolfil.bx
	sub.l	#rot_wid,a2
	dbra	d1,rotpolfil.a

	move.w	#0,$074(a5)		;a dat
	move.l	#0,$044(a5)		;mask
	move.w	#$100+$f0,$040(a5)	;bltcon0
	move.w	d7,$66(a5)		;bltdmod

	move.l	a3,$054(a5)		;destination
	move.w	d0,$58(a5)
	bsr	rot.wblit		;clr work

	movem.l	(sp)+,d0-d7/a0-a6
	rts
	


rotgls					;solid lines
	movem.l	d0-d7/a0-a6,-(sp)

	bsr	line_init1		;eventueel tabel vullen

	move.l	curvec-rot(a6),a1
	add.l	4(a1),a1
	add.l	#vec_xyz,a1		;info overslaan

	move.w	(a1)+,d6		;aantal polies
	cmp.w	#-1,d6			;geen ?
	beq	rotgls.end
	
	lea	xy,a2
rotgls.a
	move.w	(a1)+,d7		;aantal lijnen
	move.w	(a1)+,a0		;kleur

	moveq.l	#0,d0
	moveq.l	#0,d1
	moveq.l	#0,d2
	moveq.l	#0,d3
	move.l	#$7fff,d4		;minimale x
	move.l	#$7fff,d5		;minimale y
	sub.l	a3,a3			;maximale x
	sub.l	a4,a4			;maximale y
rotgls.bx
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d0-d1		;x1,y1
	move.w	(a1)+,d2
	subq.w	#1,d2
	muls	#6,d2
	movem.w	(a2,d2.w),d2-d3		;x2,y2

	movem.l	d0-d7/a0-a6,-(sp)
	lea	mt,a0			;scherm breedte tabel

	cmp.w	d1,d3			;y1=y2 ?
	beq	rotgls.line.end
	bgt.s	rotgls.nohi
	exg	d0,d2
	exg	d1,d3
rotgls.nohi
	move	d0,d4
	move	d1,d5

	add	d5,d5
	add	d5,d5			;*4

	move.l	rotchp-rot(a6),a1
	add.l	#rotplnw-rotc,a1

	add.l	(a0,d5.w),a1		;y raw

	lsr	#4,d4			;*16
	add	d4,d4			;*2
	lea	(a1,d4.w),a1		;x raw

	sub.w	d0,d2
	sub.w	d1,d3

	moveq	#15,d5
	and.l	d5,d0
	move.w	d0,d4
	ror.l	#4,d0
	eor.w	d5,d4
	moveq	#0,d5
	bset	d4,d5
	move.w	#4,d0
	tst.w	d2
	bpl.s	rotgls.l1
	addq.w	#1,d0
	neg.w	d2
rotgls.l1
	cmp.w	d2,d3
	ble.s	rotgls.l2
	exg	d2,d3
	subq.w	#4,d0
	add.w	d0,d0
rotgls.l2
	move.w	d3,d4
	sub.w	d2,d4
	add.w	d4,d4
	add.w	d4,d4
	add.w	d3,d3
	moveq	#0,d6
	move.w	d3,d6
	sub.w	d2,d6
	bpl.s	rotgls.l3
	or.w	#16,d0
rotgls.l3
	add.w	d3,d3
	add.w	d0,d0
	add.w	d0,d0
	addq.w	#1,d2
	lsl.w	#6,d2
	addq.w	#2,d2
	swap	d3
	move.w	d4,d3
	or.l	#$0b5a0003,d0

rotgls.line.wblit1
	btst 	#6,$002(a5)
	bne.s 	rotgls.line.wblit1

	move.w	#-1,$72(a5)
	move.l	#-1,$44(a5)
	move.w	#rot_wid,$60(a5)
	move.w	#rot_wid,$66(a5)
	move.w	#$8000,$74(a5)

	eor.w	d5,(a1)			;inverteert onderste punt lijn

	move.l	d3,$62(a5)		;bltmod b+a
	move.w	d6,$52(a5)		;bltapth
	move.l	a1,$48(a5)		;bltcpt
	move.l	a1,$54(a5)		;bltdpt
	move.l	d0,$40(a5)		;bltcon 0+1

	move	d2,$58(a5)		;bltsiz

rotgls.line.end
	movem.l	(sp)+,d0-d7/a0-a6

	cmp.w	d4,d0			;minimale x halen
	bge.s	rotgls.ba
	move.w	d0,d4
rotgls.ba
	cmp.w	d4,d2
	bge.s	rotgls.bb
	move.w	d2,d4
rotgls.bb
	cmp.w	d5,d1			;minimale y halen
	bge.s	rotgls.bc
	move.w	d1,d5
rotgls.bc
	cmp.w	d5,d3
	bge.s	rotgls.bd
	move.w	d3,d5
rotgls.bd

	move.l	d6,-(sp)
	move.l	a3,d6
	cmp.w	d6,d0			;maximale x halen
	ble.s	rotgls.be
	move.w	d0,a3
rotgls.be
	cmp.w	d6,d2
	ble.s	rotgls.bf
	move.w	d2,a3
rotgls.bf

	move.l	a4,d6
	cmp.w	d6,d1			;maximale y halen
	ble.s	rotgls.bg
	move.w	d1,a4
rotgls.bg
	cmp.w	d6,d3
	ble.s	rotgls.bh
	move.w	d3,a4
rotgls.bh
	move.l	(sp)+,d6
	
	dbra	d7,rotgls.bx

	movem.l	d0-d7/a0-a6,-(sp)
	move.l	rotchp-rot(a6),a2
	add.l	#rotpln1-rotc,a2
	move.l	a2,a1
	add.l	#rotplnw-rotpln1,a1	;workplane
	add.l	real-rot(a6),a2		;get scherm 2


	move.w	#rot_wid,d7		;wordt modulo

	sub.w	#16,d4			;ruimte voor min x
	add.w	#16,a3			;ruimte voor max x

	add.w	#1,a4			;ruimte voor max y
	
	move.w	a4,d0			;maximale y
	sub.w	d5,d0			;-minimale y
	move.w	d0,d2			;y hoogte (in lijnen)
	lsl.w	#6,d0			;*64

	move.w	a3,d1			;maximale x
	sub.w	d4,d1			;-minimale x
	lsr.w	#4,d1			;/16
	move.w	d1,d3			;x breedte (in words)
	add.w	d1,d0			;bltsize
	
	muls	#rot_wid,d5		;minimale y
	add.l	d5,a1			;+workplane

	lsr.l	#1,d5			;/2 (voor hi-res)
	muls	#rot_dpt,d5		;minimale y
	lsl.l	#1,d5			;*2

	add.l	d5,a2			;+destination scherm
	lsr.w	#4,d4			;/16 minimale x
	lsl.w	#1,d4			;*2 minimale x
	add.l	d4,a1			;+workplane
	add.l	d4,a2			;+destination scherm
	
	muls	#rot_wid,d2		;y hoogte
	lsl.w	#1,d3			;*2 x breedte
	sub.w	d3,d7			;module aftrekken
	add.l	d3,d2
	move.l	a1,a3			;workscherm bewaren
	add.l	d2,a1			;reverse fill add

rotpolgls.wblit1
	btst 	#6,$002(a5)
	bne.s 	rotpolgls.wblit1

	move.l	a1,$4c(a5)			;bltbpt
	move.l	a1,$54(a5)			;bltdpt
	move.w	d7,$62(a5)			;bltbmod
	move.w	d7,$66(a5)			;bltdmod
	move	#%0000010111001100,$40(a5)	;bltcon0
	move	#%0000000000010010,$42(a5)	;bltcon1
	move	d0,$58(a5)			;bltsiz

	add.l	#2,a3			;reverse ?
	add.l	#2,a2			;reverse ?

rotpolgls.wblit5
	btst 	#6,$002(a5)
	bne.s 	rotpolgls.wblit5

	move.w	#$f00+$ca,$040(a5)	;bltcon0
	move.w	#0,$042(a5)		;bltcon1
	move.l	#-1,$044(a5)		;mask

	move.w	d7,d6
	add.w	#rot_wid*(rot_dpt-1),d6

	move.w	d6,$60(a5)		;bltcmod
	move.w	d7,$62(a5)		;bltbmod
	move.w	d7,$64(a5)		;bltamod
	move.w	d6,$66(a5)		;bltdmod

	move.w	a0,d6			;kleur halen

	move.l	a3,a4			;empty positie
	add.l	#rotplne-rotplnw,a4

	add.l	#rot_wid*(rot_dpt-1),a2
	move.w	#rot_dpt-1,d1
rotpolgls.a
	move.l	a3,d2
	btst	d1,d6			;kleurnbit test
	beq.s	rotpolgls.bx		;doorschijnend

rotpolgls.wblit3
	btst 	#6,$002(a5)
	bne.s 	rotpolgls.wblit3

	move.l	a2,$48(a5)		;bltcpt destination
	move.l	d2,$4c(a5)		;bltbpt picture
	move.l	a3,$50(a5)		;bltapt mask
	move.l	a2,$54(a5)		;bltdpt destination
	move.w	d0,$58(a5)
rotpolgls.bx
	sub.l	#rot_wid,a2
	dbra	d1,rotpolgls.a

rotpolgls.wblit4
	btst 	#6,$002(a5)
	bne.s 	rotpolgls.wblit4

	move.w	#0,$074(a5)		;a dat
	move.l	#0,$044(a5)		;mask
	move.w	#$100+$f0,$040(a5)	;bltcon0
	move.w	d7,$66(a5)		;bltdmod
	move.l	a3,$054(a5)		;destination
	move.w	d0,$58(a5)
	movem.l	(sp)+,d0-d7/a0-a6

	dbra	d6,rotgls.a

rotgls.end
	bsr	rot.wblit
	movem.l	(sp)+,d0-d7/a0-a6
	rts
	
rotpolgls				;d4/d5/a3/a4
	rts
	
line
	movem.l	d0-d7/a0-a6,-(sp)
	lea	mt,a0			;scherm breedte tabel

	cmp.w	d1,d3			;y1=y2 ?
	beq	line.end
	bgt.s	nohi
	exg	d0,d2
	exg	d1,d3
nohi
	move	d0,d4
	move	d1,d5

	add	d5,d5
	add	d5,d5			;*4

	move.l	rotchp-rot(a6),a1
	add.l	#rotplnw-rotc,a1

	add.l	(a0,d5.w),a1		;y raw

	lsr	#4,d4			;*16
	add	d4,d4			;*2
	lea	(a1,d4.w),a1		;x raw

	sub.w	d0,d2
	sub.w	d1,d3

	moveq	#15,d5
	and.l	d5,d0
	move.w	d0,d4
	ror.l	#4,d0
	eor.w	d5,d4
	moveq	#0,d5
	bset	d4,d5
	move.w	#4,d0
	tst.w	d2
	bpl.s	l1
	addq.w	#1,d0
	neg.w	d2
l1	cmp.w	d2,d3
	ble.s	l2
	exg	d2,d3
	subq.w	#4,d0
	add.w	d0,d0
l2	move.w	d3,d4
	sub.w	d2,d4
	add.w	d4,d4
	add.w	d4,d4
	add.w	d3,d3
	moveq	#0,d6
	move.w	d3,d6
	sub.w	d2,d6
	bpl.s	l3
	or.w	#16,d0
l3	add.w	d3,d3
	add.w	d0,d0
	add.w	d0,d0
	addq.w	#1,d2
	lsl.w	#6,d2
	addq.w	#2,d2
	swap	d3
	move.w	d4,d3
	or.l	#$0b5a0003,d0

;line.wblit1
;	btst 	#6,$002(a5)
;	bne 	line.wblit1

	move.w	#-1,$72(a5)
	move.l	#-1,$44(a5)
	move.w	#rot_wid,$60(a5)
	move.w	#rot_wid,$66(a5)
	move.w	#$8000,$74(a5)

	eor.w	d5,(a1)			;inverteert onderste punt lijn

	move.l	d3,$62(a5)		;bltmod b+a
	move.w	d6,$52(a5)		;bltapth
	move.l	a1,$48(a5)		;bltcpt
	move.l	a1,$54(a5)		;bltdpt
	move.l	d0,$40(a5)		;bltcon 0+1

	move	d2,$58(a5)		;bltsiz
	bsr	rot.wblit		;wait for blit

line.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

line_init1				;scherm breedte tabel
	movem.l	d0-d7/a0-a6,-(sp)
	lea	mt,a0			;vullen
	tst.l	4(a0)			;al gevuld ?
	bne.s	line_init1.end

	moveq	#0,d1
	move	#rot_hgt-1,d0
line_init1.a				;scherm breedte tabel
	move.l	d1,(a0)+
	add.l	#rot_wid,d1
	dbf	d0,line_init1.a
line_init1.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

;DRAWLINE-ROUTINE
;d0 = x1
;d1 = y1
;d2 = x2
;d3 = y2
;uses d0-d6

DRAWLINE:
	movem.l	d0-d7/a0-a6,-(sp)
	ifnd	nodraw

	move.l 	#rot_wid*rot_dpt,d4
	mulu 	d1,d4
	moveq 	#-$10,d5
	and.w 	d0,d5
	lsr.w 	#3,d5
	add.w 	d5,d4

	move.l	rotchp-rot(a6),a0
	add.l	#rotpln1-rotc,a0
	add.l	real-rot(a6),a0		;get scherm 2
	add.l 	a0,d4			;raw rotplanes
	
	moveq.l	#0,d5
	sub.w 	d1,d3
	roxl.b 	#1,d5  
	tst.w 	d3
	bge.s 	Y2GY1
	neg.w 	d3
Y2GY1:	sub.w 	d0,d2
	roxl.b 	#1,d5
	tst.w 	d2
	bge.s 	X2GX1
	neg.w 	d2
X2GX1:	move.w 	d3,d1			;d3=deltay	d1=d3
	sub.w 	d2,d1			;d2=deltax	d1=deltay
	bge.s 	DYGDX
	exg 	d2,d3
DYGDX:	roxl.b 	#1,d5
	move.b 	octtabel(pc,d5),d5
	add.w 	d2,d2			;2*Gdelta

	move.w 	d2,$0062(a5)		;d2	2*Gdelta
	sub.w 	d3,d2			;2*Gdelta-Kdelta
	bge.s 	SIGNNL			;Negative then...
	or.b 	#$40,d5			;Set bit 6(=64)  van octtant waarde
SIGNNL:	move.w 	d2,$0052(a5)		;2*Gdelta-Kdelta in BLTAPTL
	sub.w 	d3,d2			;2*Gdelta-2*Kdelta
	move.w 	d2,$0064(a5)		;in BLTAMOD

	move.w 	#$8000,$0074(a5)
	move.w 	#$ffff,$0072(a5)
	move.l 	#$ffffffff,$0044(a5)
	and.w 	#$000f,d0
	ror.w	#4,d0
	or.w 	#$0bca,d0
	move.w 	d0,$0040(a5)
	move.w 	d5,$0042(a5)
	move.l 	d4,$0048(a5)
	move.l 	d4,$0054(a5)
	move.w 	#rot_wid*rot_dpt,$0060(a5)
	move.w 	#rot_wid*rot_dpt,$0066(a5)
	addq.w	#1,d3
	lsl.w 	#6,d3
	addq.w 	#2,d3
	move.w 	d3,$0058(a5)
	bsr	rot.wblit
	endc
	movem.l	(sp)+,d0-d7/a0-a6
	rts

octtabel:
	dc.b	0*4+1
	dc.b 	4*4+1
	dc.b	2*4+1
	dc.b	5*4+1
	dc.b	1*4+1
	dc.b	6*4+1
	dc.b	3*4+1
	dc.b	7*4+1				



	ifd mx68882		;68882 routines by Roger Heykoop !


VECTOR:					;coordinaten bereken
;         6666   8888   8888   8888   2222
;        6      8    8 8    8 8    8      2
;        6      8    8 8    8 8    8      2
;        66666   8888   8888   8888   2222   optimized code
;        6    6 8    8 8    8 8    8 2
;        6    6 8    8 8    8 8    8 2
;         6666   8888   8888   8888   2222

	movem.l	d0-d7/a0-a6,-(sp)

	LEA	xy,A1			;resultaten

	move.l	curvec-rot(a6),a0
	add.l	#vec_xyz,a0		;info overslaan
	ifd	copperspeed
	move.w	#$f00,$dff180
	endc
Vec_jmp:
	Fmove.w	XROT-rot(a6),Fp6	;x rotatie in Fp0
	Fmove.w	YROT-rot(a6),Fp7	;y rotatie in Fp1
	Fmove.w	ZROT-rot(a6),Fp2	;z rotatie in Fp2
	
	Fdiv.x	#5.729577951E1,Fp6	;deelt rotatie door 360/2pi
	Fdiv.x	#5.729577951E1,Fp7	;en dus wordt het resultaat
	Fdiv.x	#5.729577951E1,Fp2	;tussen on en 2pi  !!!

	Fsin.x	Fp2,Fp4
	Fcos.x	Fp2,Fp5
	Fsin.x	Fp6,Fp0
	Fcos.x	Fp6,Fp1
	Fsin.x	Fp7,Fp2
	Fcos.x	Fp7,Fp3

	MOVE.W	(a0)+,D7		;aantal punten

VECS:
;Fp0/Fp1/Fp2 zijn de rotatie angles ax ay en az van 0 tot 2pi
;Het resultaat na roteren x' y' en z' is:
; X'= X(         cosay * cosaz) - Y(         cosay * sinaz) + Z(sinax)
; Y'= X( sinax * sinay * cosaz) + Y(-sinax * sinay * sinaz) + Y(cosax * cosaz) - Z(sinax * sinay)
; Z'= X(-cosax * sinay * cosaz) + X( sinax * sinaz) + Y(cosax * sinay * sinaz) + Y(sinax * cosaz) + Z(cosax*cosay)
;
;Vervang vervolgens:  sin ax  Fp0
;                     cos ax  Fp1
;                     sin ay  Fp2
;                     cos ay  Fp3
;                     sin az  Fp4
;                     cos az  Fp5
;
; X'= X(     Fp3*Fp5) -               Y(     Fp3*Fp4)              + Z(Fp0)
; Y'= X( Fp0*Fp2*Fp5) +               Y(-Fp0*Fp2*Fp4) + Y(Fp1*Fp5) - Z(Fp0*Fp2)
; Z'= X(-Fp1*Fp2*Fp5) + X( Fp0*Fp4) + Y( Fp1*Fp2*Fp4) + Y(Fp0*Fp5) + Z(Fp1*Fp3)
;
; X'= X*Fp3*Fp5                  - Y*Fp3*Fp4                  + Z*Fp0
; Y'= X*Fp0*Fp2*Fp5  +             Y*-Fp0*Fp2*Fp4 + Y*Fp1*Fp5 - Z*Fp0*Fp2
; Z'= X*-Fp1*Fp2*Fp5 + X*Fp0*Fp4 + Y*Fp1*Fp2*Fp4  + Y*Fp0*Fp5 + Z*Fp1*Fp3


        movem.w	(a0)+,d4/d5/d6	;Haal x,y en z uit geheugen...
				;1 memory access,spaart bergen tijd...

;input: d4/d5/d6  x,y,z
	Fmove.w	d4,Fp6		;haal x
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp3,Fp7
	Fmul.x	Fp5,Fp7
	Fmove.l	Fp7,d1		;x' deel 1...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp0,Fp7
	Fmul.x	Fp2,Fp7
	Fmul.x	Fp5,Fp7
	Fmove.l	Fp7,d2		;y' deel 1...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp1,Fp7
	Fmul.x	Fp2,Fp7
	Fmul.x	Fp5,Fp7
	Fmove.l	Fp7,d0
	move.l	d0,d3
	neg.l	d3		;z' deel 1a...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp0,Fp7
	Fmul.x	Fp4,Fp7
	Fmove.l	Fp7,d0
	add.l	d0,d3		;z' deel 1b...

	Fmove.w	d5,Fp6      	 ;haal y
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp3,Fp7
	Fmul.x	Fp4,Fp7
	Fmove.l	Fp7,d0
	sub.l	d0,d1		;x' deel 2...
        Fmove.x	Fp6,Fp7
	Fmul.x	Fp0,Fp7
	Fmul.x	Fp2,Fp7
	Fmul.x	Fp4,Fp7
	Fmove.l	Fp7,d0
	sub.l	d0,d2		;y' deel 2a...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp1,Fp7
	Fmul.x	Fp5,Fp7
	Fmove.l	Fp7,d0
	add.l	d0,d2		;y' deel 2b...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp1,Fp7
	Fmul.x	Fp2,Fp7
	Fmul.x	Fp4,Fp7
        Fmove.l	Fp7,d0
	add.l	d0,d3		;z' deel 2a...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp0,Fp7
	Fmul.x	Fp5,Fp7
        Fmove.l	Fp7,d0
	add.l	d0,d3		;z' deel 2b...

	Fmove.w	d6,Fp6		;haal z
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp0,Fp7
	Fmove.l	Fp7,d0
	add.l   d0,d1		;x' deel 3...
	Fmove.x	Fp6,Fp7
        Fmul.x	Fp0,Fp7
	Fmul.x	Fp3,Fp7
	Fmove.l	Fp7,d0
	sub.l	d0,d2		;y' deel 3...
	Fmove.x	Fp6,Fp7
	Fmul.x	Fp1,Fp7
	Fmul.x	Fp3,Fp7
	Fmove.l	Fp7,d0
	add.l	d0,d3		;z' deel 3...

;nu: d1/d2/d3 bevat x'y'z'...


	move.w	d3,d4
	add.w	ZV-rot(a6),d4		;z ball
	sub.w	ZV-rot(a6),D3		;z centrum
	move.w	drot-rot(a6),d0		;grote wereld
	muls	d0,D1			;muls !
	divs	D3,D1			;divs !
	add.W	XV-rot(a6),D1		;x centrum
	muls	d0,D2			;muls !
	divs	D3,D2			;divs !
	add.w	YV-rot(a6),D2		;y centrum

	muls	d0,D4			;muls ! z ball

	ifeq	rot_hgt-384
	lsr.l	#8,d4			;/256
	lsr.l	#3,d4			;/2
	move.w	d4,d3
	lsr.w	#1,d4			;/2
	add.w	d3,d4
	endc

	ifeq	rot_hgt-(384*2)		;/6144
	lsr.l	#8,d4			;/256
	lsr.l	#4,d4			;/4
	move.w	d4,d3
	lsr.w	#1,d4			;/2
	add.w	d3,d4
	endc

 	movem.w d1/d2/d4,(a1)
 	add.l	#3*2,a1

;	lea	2(a0),a0
	add.l	#2,a0			;kleur
	Dbra	D7,VECS                 ;Ah! A loop...Are the caches
					;on mr. Zulu? Warp factor 9,sir!

	ifd	copperspeed
	move.w	#$000,$dff180
	endc
	movem.l	(sp)+,d0-d7/a0-a6
	RTS

	endc
	ifnd mx68882

VECTOR:					;coordinaten bereken
	movem.l	d0-d7/a0-a6,-(sp)

	LEA	xy,A1
	LEA	SINCOS+$5a,A2

	ifd	copperspeed
	move.w	#$f00,$dff180
	endc

	move.l	curvec-rot(a6),a0
	add.l	#vec_xyz,a0		;info overslaan

	MOVE.W	(a0)+,D7		;aantal punten

VECS:
	MOVE.W	(A0)+,D0		;x
	MOVE.W	D0,D2			;

	MOVE.W	(A0)+,D1		;y
	MOVE.W	D1,D3			;
	MOVE.W	ZROT-rot(a6),D6		;
	MOVE.W	$5a(A2,D6.W),D4		;
	MOVE.W	-$5a(A2,D6.W),D5	;
	MULS.W	D4,D0			;
	MULS.W	D5,D1			;
	SUB.L	D1,D0			;
	ADD.L	D0,D0			;
	SWAP	D0			;
	MULS.W	D5,D2			;muls !
	MULS.W	D4,D3			;muls !
	ADD.L	D3,D2			;
	ADD.L	D2,D2
	SWAP	D2			;
	MOVE.W	D2,D4			;

	MOVE.W	(A0)+,D1		;z
	MOVE.W	D1,D3			;

	MOVE.W	XROT-rot(a6),D6		;x-rot
	MOVE.W	$5a(A2,D6.W),D5		;
	MOVE.W	-$5a(A2,D6.W),D6	;
	MULS.W	D5,D2			;muls !
	MULS.W	D6,D1			;muls !

	SUB.L	D1,D2			;
	ADD.L	D2,D2
	SWAP	D2			;
	MULS.W	D5,D3			;muls !
	MULS.W	D6,D4			;muls !
	ADD.L	D4,D3			;
	ADD.L	D3,D3			
	SWAP	D3			;
	MOVE.W	D0,D1			;
	MOVE.W	D3,D4			;

	MOVE.W	YROT-rot(a6),D6		;y-rot
	MOVE.W	$5a(A2,D6.W),D5		;
	MOVE.W	-$5a(A2,D6.W),D6	;
	MULS.W	D5,D3			;
	MULS.W	D6,D0			;
	SUB.L	D0,D3			;
	ADD.L	D3,D3
	SWAP	D3			;
	MULS.W	D6,D4			;muls !
	MULS.W	D5,D1			;muls !
	ADD.L	D4,D1			;
	ADD.L	D1,D1
	SWAP	D1			;d1=x d2=y d3=z  na rotatie

	move.w	d3,d4
	add.W	ZV-rot(a6),d4		;z ball

	SUB.W	ZV-rot(a6),D3		;z centrum

	move.w	DROT-rot(a6),d0		;grote wereld
	MULS	d0,D1			;muls !
	DIVS	D3,D1			;divs !

	ADD.W	XV-rot(a6),D1		;x centrum
	MULS	d0,D2			;muls !
	DIVS	D3,D2			;divs !

	ADD.W	YV-rot(a6),D2		;y centrum

	MOVE.W	D1,(A1)+		;x
	MOVE.W	D2,(A1)+		;y

	MULS	d0,D4			;muls ! z ball

;	divs	#rot_hgt*20,d4		;divs !

	ifeq	rot_hgt-384
	lsr.l	#8,d4			;/256
	lsr.l	#3,d4			;/2
	move.w	d4,d3	
	lsr.w	#1,d4			;/2
	add.w	d3,d4
	endc

	ifeq	rot_hgt-(384*2)		;/6144
	lsr.l	#8,d4			;/256
	lsr.l	#4,d4			;/4
	move.w	d4,d3
	lsr.w	#1,d4			;/2
	add.w	d3,d4
	endc
		
	MOVE.W	d4,(A1)+		;z

	lea	2(a0),a0
;	add.l	#2,a0			;kleur
	Dbra	D7,VECS

	ifd	copperspeed
	move.w	#$000,$dff180
	endc

vector.end
	movem.l	(sp)+,d0-d7/a0-a6
	RTS	

	endc

;rot.baldat	ds.l	64*3*4


rotchp	dc.l	0

curvec	dc.l	0
rotpal	dc.l	0
real:	dc.l	0

XROT:	dc.w	0			;aantal graden te roteren om X-as	
YROT:	dc.w	0			;aantal graden om Y-as
ZROT:	dc.w	0			;aantal om Z-as
DROT:	dc.w	0

XV:	dc.w	(rot_wid+rot_cen)*4;	;centrum xcoord
YV:	dc.w	(rot_hgt/2)		;ycoord

ZV:	dc.w	780			;zcoord

xadd	dc.w	0
yadd	dc.w	0
zadd	dc.w	0
dadd	dc.w	0
dway	dc.w	0

bufmod	dc.b	0
clrmod	dc.b	0

	cnop	0,2
	ifnd mx68882
SINCOS:
  dc.w	 0,571,1143,1714,2285,2855,3425,3993
  dc.w	 4560,5125,5689,6252,6812,7370,7927,8480
  dc.w	 9031,9580,10125,10667,11206,11742,12274,12803
  dc.w	 13327,13847,14364,14875,15383,15885,16383,16876
  dc.w	 17363,17846,18323,18794,19259,19719,20173,20620
  dc.w	 21062,21497,21925,22347,22761,23169,23570,23964
  dc.w	 24350,24729,25100,25464,25820,26168,26509,26841
  dc.w	 27165,27480,27788,28086,28377,28658,28931,29195
  dc.w	 29450,29696,29934,30162,30381,30590,30790,30981
  dc.w	 31163,31335,31497,31650,31793,31927,32050,32164
  dc.w	 32269,32363,32448,32522,32587,32642,32687,32722
  dc.w	 32747,32762,32767,32762,32747,32722,32687,32642
  dc.w	 32587,32522,32448,32363,32269,32164,32050,31927
  dc.w	 31793,31650,31497,31335,31163,30981,30790,30590

  dc.w	 30381,30162,29934,29696,29450,29195,28931,28658
  dc.w	 28377,28086,27787,27480,27165,26841,26509,26168
  dc.w	 25820,25464,25100,24729,24350,23964,23570,23169
  dc.w	 22761,22347,21925,21497,21062,20620,20173,19719
  dc.w	 19259,18794,18323,17846,17363,16876,16383,15885
  dc.w	 15383,14875,14364,13848,13327,12803,12274,11742
  dc.w	 11207,10667,10125,9580,9031,8480,7927,7371
  dc.w	 6812,6252,5690,5126,4560,3993,3425,2855
  dc.w	 2285,1715,1143,572,0
  dc.w	-571,-1143,-1714
  dc.w	-2285,-2855,-3424,-3993,-4560,-5125,-5689,-6252
  dc.w	-6812,-7370,-7926,-8480,-9031,-9579,-10125,-10667
  dc.w	-11206,-11742,-12274,-12802,-13327,-13847,-14363,-14875
  dc.w	-15382,-15885,-16383,-16876,-17363,-17845,-18322,-18794
  dc.w	-19259,-19719,-20173,-20620,-21062,-21496,-21925,-22346
  dc.w	-22761,-23169,-23570,-23964,-24350,-24729,-25100,-25464
  dc.w	-25820,-26168,-26508,-26840,-27164,-27480,-27787,-28086
  dc.w	-28376,-28658,-28931,-29195,-29450,-29696,-29933,-30162
  dc.w	-30380,-30590,-30790,-30981,-31163,-31335,-31497,-31650
  dc.w	-31793,-31927,-32050,-32164,-32269,-32363,-32448,-32522
  dc.w	-32587,-32642,-32687,-32722,-32747,-32762,-32767,-32762
  dc.w	-32747,-32722,-32687,-32642,-32587,-32522,-32448,-32363
  dc.w	-32269,-32165,-32051,-31927,-31793,-31650,-31497,-31335
  dc.w	-31163,-30981,-30791,-30590,-30381,-30162,-29934,-29697
  dc.w	-29451,-29195,-28931,-28658,-28377,-28087,-27788,-27481
  dc.w	-27165,-26841,-26509,-26169,-25821,-25465,-25101,-24729
  dc.w	-24351,-23964,-23571,-23170,-22762,-22347,-21925,-21497
  dc.w	-21062,-20621,-20173,-19720,-19260,-18794,-18323,-17846
  dc.w	-17364,-16876,-16384,-15886,-15383,-14876,-14364,-13848
  dc.w	-13328,-12803,-12275,-11743,-11207,-10668,-10126,-9580
  dc.w	-9032,-8481,-7927,-7371,-6813,-6252,-5690,-5126
  dc.w	-4560,-3994,-3425,-2856,-2286,-1715,-1144,-572
  dc.w	 0,571,1142,1714,2284,2855,3424,3992
  dc.w	 4559,5125,5689,6251,6811,7370,7926,8479
  dc.w	 9031,9579,10124,10667,11206,11741,12273,12802
  dc.w	 13326,13847,14363,14875,15382,15885,16382,16875
  dc.w	 17363,17845,18322,18793,19259,19718,20172,20620
  dc.w	 21061,21496,21924,22346,22761,23169,23569,23963
  dc.w	 24350,24728,25100,25464,25820,26168,26508,26840
  dc.w	 27164,27480,27787,28086,28376,28658,28931,29195
  dc.w	 29450,29696,29933,30161,30380,30590,30790,30981
  dc.w	 31162,31334,31497,31650,31793,31926,32050,32164
  dc.w	 32269,32363,32447,32522,32587,32642,32687,32722
  dc.w	 32747,32761,32767
	endc

rotbaltab	ds.l	64

xy		ds.l	2*1024		;x/y/z coordinaten
rotdontab	ds.l	2*1024		;is getekend tabel
mt		ds.l	rot_hgt		;mulutable (faster)

;pic_wid	equ	4		;wide in bytes
;pic_hgt	equ	6		;hoogte
;pic_dpt	equ	8		;number planes
;pic_ani	equ	10		;aantal effes (anim)
;pic_vew	equ	12		;viewmode
;pic_cycstr	equ	14		;cycle start (*4)
;pic_cycend	equ	15		;cycle end (*4)
;pic_cycspd	equ	16		;cycle speed (*4)
;pic_cycadd	equ	17		;cycle add (*4)
;pic_palnum	equ	30		;aantal kleuren
;pic_pal	equ	32		;palette start
;pic_palsiz	equ	256*2		;vaste palette size
;pic_raw	equ	pic_pal+pic_palsiz	;palette start

rotp.e

	SECTION	4,CODE_c
	cnop	0,8
rotc
	ifnd	ocs
	dc.l	'ROTA'			;effect-longword-ID
	endc
	
	ifd	ocs
	dc.l	'ROTO'			;effect-longword-ID
	endc
	rts
	cnop	0,8



	;copperlijst in geval van vectorshade

	ifd	shade
rotcop
	dc.w	$0080,$0000,$0082,$0000	;vt-copper terugspring-adres

	dc.w	$00e4,$0000,$00e6,$0000
	dc.w	$00e8,$0000,$00ea,$0000
	dc.w	$00ec,$0000,$00ee,$0000
	dc.w	$00f0,$0000,$00f2,$0000

	dc.w	$0100,$5000
	dc.w	$0108,rot_wid-vew_wid
	dc.w	$010a,rot_wid-vew_wid

	dc.w	$0088,$0000		;terug naar vt-copper
	dc.w	$ffff,$fffe
	endc
		
	;dit zijn de picture-tabellen, 2 voor double buffer
	;of 6 voor vectorshade

	cnop	0,8
rotpic1
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew

	ifd	ocs
	ds.b	4*4
	endc
	ifnd	ocs
	ds.b	8*4+16
	endc

	ifeq	1-rot_dpt
	ifnd	shade
	dc.w	2-1
rotpal1
	ifd	ocs
	dc.w	$000,$fff
	ds.w	256-2
	endc
	ifnd	ocs
	dc.w	$000,0,$fff,0
	ds.l	256-2
	endc
	endc

	ifd	shade
	dc.w	32-1
rotpal1
	ifd	ocs
	dc.w	$000,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$333,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$333,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	ds.l	256-32
	endc
	endc
	endc
	
	ifeq	2-rot_dpt
	dc.w	4-1
rotpal1
	ifd	ocs
	dc.w	$000,$f0f,$0ff,$fff
	ds.w	256-4
	endc
	ifnd	ocs
	dc.w	$000,0,$f0f,0,$0ff,0,$fff,0
	ds.l	256-4
	endc
	endc
	
	ifeq	3-rot_dpt
	dc.w	8-1
rotpal1
	ifd	ocs
	dc.w	$000,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$fff
	ds.w	256-8
	endc
	ifnd	ocs
	dc.w	$000,0,$f00,0,$0f0,0,$ff0,0,$00f,0,$f0f,0,$0ff,0,$fff,0
	ds.l	256-8
	endc
	endc
	
	ifeq	4-rot_dpt
	dc.w	16-1
rotpal1
	ifd	ocs
	dc.w	$000,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$fff
	dc.w	$555,$f55,$5f5,$ff5,$55f,$f5f,$5ff,$fff
	ds.w	256-16
	endc
	ifnd	ocs
	dc.w	$000,0,$f00,0,$0f0,0,$ff0,0,$00f,0,$f0f,0,$0ff,0,$fff,0
	dc.w	$555,0,$f55,0,$5f5,0,$ff5,0,$55f,0,$f5f,0,$5ff,0,$fff,0
	ds.l	256-16
	endc
	endc
	
	ifeq	5-rot_dpt
	dc.w	32-1
rotpal1
	ifd	ocs
	dc.w	$000,$111,$222,$333,$444,$555,$666,$777
	dc.w	$888,$999,$aaa,$bbb,$ccc,$ddd,$eee,$fff
	dc.w	$00,$11,$22,$33,$44,$55,$66,$77
	dc.w	$88,$99,$aa,$bb,$cc,$dd,$ee,$ff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$111,0,$222,0,$333,0,$444,0,$555,0,$666,0,$777,0
	dc.w	$888,0,$999,0,$aaa,0,$bbb,0,$ccc,0,$ddd,0,$eee,0,$fff,0
	dc.w	$00,0,$11,0,$22,0,$33,0,$44,0,$55,0,$66,0,$77,0
	dc.w	$88,0,$99,0,$aa,0,$bb,0,$cc,0,$dd,0,$ee,0,$ff,0
	ds.l	256-32
	endc
	endc
	
	ifeq	6-rot_dpt
	dc.w	32-1
rotpal1
	ifd	ocs
	dc.w	$000,$111,$222,$333,$444,$555,$666,$777
	dc.w	$888,$999,$aaa,$bbb,$ccc,$ddd,$eee,$fff
	dc.w	$00,$11,$22,$33,$44,$55,$66,$77
	dc.w	$88,$99,$aa,$bb,$cc,$dd,$ee,$ff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$111,0,$222,0,$333,0,$444,0,$555,0,$666,0,$777,0
	dc.w	$888,0,$999,0,$aaa,0,$bbb,0,$ccc,0,$ddd,0,$eee,0,$fff,0
	dc.w	$00,0,$11,0,$22,0,$33,0,$44,0,$55,0,$66,0,$77,0
	dc.w	$88,0,$99,0,$aa,0,$bb,0,$cc,0,$dd,0,$ee,0,$ff,0
	ds.l	256-32
	endc
	endc
	
rotpln1
	ds.b	rot_wid*rot_hgt*rot_dpt

	cnop	0,8
rotpic2
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew

	ifd	ocs
	ds.b	4*4
	endc
	ifnd	ocs
	ds.b	8*4+16
	endc

	ifeq	1-rot_dpt
	ifnd	shade
	dc.w	2-1
rotpal2
	ifd	ocs
	dc.w	$000,$fff
	ds.w	256-2
	endc
	ifnd	ocs
	dc.w	$000,0,$fff,0
	ds.l	256-2
	endc
	endc

	ifd	shade
	dc.w	32-1
rotpal2
	ifd	ocs
	dc.w	$000,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$333,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$333,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	ds.l	256-32
	endc
	endc
	endc
	
	ifeq	2-rot_dpt
	dc.w	4-1
rotpal2
	ifd	ocs
	dc.w	$000,$f0f,$0ff,$fff
	ds.w	256-4
	endc
	ifnd	ocs
	dc.w	$000,0,$f0f,0,$0ff,0,$fff,0
	ds.l	256-4
	endc
	endc
	
	ifeq	3-rot_dpt
	dc.w	8-1
rotpal2
	ifd	ocs
	dc.w	$000,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$fff
	ds.w	256-8
	endc
	ifnd	ocs
	dc.w	$000,0,$f00,0,$0f0,0,$ff0,0,$00f,0,$f0f,0,$0ff,0,$fff,0
	ds.l	256-8
	endc
	endc
	
	ifeq	4-rot_dpt
	dc.w	16-1
rotpal2
	ifd	ocs
	dc.w	$000,$f00,$0f0,$ff0,$00f,$f0f,$0ff,$fff
	dc.w	$555,$f55,$5f5,$ff5,$55f,$f5f,$5ff,$fff
	ds.w	256-16
	endc
	ifnd	ocs
	dc.w	$000,0,$f00,0,$0f0,0,$ff0,0,$00f,0,$f0f,0,$0ff,0,$fff,0
	dc.w	$555,0,$f55,0,$5f5,0,$ff5,0,$55f,0,$f5f,0,$5ff,0,$fff,0
	ds.l	256-16
	endc
	endc
	
	ifeq	5-rot_dpt
	dc.w	32-1
rotpal2
	ifd	ocs
	dc.w	$000,$111,$222,$333,$444,$555,$666,$777
	dc.w	$888,$999,$aaa,$bbb,$ccc,$ddd,$eee,$fff
	dc.w	$00,$11,$22,$33,$44,$55,$66,$77
	dc.w	$88,$99,$aa,$bb,$cc,$dd,$ee,$ff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$111,0,$222,0,$333,0,$444,0,$555,0,$666,0,$777,0
	dc.w	$888,0,$999,0,$aaa,0,$bbb,0,$ccc,0,$ddd,0,$eee,0,$fff,0
	dc.w	$00,0,$11,0,$22,0,$33,0,$44,0,$55,0,$66,0,$77,0
	dc.w	$88,0,$99,0,$aa,0,$bb,0,$cc,0,$dd,0,$ee,0,$ff,0
	ds.l	256-32
	endc
	endc
	
	ifeq	6-rot_dpt
	dc.w	32-1
rotpal2
	ifd	ocs
	dc.w	$000,$111,$222,$333,$444,$555,$666,$777
	dc.w	$888,$999,$aaa,$bbb,$ccc,$ddd,$eee,$fff
	dc.w	$00,$11,$22,$33,$44,$55,$66,$77
	dc.w	$88,$99,$aa,$bb,$cc,$dd,$ee,$ff
	ds.w	256-32
	endc
	ifnd	ocs
	dc.w	$000,0,$111,0,$222,0,$333,0,$444,0,$555,0,$666,0,$777,0
	dc.w	$888,0,$999,0,$aaa,0,$bbb,0,$ccc,0,$ddd,0,$eee,0,$fff,0
	dc.w	$00,0,$11,0,$22,0,$33,0,$44,0,$55,0,$66,0,$77,0
	dc.w	$88,0,$99,0,$aa,0,$bb,0,$cc,0,$dd,0,$ee,0,$ff,0
	ds.l	256-32
	endc
	endc
	
rotpln2
	ds.b	rot_wid*rot_hgt*rot_dpt


	ifd	shade
	rept	4
	ifd	ocs
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew
	ds.b	4*4
	dc.w	32-1
	dc.w	$000,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$333,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	dc.w	$666,$fff,$ccc,$fff,$999,$fff,$ccc,$fff
	ds.w	256-32
	ds.b	rot_wid*rot_hgt*rot_dpt
	endc
	ifnd	ocs
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew
	ds.b	8*4+16
	dc.w	32-1
	dc.w	$000,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$333,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	dc.w	$666,0,$fff,0,$ccc,0,$fff,0,$999,0,$fff,0,$ccc,0,$fff,0
	ds.l	256-32
	ds.b	rot_wid*rot_hgt*rot_dpt
	endc
	endr
	endc

rotpic_l	equ	rotpic2-rotpic1
rotinf_l	equ	rotpln1-rotpic1

;	Section	plane,data_c	
	cnop	0,8
rotplnw
	ds.b	rot_wid*rot_hgt	;work bitplane (filled vectors)
	cnop	0,8
rotplne
	ds.b	rot_wid*rot_hgt	;empty bitplane (filled vectors)

rotc.e
rot.e

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

;and here are the incbin-files....

		ifd	rout
		cnop	0,2
		Section	Data,Data		;32-bits fast-mem !
rottube
		ifd	ocs
		incbin	'w:Effect/Tube.vec'
		endc
		ifnd	ocs
		incbin	'w:EffectAGA/Tube.rotobj'
		endc
		endc
		

