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.


routinemode	equ	64+16	;the routinemode !


; 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+,w-

	ifd	rout
	
	;videotracker routine-test

	incdir	"ram:include/"
	include	"exec/types.i"
	include	"graphics/gfxbase.i"
	include	"lvo/graphics_lib.i"
	incdir	'ram:'

vew_wid	equ	44
vew_hgt	equ	290
win_hgt	equ	117
win_str	equ	$1a

	SECTION	1,CODE_C
tus
	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

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

	move.l	(4).w,a6		;68030 cache off 
	jsr	-120(a6)

	btst.b	#1,297(a6)
	beq.s	str.nfc
	lea.l	str.ft,a5
	jsr	-30(a6)
str.nfc
	jsr	-126(a6)
	bra.s	str.fc
	
str.ft
	dc.w	$4e7a,2
	bclr	#0,d0
	bset	#13,d0
	dc.w	$4e7b,2
	rte
str.fc

	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
	blt	copbuf.novb

	cmp.b	#50,ntscmode
	beq.s	copbuf.pal
	cmp.w	#$133-56-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

	move.w	00*4+2(a0),00*4+2(a1)
	move.w	01*4+2(a0),01*4+2(a1)
	move.w	02*4+2(a0),02*4+2(a1)
	move.w	03*4+2(a0),03*4+2(a1)
	move.w	04*4+2(a0),04*4+2(a1)
	move.w	05*4+2(a0),05*4+2(a1)
	move.w	06*4+2(a0),06*4+2(a1)
	move.w	07*4+2(a0),07*4+2(a1)
	move.w	08*4+2(a0),08*4+2(a1)
	move.w	09*4+2(a0),09*4+2(a1)

	move.w	10*4+2(a0),10*4+2(a1)
	move.w	11*4+2(a0),11*4+2(a1)
	move.w	12*4+2(a0),12*4+2(a1)
	move.w	13*4+2(a0),13*4+2(a1)
	move.w	14*4+2(a0),14*4+2(a1)
	move.w	15*4+2(a0),15*4+2(a1)
	move.w	16*4+2(a0),16*4+2(a1)
	move.w	17*4+2(a0),17*4+2(a1)
	move.w	18*4+2(a0),18*4+2(a1)
	move.w	19*4+2(a0),19*4+2(a1)

	move.w	20*4+2(a0),20*4+2(a1)
	move.w	21*4+2(a0),21*4+2(a1)
	move.w	22*4+2(a0),22*4+2(a1)
	move.w	23*4+2(a0),23*4+2(a1)
	move.w	24*4+2(a0),24*4+2(a1)
	move.w	25*4+2(a0),25*4+2(a1)
	move.w	26*4+2(a0),26*4+2(a1)
	move.w	27*4+2(a0),27*4+2(a1)
	move.w	28*4+2(a0),28*4+2(a1)
	move.w	29*4+2(a0),29*4+2(a1)

	move.w	30*4+2(a0),30*4+2(a1)
	move.w	31*4+2(a0),31*4+2(a1)
	move.w	32*4+2(a0),32*4+2(a1)
	move.w	33*4+2(a0),33*4+2(a1)
	move.w	34*4+2(a0),34*4+2(a1)
	move.w	35*4+2(a0),35*4+2(a1)
	move.w	36*4+2(a0),36*4+2(a1)
	move.w	37*4+2(a0),37*4+2(a1)
	move.w	38*4+2(a0),38*4+2(a1)
	move.w	39*4+2(a0),39*4+2(a1)

	move.w	40*4+2(a0),40*4+2(a1)
	move.w	41*4+2(a0),41*4+2(a1)
	move.w	42*4+2(a0),42*4+2(a1)
	move.w	43*4+2(a0),43*4+2(a1)
	move.w	44*4+2(a0),44*4+2(a1)
	move.w	45*4+2(a0),45*4+2(a1)
	move.w	46*4+2(a0),46*4+2(a1)
	move.w	47*4+2(a0),47*4+2(a1)
	move.w	48*4+2(a0),48*4+2(a1)
	move.w	49*4+2(a0),49*4+2(a1)

	move.w	50*4+2(a0),50*4+2(a1)
	move.w	51*4+2(a0),51*4+2(a1)
	move.w	52*4+2(a0),52*4+2(a1)
	move.w	53*4+2(a0),53*4+2(a1)
	move.w	54*4+2(a0),54*4+2(a1)

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)
	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.l	#rotinc,var_lnd(a0)	;incbinfile !!!

	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

	;picture-to-copper routine, communicates with the
	;anim-player
	
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	#$71,d6

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

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

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

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

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

	cmp.w	#80*2,pic_wid(a2)	;overscan ?
	ble.s	grap.noshi2
	move.l	#(vew_wid)*8*4,d0
	move.l	#$61,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
grap.nohi5
	btst	#6,d6			;super hires ?
	beq.s	grap.noshi5	
	add.l	d4,d4			;*4
grap.noshi5

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

	btst	#15,d6			;hires ?
	beq.s	grap.nohi3	
	move.l	#9,d0
	move.l	#2,d1
	move.l	#2,d7
grap.nohi3
	btst	#6,d6			;super hires ?
	beq.s	grap.noshi3	
	move.l	#9,d0
	move.l	#2,d1
	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	currot2,a5		;oneven plane
	clr.l	curpic2			;mischien niet goed
	clr.l	curpal2			;mischien niet goed
	clr.l	currot2			;mischien niet goed

	cmp.l	curpic1,a3		;picture hetzelfde ?
	beq	grap.nopic2
	
	cmp.l	#0,currot1		;routine ?	
	beq.s	grap.norot
	cmp.l	currot1,a5		;routine hetzelfde ?
	beq	grap.nopic2
grap.norot

	cmp.b	#3,d2			;> 8 kleuren ?
	bgt	grap.nopic2
	move.w	pic_dpt(a3),d3		;plnnummer 2 halen
	cmp.b	d2,d3			;gelijke plnummers ?
	bne	grap.nopic2
	move.w	pic_vew(a2),d1
	cmp.w	pic_vew(a3),d1		;view gelijk ?
	bne	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
	move.l	a3,curpal2
	move.l	a5,currot2

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

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

	move.w	2(a4),d1		;bplcon0
	btst	#10,d1			;al double 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)

	bra.s	grap.tb
grap.ta
	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	#8-1,d1
grap.pal
	move.w	(a3)+,14(a3)
	dbra	d1,grap.pal

grap.nocop
	add.w	d3,d2
	lsl.w	#8,d2
	lsl.w	#4,d2
	or.w	#$400,d2
	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 double playfield
	lsl.w	#8,d2
	lsl.w	#4,d2
	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
	or.l	#$300,d2		;genlock info
	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
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.s	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
grappln.end
	movem.l	(sp)+,d0-d7/a0-a6
	rts

	;sets palettes to copper
	
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	#8*2+palette,a1
	bsr.s	gracfrm
	
	bsr.s	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

	cmp.w	#32-1,d0		;niet meer dan 32 kleuren
	ble	gracfrm.sub
	move.w	#32-1,d0
gracfrm.sub

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

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

	move.l	curpic1,a2		;current raw
	cmp.l	#0,a2
	beq.s	palctr.qb
	lea	cycdel1,a3		;cycle delays
	move.l	#palette,a4
	bsr	palcyc
palctr.qb
	move.l	curpic2,a2		;current raw
	cmp.l	#0,a2
	beq.s	palctr.c
	lea	cycdel2,a3		;cycle delays
	move.l	#8*2+palette,a4
	bsr	palcyc

palctr.c
	lea	gracprcol,a1
	move.l	#palette,a0

	move.w	00(a0),00*4+2(a1)
	move.w	02(a0),01*4+2(a1)
	move.w	04(a0),02*4+2(a1)
	move.w	06(a0),03*4+2(a1)
	move.w	08(a0),04*4+2(a1)
	move.w	10(a0),05*4+2(a1)
	move.w	12(a0),06*4+2(a1)
	move.w	14(a0),07*4+2(a1)
	move.w	16(a0),08*4+2(a1)
	move.w	18(a0),09*4+2(a1)

	move.w	20(a0),10*4+2(a1)
	move.w	22(a0),11*4+2(a1)
	move.w	24(a0),12*4+2(a1)
	move.w	26(a0),13*4+2(a1)
	move.w	28(a0),14*4+2(a1)
	move.w	30(a0),15*4+2(a1)
	move.w	32(a0),16*4+2(a1)
	move.w	34(a0),17*4+2(a1)
	move.w	36(a0),18*4+2(a1)
	move.w	38(a0),19*4+2(a1)

	move.w	40(a0),20*4+2(a1)
	move.w	42(a0),21*4+2(a1)
	move.w	44(a0),22*4+2(a1)
	move.w	46(a0),23*4+2(a1)
	move.w	48(a0),24*4+2(a1)
	move.w	50(a0),25*4+2(a1)
	move.w	52(a0),26*4+2(a1)
	move.w	54(a0),27*4+2(a1)
	move.w	56(a0),28*4+2(a1)
	move.w	58(a0),29*4+2(a1)

	move.w	60(a0),30*4+2(a1)
	move.w	62(a0),31*4+2(a1)

	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	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	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
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
	
;ownblit	dc.b	0
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
gracprscr
	dc.w	$8e,$3381,$90,$81c1,$92,$003c,$94,$00d0
gracprbpl
	dc.w	$100,$9000,$102,$0000,$104,$0020
	dc.w	$108,$0000,$10a,$0000
gracprpln
	dc.w	$e0,$0000,$e2,$0000
	dc.w	$e4,$0000,$e6,$0000
	dc.w	$e8,$0000,$ea,$0000
	dc.w	$ec,$0000,$ee,$0000
	dc.w	$f0,$0000,$f2,$0000
	dc.w	$f4,$0000,$f6,$0000
gracprcol
	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
cprjmp
	dc.w	$080,0,$082,0
gra.e
gra.ql	equ	gra.e-gra.s		;block lengte


cpr
	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
	dc.w	$e0,$0000,$e2,$0000
	dc.w	$e4,$0000,$e6,$0000
	dc.w	$e8,$0000,$ea,$0000
	dc.w	$ec,$0000,$ee,$0000
	dc.w	$f0,$0000,$f2,$0000
	dc.w	$f4,$0000,$f6,$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	$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


prf_pat	equ	7			;pref sample size
prf_patnum	equ	128		;aantal songpos's
prf_len	equ	((prf_pat*prf_patnum)+1)

prf_pos	equ	0			;eff position (teller)

prf_effs	equ	1		;start effect (*prf_patnum)
prf_effe	equ	2		;end effect   (*prf_patnum)
prf_pri	equ	3			;priority     (*prf_patnum)
prf_spd	equ	4			;eff speed    (*prf_patnum)
prf_ani	equ	5			;ani speed    (*prf_patnum)
prf_roth	equ	6		;routine info (*prf_patnum)
prf_rotl	equ	7		;routine info (*prf_patnum)

eff_num	equ	256			;aantal effects

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

fil_namlen	equ	24		;naamlengte
fil_len	equ	(fil_namlen+4+4)	;effect info length
fil_num	equ	2+eff_num		;aantal files
fil_fil	equ	0			;file naam 
fil_dir	equ	24			;pointer naar directory
fil_pnt	equ	28			;pointer naar meminfo

palette	ds.w	64	;palette

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		;animspeed
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_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

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

	
;	SECTION	10,CODE_C
		endc

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

		ifnd	rout
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

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		;animspeed
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_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

vew_wid	equ	44
vew_hgt	equ	290
win_hgt	equ	117
win_str	equ	$1a
		endc

rot_vew	equ	0	;$8004 <- nog niet goed !
rot_dpt	equ	1

		ifeq	rot_vew-0
rot_wid		equ	44
rot_hgt		equ	290
rot_cenx	equ	0
rot_ceny	equ	6
rot_siz		equ	-150
		endc
		ifeq	rot_vew-$8004
rot_wid		equ	44*2
rot_hgt		equ	290*2
rot_cenx	equ	4*8
rot_ceny	equ	5
rot_siz		equ	-100
		endc
	
lnd_sizx	equ	$4		;size x
lnd_sizy	equ	$8		;size y
lnd_palnum	equ	$10		;aantal kleuren -1
lnd_pal		equ	$12		;palette
lnd_wrl		equ	256*2+lnd_pal	;worlddata

rot
	dc.l	'ROUT'
ProgStart:
	movem.l	d2-d7/a1-a6,-(sp)

	lea	rot,a3			;program-base
	
	move.l	d0,d1
	divs	#128,d1
	and.l	#$ffff,d1
	move.l	d1,d7			;
	muls	#128,d1
	sub.l	d1,d0

	move.l	d0,d1
	divs	#64,d1
	and.l	#$ffff,d1
	move.l	d1,rotmod-rot(a3)	;mode
	muls	#64,d1
	sub.l	d1,d0

	move.l	d0,d1
	divs	#16,d1
	and.l	#$ffff,d1
	move.l	d1,d7			;view size
	lsl.l	#1,d7			;*2
	lea	rotsiztab,a1
	move.w	(a1,d7),Dif-rot(a3)
	muls	#16,d1
	sub.l	d1,d0

	move.l	d0,rotsintabpos-rot(a3)	;beweeg vorm
	
	tst.l	var_lnd(a0)		;is er een landfile ?
	beq	rot.return
	move.l	var_lnd(a0),a0		;landscape data
	cmp.l	#'LAND',(a0)		;still active ?
	bne	rot.return

	move.l	lnd_sizx(a0),sizx-rot(a3)
	move.l	lnd_sizy(a0),sizy-rot(a3)
	
	move.l	lnd_sizx(a0),d0		;bereken DifW
	move.l	#128,d1
	clr.l	d2
	move.w	Dif-rot(a3),d2
	divs	d2,d1
	sub.w	d1,d0
	move.l	d0,DifW-rot(a3)

	lea	lnd_wrl(a0),a0
	move.l	a0,d0
	move.l	d0,World-rot(a3)
	
;	tst.l	Ytable-rot(a3)		;al gedaan ?
;	bne	rot.done

	lea	rotytab,a0
	move.l	a0,d0
	move.l	d0,Ytable-rot(a3)

	lea	rotyadr,a0
	move.l	a0,d0
	move.l	d0,YTabAdr-rot(a3)
	add.l	#4*rot_dpt,d0
	move.l	d0,YTabAdrEnd-rot(a3)

	lea	rotdata,a0
	move.l	a0,d0
	move.l	d0,World_Data-rot(a3)

	lea	rotraw1,a1
	add.l	rotbuf-rot(a3),a1
	
	move.l	Ytable-rot(a3),a6
	move.l	YTabAdr-rot(a3),a5
	move.w	#rot_dpt-1,d1		;depth-1
PInit_1:
	move.l	a6,(a5)+
	move.l	a1,a0			;bitplane halen
	add.l	#rot_wid,a1
	move.l	#rot_hgt-1,d0		;heigth-1
PInit_2:
	move.l	a0,(a6)+
	add.l	#rot_dpt*rot_wid,a0
	dbra	d0,PInit_2
	dbra	d1,PInit_1

rot.done

LoadLand:				;load landscape

StartHere:				;landscape groot laten zien
rotlop
	bsr.s	Hoofd3D

rot.return
	lea	rotpic1,a0		;picture
	add.l	rotbuf-rot(a3),a0
	eor.l	#rotpic2-rotpic1,rotbuf-rot(a3)
	move.l	#0,d1			;copper
	movem.l	(sp)+,d2-d7/a1-a6
	rts
	

Hoofd3D:				;landscape 3d laten zien
	move.l	Ytable-rot(a3),a6

;	move.l	Ytable(pc),a6
;	add.l	YTabNr(pc),a6
	bsr	ScreenClear			;scherm wissen

	move.l	World-rot(a3),a5

	lea	rotsintab,a1			;sinus add tabel
	move.l	rotsintabpos-rot(a3),d0
	lsl.l	#3,d0				;*8
	add.l	d0,a1
	
	lea	rotsin,a0			;sinus data
	move.l	rotsinx-rot(a3),d0		;sinus x pos
	clr.l	d2
	move.w	(a0,d0),d2
;	move.l	sizx-rot(a3),d3			;totale breedte
	move.l	DifW-rot(a3),d3			;- x module
	muls	d3,d2				;maal goede breedte
	divs	#256,d2				;delen
	move.w	d2,2+AbsX-rot(a3)		;set absx

	move.l	rotsiny-rot(a3),d1		;sinus y pos
	clr.l	d2
	move.w	(a0,d1),d2
;	move.l	sizy-rot(a3),d3			;totale breedte
	move.l	DifW-rot(a3),d3			;- x module
	muls	d3,d2				;maal goede breedte
	divs	#256,d2				;delen
	move.w	d2,2+AbsY-rot(a3)		;set ansy
	

	move.l	rotsinx-rot(a3),d0		;change x pos
	add.l	(a1),d0
	cmp.l	#((((rotsin.e-rotsin)/8)*2)*4),d0
	blt.s	rot.ga
	sub.l	#((((rotsin.e-rotsin)/8)*2)*4),d0
rot.ga
	move.l	d0,rotsinx-rot(a3)

	move.l	rotsiny-rot(a3),d1	;change y pos
	add.l	4(a1),d1
	cmp.l	#((((rotsin.e-rotsin)/8)*2)*4),d1
	blt.s	rot.gb
	sub.l	#((((rotsin.e-rotsin)/8)*2)*4),d1
rot.gb
	move.l	d1,rotsiny-rot(a3)

	move.l	AbsX-rot(a3),d0		;x,y view positie
	muls	(sizx+2)-rot(a3),d0
	add.l	d0,a5
	move.l	AbsY-rot(a3),d0
	add.l	d0,a5

	move.l	rotmod-rot(a3),d0	;mode halen
	tst.b	d0
	beq.s	rotpix			;pixels ?
	cmp.b	#1,d0
	beq	rotlin			;lijntjes ?
	rts

rotpix					;pixels
	move.w	#-64,X-rot(a3)		; -64
rotpix_LoopX:
	move.w	#64,Y-rot(a3)
	move.l	World_Data-rot(a3),a4
rotpix_LoopY:
	move.w	X-rot(a3),d0
	move.w	Y-rot(a3),d2
	clr.w	d1
	move.b	(a5)+,d1		;z-waarde halen
	lsr.b	#1,d1			;/2

	ifge	rot_dpt-2
	move.b	d1,d7
	lsr.b	#7-rot_dpt,d7		;kleur
	beq.s	rotpixcol.da		;overslaan ?
	endc
	
	moveq	#0,d3
	move.w	Hoogte-rot(a3),d4
	move.w	#rot_siz,d5		; -120 -150
	sub.w	d5,d2
	tst.w	d2
	beq.s	rotCentProjEnd
	sub.w	d3,d0
	sub.w	d4,d1
	muls	d5,d0
	muls	d5,d1
	divs	d2,d0
	divs	d2,d1
	sub.w	d0,d3
	sub.w	d1,d4
	move.w	d3,d0
	move.w	d4,d1
	neg.w	d1
rotCentProjEnd:

	add.w	#rot_wid*4+rot_cenx,d0		;centreer x1,y1
	add.w	#(rot_hgt*rot_ceny)/10,d1

	ifeq	rot_dpt-1		;no-colorversion
	move.w	d1,d6			;y-pos
	lsl.w	#2,d6			;*4
	move.l	(a6,d6),a1		;y regel halen
	move.w	d0,d6			;x-pos
	lsr.w	#3,d6			;/8
	and.w	#7,d0
	eor.b	#7,d0
	bset	d0,(a1,d6)
	endc
	
	ifge	rot_dpt-2		;color version
	move.w	d1,d6			;y-pos
	lsl.w	#2,d6			;*4
	move.l	(a6,d6),a1		;y regel halen
	move.w	d0,d6			;x-pos
	lsr.w	#3,d6			;/8
	and.w	#7,d0
	eor.b	#7,d0

	ifeq	rot_dpt-2		;color version 4
	btst	#1,d7			;kleur	
	beq.s	rotpixcol.ca
	bset	d0,(a1,d6)
rotpixcol.ca
	btst	#0,d7			;kleur	
	beq.s	rotpixcol.cb
	bset	d0,rot_wid(a1,d6)
rotpixcol.cb
	endc

	ifeq	rot_dpt-3		;color version 8
	btst	#2,d7			;kleur	
	beq.s	rotpixcol.ca
	bset	d0,(a1,d6)
rotpixcol.ca
	btst	#0,d7			;kleur	
	beq.s	rotpixcol.cb
	bset	d0,rot_wid(a1,d6)
rotpixcol.cb
	btst	#1,d7			;kleur	
	beq.s	rotpixcol.cc
	bset	d0,2*rot_wid(a1,d6)
rotpixcol.cc
	endc

	ifeq	rot_dpt-5		;color big version
	add.l	#rot_wid*2,a1
	btst	#4,d7			;kleur	
	beq.s	rotpixcol.ca
	bset	d0,-2*rot_wid(a1,d6)
rotpixcol.ca
	btst	#0,d7			;kleur	
	beq.s	rotpixcol.cb
	bset	d0,-1*rot_wid(a1,d6)
rotpixcol.cb
	btst	#1,d7			;kleur	
	beq.s	rotpixcol.cc
	bset	d0,(a1,d6)
rotpixcol.cc
	btst	#2,d7			;kleur	
	beq.s	rotpixcol.cd
	bset	d0,1*rot_wid(a1,d6)
rotpixcol.cd
	btst	#3,d7			;kleur	
	beq.s	rotpixcol.ce
	bset	d0,2*rot_wid(a1,d6)
rotpixcol.ce
	endc

rotpixcol.da
	endc
	
	clr.l	d0
	move.w	Dif-rot(a3),d0		;stap naar volgende scherm positie
	sub.w	d0,Y-rot(a3)
	cmp.w	#-64,Y-rot(a3)		;laatste y punt ?
	bne	rotpix_LoopY

	add.w	d0,X-rot(a3)

	add.l	DifW-rot(a3),a5		;stap naar volgend kaart-regel
	cmp.w	#64,X-rot(a3)		;laatste x punt ?
	bne	rotpix_LoopX
	rts
	



rotlin					;lijntjes
	move.w	#-64,X-rot(a3)		; -64
rotlin_LoopX:
	move.w	#64,Y-rot(a3)
	move.l	World_Data-rot(a3),a4
rotlin_LoopY:
	move.w	X-rot(a3),d0
	move.w	Y-rot(a3),d2
	clr.w	d1
	move.b	(a5)+,d1		;z-waarde halen
	lsr.b	#1,d1			;/2
	bsr	CentralProj

	add.w	#rot_wid*4+rot_cenx,d0		;centreer x1,y1
	add.w	#(rot_hgt*rot_ceny)/10,d1
	move.w	OldX-rot(a3),d2		;x2,y2
	move.w	OldY-rot(a3),d3
	move.w	d0,OldX-rot(a3)
	move.w	d1,OldY-rot(a3)
	cmp.w	#64,Y-rot(a3)		;eerste y punt = overslaan
	beq.s	rotlin_Go_on

	bsr	Drawline		;lijn tekenen

rotlin_Go_on:
	move.w	(a4),d0
	move.w	2(a4),d1
	move.w	OldX-rot(a3),d2
	move.w	OldY-rot(a3),d3
	move.w	d2,(a4)+
	move.w	d3,(a4)+
	cmp.w	#-64,X-rot(a3)		;eerste x punt = overslaan
	beq.s	rotlin_Go_On2

	bsr	Drawline

rotlin_Go_On2:
	clr.l	d0
	move.w	Dif-rot(a3),d0		;stap naar volgende scherm positie
	sub.w	d0,Y-rot(a3)
	cmp.w	#-64,Y-rot(a3)		;laatste y punt ?
	bne	rotlin_LoopY

	add.w	d0,X-rot(a3)
	add.l	DifW-rot(a3),a5		;stap naar volgend kaart-regel
	cmp.w	#64,X-rot(a3)		;laatste x punt ?
	bne	rotlin_LoopX

	bsr.s	blitwait
	rts
	
;	move.b	$BFEC01,d0		;read keyboard
;	ror.b	#1,d0
;	cmp.b	#$AF,d0	; F1
;	bne.s	F2
;	move.w	#4,Dif
;	move.l	#224,DifW
;F2:
;	cmp.b	#$AE,d0	; F2
;	bne.s	F3
;	move.w	#8,Dif
;	move.l	#240,DifW
;F3:
;	cmp.b	#$AD,d0	; F3
;	bne.s	F4
;	move.w	#16,Dif
;	move.l	#248,DifW
;F4:
;	cmp.b	#$AC,d0	; F4
;	bne.s	ESC
;	move.w	#32,Dif
;	move.l	#252,DifW
;ESC:
;	cmp.b	#$BA,d0	; Esc
;	bne.s	Skey
;	move.l	#0,d0
;	rts
;
;Skey:
;	cmp.b	#$DE,d0	; 'S'
;	bne.s	F8
;	move.l	#2,d0
;F8:
;	cmp.b	#$A8,d0	; F8
;	bne.s	F10
;	move.w	OldToeval(pc),Toeval
;	move.w	#1,d0
;	rts
;F10:
;	cmp.b	#$A6,d0		; F10
;	bne.s	T1_5
;	move.w	Teller(pc),Toeval
;	move.w	Toeval(pc),OldToeval
;	move.l	#1,d0
;	rts
;T1_5:
;	cmp.b	#$FE,d0		; 1,2,3,4,5
;	bhi.s	F9
;	cmp.b	#$F9,d0
;	bls.s	F9
;	sub.b	#$FA,d0
;	move.b	d0,Size
;F9:
;	cmp.b	#$A7,d0
;	bne	Loop3d_1
;	move.l	#1,d0
;	move.w	Toeval(pc),OldToeval
;	rts

BlitClear:
	move.l	(a6),$DFF050		;blit clear
	move.l	(a6),$DFF054
	move.l	#(rot_dpt-1)*rot_wid,$DFF064
	move.w	#$900,$DFF040
	move.w	#0,$DFF042
	move.w	#(rot_hgt*64)+(rot_wid/2),$DFF058
	bsr.s	blitwait
	rts

blitwait:
	btst	#6,($DFF002).l		;blt wait
	bne.s	blitwait
	rts

ScreenClear:				;clear screen
	move.l	YTabAdr-rot(a3),a0
	move.w	#rot_dpt-1,d0
LPos:
	move.l	(a0)+,a6
	bsr.s	BlitClear
	dbra	d0,LPos
	rts

Verschil:
	sub.l	d2,d0
	bsr.s	SubM
	neg.l	d0
	bsr.s	SubM
	neg.l	d0
	rts

SubM:
	cmp.l	#$7F,d0
	ble.s	Kleiner
	move.l	#$FF,d2
	sub.l	d2,d0
Kleiner:
	rts

CentralProj:
	move.w	#0,d3
	move.w	Hoogte-rot(a3),d4
	move.w	#rot_siz,d5	; -120 -150
	sub.w	d5,d2
	tst.w	d2
	beq.s	CentProjEnd
	sub.w	d3,d0
	sub.w	d4,d1
	muls	d5,d0
	muls	d5,d1
	divs	d2,d0
	divs	d2,d1
	sub.w	d0,d3
	sub.w	d1,d4
	move.w	d3,d0
	move.w	d4,d1
	neg.w	d1
CentProjEnd:
	rts

Drawline:
	cmp.w	d0,d2
	bne.s	WDraw1
	cmp.w	d1,d3
	bne.s	WDraw1
	rts

WDraw1:
	tst.w	d1
	bmi.s	Clipping
	tst.w	d3
	bmi.s	Clipping1
	bra.s	WDraw

Clipping:
	tst.w	d3
	bpl.s	Clipping1
	rts

Clipping1:
	move.w	d0,d4
	sub.w	d2,d4
	move.w	d3,d5
	muls	d5,d4
	sub.w	d1,d5
	divs	d5,d4
	add.w	d2,d4
	tst.w	d1
	bmi.s	PKt1
	move.w	d4,d2
	clr.w	d3
	bra.s	Drawline

PKt1:
	move.w	d4,d0
	clr.w	d1
	bra.s	Drawline

WDraw:
	move.w	#rot_dpt*rot_wid,a1
	clr.l	d6
	move.w	d1,d6
	lsl.w	#2,d6
	move.l	0(a6,d6.l),d4
	moveq	#-$10,d5
	and.w	d0,d5
	lsr.w	#3,d5
	add.w	d5,d4
	clr.l	d5
	sub.w	d1,d3
	roxl.b	#1,d5
	tst.w	d3
	bge.s	GrY
	neg.w	d3
GrY:
	sub.w	d0,d2
	roxl.b	#1,d5
	tst.w	d2
	bge.s	GrX
	neg.w	d2
GrX:
	move.w	d3,d1
	sub.w	d2,d1
	bge.s	Gd
	exg	d2,d3
Gd:
	roxl.b	#1,d5
	move.b	OktTab(pc,d5.l),d5
	add.w	d2,d2
	move.l	a5,-(sp)
	move.l	#$dff000,a5
WBlit:
	btst	#6,$002(a5)
	bne.s	WBlit
	move.w	d2,$062(a5)
	sub.w	d3,d2
	bge.s	Voorz
	or.b	#$40,d5
Voorz:
	move.w	d2,$052(a5)
	sub.w	d3,d2
	move.w	d2,$064(a5)
	move.w	#$8000,$074(a5)
	move.w	#$FFFF,$072(a5)
	move.w	#$FFFF,$044(a5)
	and.w	#15,d0
	ror.w	#4,d0
	or.w	#$BCA,d0
	move.w	d0,$040(a5)
	move.w	d5,$042(a5)
	move.l	d4,$048(a5)
	move.l	d4,$054(a5)
	move.w	a1,$060(a5)
	move.w	a1,$066(a5)
	lsl.w	#6,d3
	addq.w	#2,d3
	move.w	d3,$058(a5)
	move.l	(sp)+,a5
	rts

OktTab:
	dc.w	$111,$915,$519,$D1D

X:		dc.w	0
Y:		dc.w	0
OldX:		dc.w	0
OldY:		dc.w	0
World_Data:	dc.l	0
AbsX:		dc.l	0
AbsY:		dc.l	0
Hoogte:		dc.w	119	;-49 tot 119

sizx		dc.l	0
sizy		dc.l	0

Ytable:		dc.l	0
YTabAdr:	dc.l	0
YTabAdrEnd:	dc.l	0
YTabNr:		dc.l	0

World:		dc.l	0
Dif:		dc.w	8	;4	;8	scherm stap
DifW:		dc.l	242	;226	;242	kaart-regel module stap

rotbuf		dc.l	0
rotsinx		dc.l	0
rotsiny		dc.l	(((rotsin.e-rotsin)/8)*2)
rotsintabpos	dc.l	0
rotmod		dc.l	0

;		Dif	Difw
rotsiztab
	dc.w	16,8,4,2
	
;		xadd	yadd
rotsintab
	dc.l	4*2,	4*2
	dc.l	2*2,	4*2
	dc.l	4*2,	6*2

	rept	16-3
	dc.l	2*2,	2*2
	endr
rotsin
       dc.w       128,129,130,131,132,134,135,136,137,138,139,140
       dc.w       141,142,143,145,146,147,148,149,150,151,152,153
       dc.w       154,155,157,158,159,160,161,162,163,164,165,166
       dc.w       167,168,169,170,171,172,174,175,176,177,178,179
       dc.w       180,181,182,183,184,185,186,187,188,189,190,191
       dc.w       192,192,193,194,195,196,197,198,199,200,201,202
       dc.w       203,204,204,205,206,207,208,209,210,210,211,212
       dc.w       213,214,215,215,216,217,218,219,219,220,221,222
       dc.w       222,223,224,225,225,226,227,227,228,229,229,230
       dc.w       231,231,232,233,233,234,235,235,236,236,237,237
       dc.w       238,239,239,240,240,241,241,242,242,243,243,244
       dc.w       244,244,245,245,246,246,247,247,247,248,248,248
       dc.w       249,249,249,250,250,250,251,251,251,251,252,252
       dc.w       252,252,253,253,253,253,253,254,254,254,254,254
       dc.w       254,254,255,255,255,255,255,255,255,255,255,255
       dc.w       255,255,255,255,255,255,255,255,255,255,255,254
       dc.w       254,254,254,254,254,254,253,253,253,253,253,252
       dc.w       252,252,252,251,251,251,251,250,250,250,249,249
       dc.w       249,248,248,248,247,247,247,246,246,245,245,244
       dc.w       244,244,243,243,242,242,241,241,240,240,239,239
       dc.w       238,237,237,236,236,235,235,234,233,233,232,231
       dc.w       231,230,229,229,228,227,227,226,225,225,224,223
       dc.w       222,222,221,220,219,219,218,217,216,215,215,214
       dc.w       213,212,211,210,210,209,208,207,206,205,204,204
       dc.w       203,202,201,200,199,198,197,196,195,194,193,192
       dc.w       192,191,190,189,188,187,186,185,184,183,182,181
       dc.w       180,179,178,177,176,175,174,172,171,170,169,168
       dc.w       167,166,165,164,163,162,161,160,159,158,157,155
       dc.w       154,153,152,151,150,149,148,147,146,145,143,142
       dc.w       141,140,139,138,137,136,135,134,132,131,130,129
       dc.w       128,127,126,125,124,122,121,120,119,118,117,116
       dc.w       115,114,113,111,110,109,108,107,106,105,104,103
       dc.w       102,101,99,98,97,96,95,94,93,92,91,90
       dc.w       89,88,87,86,85,84,82,81,80,79,78,77
       dc.w       76,75,74,73,72,71,70,69,68,67,66,65
       dc.w       65,64,63,62,61,60,59,58,57,56,55,54
       dc.w       53,52,52,51,50,49,48,47,46,46,45,44
       dc.w       43,42,41,41,40,39,38,37,37,36,35,34
       dc.w       34,33,32,31,31,30,29,29,28,27,27,26
       dc.w       25,25,24,23,23,22,21,21,20,20,19,19
       dc.w       18,17,17,16,16,15,15,14,14,13,13,12
       dc.w       12,12,11,11,10,10,9,9,9,8,8,8
       dc.w       7,7,7,6,6,6,5,5,5,5,4,4
       dc.w       4,4,3,3,3,3,3,2,2,2,2,2
       dc.w       2,2,1,1,1,1,1,1,1,1,1,1
       dc.w       1,1,1,1,1,1,1,1,1,1,1,2
       dc.w       2,2,2,2,2,2,3,3,3,3,3,4
       dc.w       4,4,4,5,5,5,5,6,6,6,7,7
       dc.w       7,8,8,8,9,9,9,10,10,11,11,12
       dc.w       12,12,13,13,14,14,15,15,16,16,17,17
       dc.w       18,19,19,20,20,21,21,22,23,23,24,25
       dc.w       25,26,27,27,28,29,29,30,31,31,32,33
       dc.w       34,34,35,36,37,37,38,39,40,41,41,42
       dc.w       43,44,45,46,46,47,48,49,50,51,52,52
       dc.w       53,54,55,56,57,58,59,60,61,62,63,64
       dc.w       64,65,66,67,68,69,70,71,72,73,74,75
       dc.w       76,77,78,79,80,81,82,84,85,86,87,88
       dc.w       89,90,91,92,93,94,95,96,97,98,99,101
       dc.w       102,103,104,105,106,107,108,109,110,111,113,114
       dc.w       115,116,117,118,119,120,121,122,124,125,126,127
       dc.w       128
rotsin.e

rotyadr		ds.l	rot_dpt			;plane offsets
rotytab		ds.l	rot_dpt*rot_hgt		;plane y offsets
rotdata		ds.w	64			;words

;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

rotpic1
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew
	ds.b	4*4

	ifeq	rot_dpt-1
	dc.w	2-1
	dc.w	$000,$FFF
	ds.w	256-2
	endc

	ifeq	rot_dpt-2
	dc.w	4-1
	dc.w	$000,$0f0,$c70,$777
	ds.w	256-4
	endc

	ifeq	rot_dpt-3
	dc.w	8-1
	dc.w	$000,$050,$0a0,$0f0
	dc.w	$c70,$c70,$777,$777
	ds.w	256-8
	endc

	ifeq	rot_dpt-5
	dc.w	32-1
	dc.w	$000,$050,$060,$070,$080,$090,$0a0,$0b0
	dc.w	$0c0,$0d0,$0f0,$2e0,$4b0,$690,$880,$a70
	dc.w	$c70,$c70,$c70,$c70,$d80,$d80,$d80,$d80
	dc.w	$c71,$b62,$a63,$964,$866,$777,$777,$777
	ds.w	256-32
	endc


rotraw1
	ds.b	rot_wid*rot_hgt*rot_dpt

rotpic2
	dc.l	'PICT'
	dc.w	rot_wid,rot_hgt,rot_dpt,1,rot_vew
	ds.b	4*4

	ifeq	rot_dpt-1
	dc.w	2-1
	dc.w	$000,$FFF
	ds.w	256-2
	endc

	ifeq	rot_dpt-2
	dc.w	4-1
	dc.w	$000,$0f0,$c70,$777
	ds.w	256-4
	endc

	ifeq	rot_dpt-3
	dc.w	8-1
	dc.w	$000,$050,$0a0,$0f0
	dc.w	$c70,$c70,$777,$777
	ds.w	256-8
	endc

	ifeq	rot_dpt-5
	dc.w	32-1
	dc.w	$000,$050,$060,$070,$080,$090,$0a0,$0b0
	dc.w	$0c0,$0d0,$0f0,$2e0,$4b0,$690,$880,$a70
	dc.w	$c70,$c70,$c70,$c70,$d80,$d80,$d80,$d80
	dc.w	$c71,$b62,$a63,$964,$866,$777,$777,$777
	ds.w	256-32
	endc

rotraw2
	ds.b	rot_wid*rot_hgt*rot_dpt

rot.e

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

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

		ifd	rout
		cnop	0,2
rotinc
		incbin	'ram:forest.lnd'
		endc
		
