bufsize 	EQU 5500		; maximum size of buffer
					; (when tempo =32)
dmamask 	EQU %00000001		; STE dmamask for 50khz


bw:		equ	120	;width of block data screen
blocky:		equ	119	;width of blocks

*slength:		equ	2854547
slength:		equ	600000
mscale:			equ	0

val200a:		equ	200
val670a:		equ	670
val15a: 		equ	16

sba:		equ	128
scon:		equ	1

* BLiTTER BASE ADDRESS

blitter         equ     $FF8A00

* BLiTTER REGISTER OFFSETS

halftone        equ     0
src_xinc        equ     32
src_yinc        equ     34
src_addr        equ     36
endmask1        equ     40
endmask2        equ     42
endmask3        equ     44
dst_xinc        equ     46
dst_yinc        equ     48
dst_addr        equ     50
x_count         equ     54
y_count         equ     56
hop             equ     58
op              equ     59
line_num        equ     60
skew            equ     61
vbl_vec:	equ	$70

vertflag:	equ	$0100
stmodes:	equ	$0080
overscan:	equ	$0040
pal:		equ	$0020
vga:		equ	$0010
tv:		equ	$0000

col80:		equ	$0008
col40:		equ	$0000
numcols:	equ	$0007

bps16:		equ	4
bps8:		equ	3
bps4:		equ	2
bps2:		equ	1
bps1:		equ	0
mybit:		equ	%0000001000000000


sw:	equ	320
sh:	equ	240

key_vec:	equ	$118
hbl_vec:	equ	$120
bpwidth:	equ	320
bpheight:	equ	200
i1 	EQU 0
i2 	EQU 0
i3 	EQU 15

xsin 	EQU 2
ycos 	EQU 4
ysin 	EQU 6
zcos 	EQU 8
zsin 	EQU 10
*****************************************************************
*	Falcon Slide Demo.					*
*	Version 1.0						*
*****************************************************************
	include	'fequates.s'
start:
	move.l	4(a7),a3		base page
	move.l	#mystack,a7
	move.l	$c(a3),d0		text len
	add.l	$14(a3),d0		data len
	add.l	$1c(a3),d0		BSS len
	add.l	#$100,d0		basepage
	move.l	d0,-(sp)
	move.l	a3,-(sp)
	clr.w	-(sp)
	move.w	#$4a,-(sp)
	trap	#1			shrink memory
	lea	12(sp),sp

	clr.l	-(sp)		;as usual the first thing to
	move.w	#$20,-(sp)	;do is go into supervisor mode
	trap	#1
	addq.l	#6,sp
	move.l	d0,savesp

	dc.w	$a00a




*	jsr	putrout

	jsr	setupscreen
	jsr	doscreens

		LEA mt_data,A0
		MOVE.L A0,mt_data_ptr
		jSR Wait_Vbl
.goformusic	jSR init_ints			; and kill ints
		MOVEQ #1,D0
		MOVEQ #0,D1
		jSR Init_ST			; install music


*	jsr	startofg

	lea	cylynder2,a0
	move.l	(a0),obpointlist
	move.l	4(a0),obfacelist
	bsr	dointro
	move.w	#-1,lifetime
	move.l	#demlist,demaddress
mainloop:
	tst.w	doclear		;clear screen 3
	bmi.s	noclear
	bsr	clearscreen
noclear:
	bsr	dodem
	bsr	swapnshow
	jsr	keyboard
	bra	mainloop


	rsreset
objtlxyz:	rs.w	3
objbrxyz:	rs.w	3
objtlxy:	rs.w	2
objbrxy:	rs.w	2
objdata:	rs.l	1


object1:
	dc.w	-60,-60,0		;top left
	dc.w	60,60,0		;bottom right
	dc.w	200,100,261,161		;2d xy after perspective transform
	dc.l	balls			;address of graph data
object2:
	dc.w	-60,-60,0		;top left
	dc.w	60,60,0		;bottom right

	dc.w	200,100,261,161		;2d xy after perspective transform
	dc.l	balls+(121*bw*2)		;address of graph data
object3:
	dc.w	-60,-60,0		;top left
	dc.w	60,60,0		;bottom right
	dc.w	200,100,261,161		;2d xy after perspective transform
	dc.l	balls+(242*bw*2)		;address of graph data
object4:
	dc.w	-60,-60,0		;top left
	dc.w	60,60,0		;bottom right
	dc.w	200,100,261,161		;2d xy after perspective transform
	dc.l	balls+(362*bw*2)		;address of graph data

endedflag:	dc.w	-1
whatobj:	dc.l	0

dointro:
	move.w	#-1,endedflag
	move.l	#idemlist,demaddress
	move.w	#-1,lifetime
introloop:
*	tst.w	doclear		;clear screen 3
*	bmi.s	inoclear
*	bsr	clearscreen
inoclear:
	bsr	introanim
	bsr	swapnshow
	jsr	keyboard
	tst.w	endedflag
	bmi	introloop
	move.w	#-1,lifetime
	move.l	#demlist,demaddress
	rts
idemlist:
	dc.l	object1
	dc.w	3910,150,235,110
	dc.l	object2
	dc.w	3910,150,255,110
	dc.l	object3
	dc.w	3910,150,260,110
	dc.l	object4
	dc.w	3910,150,260,110
	dc.l	-1

introanim:
	move.l	whatobj,a6
	subq.w	#1,lifetime
	bpl	istillalive
	move.l	demaddress,a0
	tst.l	(a0)
	bpl	inorestart
	move.w	#1,endedflag
	lea	idemlist,a0
inorestart:
	move.l	(a0)+,a6		;object
	move.l	a6,whatobj
	move.w	(a0)+,zdist		;initial distance
	move.w	zdist,zdist2
	move.w	(a0)+,zinc		;speed out and in screen
	move.w	(a0)+,zfinal		;close as it gets
	move.w	(a0)+,lifetime
	move.w	lifetime,d0
	asr.w	#2,d0			;/2
	move.w	d0,halflife
	move.l	a0,demaddress
istillalive:
	move.w	halflife,d0
	cmp.w	lifetime,d0
	bgt.s	izoomout
	move.w	zdist,d0
	cmp.w	zfinal,d0
	ble.s	iokh
	sub.w	#3,zinc
	sub.w	zinc,d0
	cmp.w	zfinal,d0
	bge.s	iisz
	move.w	zfinal,d0
iisz:
	move.w	d0,zdist
	bra.s	iokh
izoomout:
	move.w	zdist,d0
	add.w	#5,zinc
	add.w	zinc,d0
	move.w	d0,zdist
	cmp.w	zdist2,d0
	ble.s	iokh
	move.w	#-1,lifetime
iokh:
	move.w	d0,objtlxyz+4(a6)
	move.w	d0,objbrxyz+4(a6)
	bsr	calc3d
	move.l	a6,-(sp)
	bsr	expand
	move.l	(sp)+,a6
	rts
calc3d:
	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	movem.w	objtlxyz(a6),d0-d2
	asl.w	#8,d0
	divs	d2,d0
	add	#(sw/2),d0	;centre it
	asl.w	#8,d1
	divs	d2,d1
	add.w	#110,d1	;centre it
	movem.w	d0-d1,objtlxy(a6)

	moveq	#0,d0
	moveq	#0,d1
	moveq	#0,d2
	movem.w	objbrxyz(a6),d0-d2
	asl.w	#8,d0
	divs	d2,d0
	add.w	#(sw/2),d0	;centre it
	asl.w	#8,d1
	divs	d2,d1
	add.w	#110,d1	;centre it
	movem.w	d0-d1,objbrxy(a6)
	rts

*********************************************************
*	Pass objects structure in a6			*
*							*
*********************************************************
expand:
	movem.w	objtlxy(a6),d0-d3
	sub.w	d0,d2
	ble	rover		;not big enough
	sub.w	d1,d3
	ble	rover
	ext.l	d0
	asl.l	#1,d0
	mulu	#sw*2,d1
	add.l	d0,d1
	move.l	viewscreen2,a5
	add.l	d1,a5			;screen ad to start at
	move.w	d3,d6			;save (d6 not used in dx1 or dx2)
	move.w	d2,d3
	lea	coordsx,a0
	bsr	dx1
	lea	coordsy,a0
	move.l	objdata(a6),d0
	move.w	d6,d3
	bsr	dx2

	lea	coordsy,a2
	lea	coordsx,a6
	move.l	a5,a0		;screen add
eloop1:
	move.l	a2,a3
	moveq	#0,d1
	move.w	(a6)+,d1
	bmi	eloop1over
	asl.w	#1,d1
	move.l	a0,a5
eloop2:
	move.l	(a3)+,d0
	bmi	eloop2over
	add.l	d1,d0
	move.l	d0,a1
	move.w	(a1),d2
	beq.s	nopixel
	move.w	d2,(a5)	;put pixel
nopixel:
	lea	sw*2(a5),a5
	bra	eloop2
eloop2over:
	addq.l	#2,a0
	bra	eloop1
eloop1over:
rover:
	rts

coordsx:	ds.w	400
coordsy:
		ds.l	400

*********************************************************
*	Routine to calculate stretchy stuff		*
*	Pass x width in d3				*
*	block address in d0
*	array to fill in a0				*
*********************************************************
dx2:
	moveq	#blocky,d2
	move.l	d0,d7
	move.w 	d3,d0		;dy
	moveq	#0,d5
lineloopdx2:
	move.l 	d7,(a0)+
	add.w 	d2,d5
testdx2:
	cmp.w 	d3,d5
	blt.s 	noacrossdx2
	sub.w 	d3,d5
	add.l 	#bw*2,d7
	bra.s 	testdx2
noacrossdx2:
	dbra 	d0,lineloopdx2
	move.l	#-1,(a0)+
nolinedx2:
	rts

*********************************************************
*	Routine to calculate stretchy stuff		*
*	Pass x width in d3				*
*	array to fill in a0				*
*********************************************************
dx1:
	moveq	#blocky,d2
	moveq 	#0,d7		;x1
	move.w 	d3,d0		;dy
	moveq	#0,d5
lineloopdx1:
	move.w 	d7,(a0)+
	add.w 	d2,d5
testdx1:
	cmp.w 	d3,d5
	blt.s 	noacrossdx1
	sub.w 	d3,d5
	addq.w 	#1,d7
	bra.s 	testdx1
noacrossdx1:
	dbra 	d0,lineloopdx1
	move.w	#-1,(a0)+
nolinedx1:
	rts

lifetime:	dc.w	-1
halflife:	dc.w	0
demaddress:	dc.l	0
zdist:		dc.w	20000
zdist2:		dc.w	20000
zinc:		dc.w	0
zfinal:		dc.w	0
**********************************************************
*	address,initial dist,zincr,zfinal,lifetime

demlist:
	dc.l	spyramid
	dc.w	30000,400,5000,250
	dc.l	pyramid
	dc.w	28000,400,3500,250
	dc.l	cube1
	dc.w	28000,400,3500,250
	dc.l	cylynder1
	dc.w	28000,400,3500,250
	dc.l	sball
	dc.w	28000,400,3500,250
	dc.l	cone1
	dc.w	28000,400,3500,250
	dc.l	pyramid2
	dc.w	28000,600,5000,250
	dc.l	cylynder3
	dc.w	28000,400,5500,250
	dc.l	ball1
	dc.w	28000,400,3500,250
	dc.l	cylynder2
	dc.w	28000,400,3500,250
	dc.l	ball2
	dc.w	28000,400,3500,250
	dc.l	-1

dodem:
	subq.w	#1,lifetime
	bpl	stillalive
	move.l	demaddress,a0
	tst.l	(a0)
	bpl	norestart
	bsr	dointro
	lea	demlist,a0
norestart:
	move.l	(a0)+,a1		;object
	move.l	(a1),obpointlist
	move.l	4(a1),obfacelist
	move.w	(a0)+,zdist		;initial distance
	move.w	zdist,zdist2
	move.w	(a0)+,zinc		;speed out and in screen
	move.w	(a0)+,zfinal		;close as it gets
	move.w	(a0)+,lifetime
	move.w	lifetime,d0
	asr.w	#2,d0			;/2
	move.w	d0,halflife
	move.l	a0,demaddress
stillalive:
	move.w	halflife,d0
	cmp.w	lifetime,d0
	bgt.s	zoomout
	move.w	zdist,d0
	cmp.w	zfinal,d0
	ble.s	okh
	sub.w	zinc,d0
	cmp.w	zfinal,d0
	bge.s	isz
	move.w	zfinal,d0
isz:
	move.w	d0,zdist
	bra.s	okh
zoomout:
	move.w	zdist,d0
	add.w	zinc,d0
	move.w	d0,zdist
	cmp.w	zdist2,d0
	ble.s	okh
	move.w	#-1,lifetime
okh:
	bsr	 lop
	rts

workx:	equ	70
worky:	equ	55
workw:	equ	320-(workx*2)
workh:	equ	110

clearscreen:
	lea	blitter,a6
.waitblit:
	btst	#7,line_num(a6)
	bne	.waitblit

	move.l	savescreen2,a0
	add.l	#worky*(sw*2)+workx*2,a0
	move.l	a0,src_addr(a6)

	move.l	viewscreen2,a0
	add.l	#worky*(sw*2)+workx*2,a0
	move.l	a0,dst_addr(a6)

	move.w	#2,src_xinc(a6)
	move.w	#2,dst_xinc(a6)
	move.w	#((sw*2)-(workw*2))+2,src_yinc(a6)
	move.w	#((sw*2)-(workw*2))+2,dst_yinc(a6)

	move.w	#workw,x_count(a6)
	move.w	#workh,y_count(a6)
	move.w	#-1,endmask1(a6)
	move.w	#-1,endmask2(a6)
	move.w	#-1,endmask3(a6)
	move.b	#0,skew(a6)
	move.b	#$3,op(a6)
	move.b	#2,hop(a6)
*	bset	#6,line_num(a6)
	bset	#7,line_num(a6)
	rts

swapnshow:
	move.l	viewscreen1,d0
	move.l	viewscreen2,viewscreen1
	move.l	d0,viewscreen2
waitvbl:
	move.w	#1,vblflag
wvbloop:
	tst.w	vblflag
	bpl	wvbloop

	move.l	viewscreen1,d0
	move.l	d0,d1
	move.l	d1,d2
	lsr.l	#8,d0
	lsr.l	#8,d0
	move.w	d0,vid_bh
	lsr.l	#8,d1
	and.l	#$000000ff,d1
	move.w	d1,vid_bm
	and.l	#$000000ff,d2
	move.w	d2,vid_bl
	rts

startofg:
	move.l #brights,botpt
	move.l #brights,toppt
	move.l #brights+38,midpt
	bsr	clearlefts
	rts

clearlefts:
	lea	lefts,a6
	moveq	#0,d0
	move.w	#240,d1
.loop:
	move.l	d0,(a6)+
	dbf	d1,.loop
	rts

lop:
	move.w	#2048,d7
	lea 	svals,a1
	lea	sin,a0
	move.w 	xspos,d0
	move.w 	(a0,d0),xsin(a1)
	lea	(a0,d7.w),a0
	move.w 	(a0,d0),(a1)

	move.l 	#sin,a0
	move.w 	yspos,d0
	move.w 	(a0,d0),ysin(a1)
	lea	(a0,d7.w),a0
	move.w 	(a0,d0),ycos(a1)

	move.l 	#sin,a0
	move.w 	zspos,d0
	move.w 	(a0,d0),zsin(a1)
	lea	(a0,d7.w),a0
	move.w 	(a0,d0),zcos(a1)
rotaters:
	add.w 	#104,xspos
	add.w 	#50,yspos
	add.w 	#50,zspos
*	move.w	my,xspos
*	move.w	mx,yspos
	and.w 	#$1fff,xspos
	and.w 	#$1fff,yspos
	and.w 	#$1fff,zspos

	move.l	obpointlist,a0
	lea 	pts,a1
	lea 	svals,a2
	lea 	zvals,a3
	move.w 	(a0)+,d7
threetwo:			;this loop does the 3D calcs
	movem.w	(a0)+,d0-d2

	move.w 	d0,d3
	muls 	ycos(a2),d3
	move.w 	d2,d4
	muls 	ysin(a2),d4
	sub.l 	d4,d3
	add.l 	d3,d3
	swap 	d3
	move.w 	d0,d4
	move.w 	d3,d0
	move.w 	d2,d3
	muls 	ycos(a2),d3
	muls 	ysin(a2),d4
	add.l 	d3,d4
	add.l 	d4,d4
	swap 	d4
	move.w 	d4,d2

	move.w 	d1,d3
	muls 	(a2),d3
	move.w 	d2,d4
	muls 	xsin(a2),d4
	sub.l 	d4,d3
	add.l 	d3,d3
	swap 	d3
	move.w 	d1,d4
	move.w 	d3,d1
	move.w 	d2,d3
	muls 	(a2),d3
	muls 	xsin(a2),d4
	add.l 	d3,d4
	add.l 	d4,d4
	swap 	d4
	move.w 	d4,d2

	move.w 	d0,d3
	muls 	zcos(a2),d3
	move.w 	d1,d4
	muls 	zsin(a2),d4
	sub.l 	d4,d3
	add.l 	d3,d3
	swap 	d3
	move.w 	d0,d4
	move.w 	d3,d0
	move.w 	d1,d3
	muls 	zcos(a2),d3
	muls 	zsin(a2),d4
	add.l 	d3,d4
	add.l 	d4,d4
	swap 	d4
	move.w 	d4,d1

	ext.l 	d0
	ext.l 	d1
	move.w 	d2,(a3)+
	add.w 	zdist,d2		;z dist
	asl.l 	#8,d0
	asl.l 	#8,d1
	divs 	d2,d0
	divs 	d2,d1
	add.w 	#160,d0		;centre the points on screen
	add.w 	#110,d1
	move.w 	d0,(a1)+
	move.w 	d1,(a1)+
	dbra 	d7,threetwo

	move.l	obfacelist,a0
	move.w 	(a0)+,d7
	lea 	pts,a1
	lea 	zvals,a2
polyloop:
	move.l	(a0)+,facecolor
	movem.w	(a0)+,d0-d2
	asl.w	#1,d0
	asl.w	#1,d1
	asl.w	#1,d2

	move.w 	(a2,d0.w),z1
	move.w 	(a2,d1.w),z2
	move.w 	(a2,d2.w),z3

	add.w 	d0,d0
	add.w 	d1,d1
	add.w 	d2,d2
	move.l 	(a1,d0.w),x1
	move.l 	(a1,d1.w),x2
	move.l 	(a1,d2.w),x3
	bsr 	gouraud
	bsr	clearlefts
	dbra 	d7,polyloop
	rts
sball:
	dc.l	sballp
	dc.l	sballf
sballp:
	dc.w	41
	dc.w	0,0,-500
	dc.w	-362,-263,-224
	dc.w	137,-425,-224
	dc.w	447,0,-224
	dc.w	137,425,-224
	dc.w	-362,263,-224
	dc.w	-138,-425,223
	dc.w	361,-263,223
	dc.w	361,263,223
	dc.w	-138,425,223
	dc.w	-447,0,223
	dc.w	0,0,500
	dc.w	-213,-155,-425
	dc.w	81,-250,-425
	dc.w	263,0,-425
	dc.w	81,249,-425
	dc.w	-213,154,-425
	dc.w	-425,0,-263
	dc.w	-131,-405,-263
	dc.w	344,-250,-263
	dc.w	344,249,-263
	dc.w	-131,404,-263
	dc.w	-476,-155,0
	dc.w	-294,-405,0
	dc.w	0,-500,0
	dc.w	293,-405,0
	dc.w	475,-155,0
	dc.w	475,154,0
	dc.w	293,404,0
	dc.w	0,500,0
	dc.w	-294,404,0
	dc.w	-476,154,0
	dc.w	-344,-250,263
	dc.w	131,-405,263
	dc.w	425,0,263
	dc.w	131,404,263
	dc.w	-344,249,263
	dc.w	-81,-250,425
	dc.w	212,-155,425
	dc.w	212,154,425
	dc.w	-81,249,425
	dc.w	-263,0,425

sballf:
	dc.w	79
	dc.l	purples		;no mans
	dc.w	40,36,9
	dc.l	purples		;1
	dc.w	40,41,36
	dc.l	purples		;1
	dc.w	36,41,10
	dc.l	purples		;1
	dc.w	41,40,11
	dc.l	blues		;1
	dc.w	39,35,8
	dc.l	blues		;1
	dc.w	39,40,35
	dc.l	blues		;1
	dc.w	35,40,9
	dc.l	blues		;nomans  rrrrrr
	dc.w	40,39,11
	dc.l	greens		;1
	dc.w	38,34,7
	dc.l	greens		;1
	dc.w	38,39,34
	dc.l	greens		;no mans
	dc.w	34,39,8
	dc.l	greens		;1
	dc.w	39,38,11
	dc.l	reds		;top penta
	dc.w	37,33,6
	dc.l	greens		;1
	dc.w	37,38,33
	dc.l	greens		;1
	dc.w	33,38,7
	dc.l	greens		;1
	dc.w	38,37,11
	dc.l	purples		;1
	dc.w	41,32,10
	dc.l	purples		;1
	dc.w	41,37,32
	dc.l	reds		;top penta
	dc.w	32,37,6
	dc.l	purples		;1
	dc.w	37,41,11
	dc.l	yellows		;2
	dc.w	31,5,30
	dc.l	yellows		;2
	dc.w	31,30,36
	dc.l	yellows		;2
	dc.w	30,9,36
	dc.l	yellows		;nomans
	dc.w	36,10,31
	dc.l	reds		;bottom penta
	dc.w	29,4,28
	dc.l	blues		;1
	dc.w	29,28,35
	dc.l	blues		;1
	dc.w	28,8,35
	dc.l	blues		;1
	dc.w	35,9,29
	dc.l	cyans		;2
	dc.w	27,3,26
	dc.l	cyans		;2
	dc.w	27,26,34
	dc.l	cyans		;nomans
	dc.w	26,7,34
	dc.l	cyans		;2
	dc.w	34,8,27
	dc.l	yellows		;1
	dc.w	25,2,24
	dc.l	yellows		;1
	dc.w	25,24,33
	dc.l	reds		;top penta
	dc.w	24,6,33
	dc.l	yellows		;1
	dc.w	33,7,25
	dc.l	cyans		;1
	dc.w	23,1,22
	dc.l	cyans		;1
	dc.w	23,22,32
	dc.l	cyans		;1
	dc.w	22,10,32
	dc.l	reds		;top penta
	dc.w	32,6,23
	dc.l	reds		;bottom penta
	dc.w	29,21,4
	dc.l	yellows		;2
	dc.w	29,30,21
	dc.l	yellows		;2
	dc.w	21,30,5
	dc.l	yellows		;2
	dc.w	30,29,9
	dc.l	cyans		;2
	dc.w	27,20,3
	dc.l	cyans		;2
	dc.w	27,28,20
	dc.l	reds		;bot penta
	dc.w	20,28,4
	dc.l	cyans		;2
	dc.w	28,27,8
	dc.l	yellows		;1
	dc.w	25,19,2
	dc.l	yellows		;1
	dc.w	25,26,19
	dc.l	yellows		;nomans
	dc.w	19,26,3
	dc.l	yellows		;1
	dc.w	26,25,7
	dc.l	blues		;2
	dc.w	23,18,1
	dc.l	blues		;2
	dc.w	23,24,18
	dc.l	blues		;2
	dc.w	18,24,2
	dc.l	reds		;top penta
	dc.w	24,23,6
	dc.l	cyans		;nomans
	dc.w	31,17,5
	dc.l	cyans		;1
	dc.w	31,22,17
	dc.l	cyans		;1
	dc.w	17,22,1
	dc.l	cyans		;1
	dc.w	22,31,10
	dc.l	greens		;3
	dc.w	16,0,15
	dc.l	greens		;3
	dc.w	16,15,21
	dc.l	reds		;bot penta
	dc.w	15,4,21
	dc.l	greens		;3
	dc.w	21,5,16
	dc.l	purples		;2
	dc.w	15,0,14
	dc.l	purples		;2
	dc.w	15,14,20
	dc.l	purples		;2
	dc.w	14,3,20
	dc.l	reds		;bot penta
	dc.w	20,4,15
	dc.l	purples		;2
	dc.w	14,0,13
	dc.l	purples		;2
	dc.w	14,13,19
	dc.l	purples		;nomams
	dc.w	13,2,19
	dc.l	purples		;2
	dc.w	19,3,14
	dc.l	greens		;3
	dc.w	16,12,0
	dc.l	greens		;3
	dc.w	16,17,12
	dc.l	greens		;nomans
	dc.w	12,17,1
	dc.l	greens		;3
	dc.w	17,16,5
	dc.l	blues		;nomans
	dc.w	13,0,12
	dc.l	blues		;2
	dc.w	13,12,18
	dc.l	blues		;2
	dc.w	12,1,18
	dc.l	blues		;2
	dc.w	18,2,13


cylynder1:
	dc.l	cylynder		;plain cylynder
	dc.l	cylynderfaces
cylynder2:
	dc.l	cylynder		;striped
	dc.l	cylynderfaces2
cylynder3:
	dc.l	cylynder		;striped
	dc.l	cylynderfaces3


cylynder:
	dc.w	19
	dc.w	293,-500,404
	dc.w	475,-500,154
	dc.w	475,-500,-154
	dc.w	293,-500,-404
	dc.w	000,-500,-500
	dc.w	-293,-500,-404
	dc.w	-475,-500,-154
	dc.w	-475,-500,154
	dc.w	-293,-500,404
	dc.w	000,-500,500
	dc.w	293,500,404
	dc.w	475,500,154
	dc.w	475,500,-154
	dc.w	293,500,-404
	dc.w	000,500,-500
	dc.w	-293,500,-404
	dc.w	-475,500,-154
	dc.w	-475,500,154
	dc.w	-293,500,404
	dc.w	000,500,500

cylynderfaces:
	dc.w	35
	dc.l	blues
	dc.w	11,01,00
	dc.l	blues
	dc.w	10,11,00
	dc.l	blues
	dc.w	12,02,01
	dc.l	blues
	dc.w	11,12,01
	dc.l	blues
	dc.w	13,03,02
	dc.l	blues
	dc.w	12,13,02
	dc.l	blues
	dc.w	14,04,03
	dc.l	blues
	dc.w	13,14,03
	dc.l	blues
	dc.w	15,05,04
	dc.l	blues
	dc.w	14,15,04
	dc.l	blues
	dc.w	16,06,05
	dc.l	blues
	dc.w	15,16,05
	dc.l	blues
	dc.w	17,07,06
	dc.l	blues
	dc.w	16,17,06
	dc.l	blues
	dc.w	18,08,07
	dc.l	blues
	dc.w	17,18,07
	dc.l	blues
	dc.w	19,09,08
	dc.l	blues
	dc.w	18,19,08
	dc.l	blues
	dc.w	10,00,09
	dc.l	blues
	dc.w	19,10,09
	dc.l	blues
	dc.w	00,01,02
	dc.l	blues
	dc.w	12,11,10
	dc.l	blues
	dc.w	00,02,03
	dc.l	blues
	dc.w	13,12,10
	dc.l	blues
	dc.w	00,03,04
	dc.l	blues
	dc.w	14,13,10
	dc.l	blues
	dc.w	00,04,05
	dc.l	blues
	dc.w	15,14,10
	dc.l	blues
	dc.w	00,05,06
	dc.l	blues
	dc.w	16,15,10
	dc.l	blues
	dc.w	00,06,07
	dc.l	blues
	dc.w	17,16,10
	dc.l	blues
	dc.w	00,07,08
	dc.l	blues
	dc.w	18,17,10
	dc.l	blues
	dc.w	00,08,09
	dc.l	blues
	dc.w	19,18,10


cylynderfaces3:
	dc.w	35
	dc.l	shinyyellows
	dc.w	11,01,00
	dc.l	shinyyellows
	dc.w	10,11,00
	dc.l	shinyyellows
	dc.w	12,02,01
	dc.l	shinyyellows
	dc.w	11,12,01
	dc.l	shinyyellows
	dc.w	13,03,02
	dc.l	shinyyellows
	dc.w	12,13,02
	dc.l	shinyyellows
	dc.w	14,04,03
	dc.l	shinyyellows
	dc.w	13,14,03
	dc.l	shinyyellows
	dc.w	15,05,04
	dc.l	shinyyellows
	dc.w	14,15,04
	dc.l	shinyyellows
	dc.w	16,06,05
	dc.l	shinyyellows
	dc.w	15,16,05
	dc.l	shinyyellows
	dc.w	17,07,06
	dc.l	shinyyellows
	dc.w	16,17,06
	dc.l	shinyyellows
	dc.w	18,08,07
	dc.l	shinyyellows
	dc.w	17,18,07
	dc.l	shinyyellows
	dc.w	19,09,08
	dc.l	shinyyellows
	dc.w	18,19,08
	dc.l	shinyyellows
	dc.w	10,00,09
	dc.l	shinyyellows
	dc.w	19,10,09
	dc.l	shinyyellows
	dc.w	00,01,02
	dc.l	shinyyellows
	dc.w	12,11,10
	dc.l	shinyyellows
	dc.w	00,02,03
	dc.l	shinyyellows
	dc.w	13,12,10
	dc.l	shinyyellows
	dc.w	00,03,04
	dc.l	shinyyellows
	dc.w	14,13,10
	dc.l	shinyyellows
	dc.w	00,04,05
	dc.l	shinyyellows
	dc.w	15,14,10
	dc.l	shinyyellows
	dc.w	00,05,06
	dc.l	shinyyellows
	dc.w	16,15,10
	dc.l	shinyyellows
	dc.w	00,06,07
	dc.l	shinyyellows
	dc.w	17,16,10
	dc.l	shinyyellows
	dc.w	00,07,08
	dc.l	shinyyellows
	dc.w	18,17,10
	dc.l	shinyyellows
	dc.w	00,08,09
	dc.l	shinyyellows
	dc.w	19,18,10

cylynderfaces2:
	dc.w	35
	dc.l	blues
	dc.w	11,01,00
	dc.l	blues
	dc.w	10,11,00
	dc.l	purples
	dc.w	12,02,01
	dc.l	purples
	dc.w	11,12,01
	dc.l	blues
	dc.w	13,03,02
	dc.l	blues
	dc.w	12,13,02
	dc.l	purples
	dc.w	14,04,03
	dc.l	purples
	dc.w	13,14,03
	dc.l	blues
	dc.w	15,05,04
	dc.l	blues
	dc.w	14,15,04
	dc.l	purples
	dc.w	16,06,05
	dc.l	purples
	dc.w	15,16,05
	dc.l	blues
	dc.w	17,07,06
	dc.l	blues
	dc.w	16,17,06
	dc.l	purples
	dc.w	18,08,07
	dc.l	purples
	dc.w	17,18,07
	dc.l	blues
	dc.w	19,09,08
	dc.l	blues
	dc.w	18,19,08
	dc.l	purples
	dc.w	10,00,09
	dc.l	purples
	dc.w	19,10,09
	dc.l	blues
	dc.w	00,01,02
	dc.l	blues
	dc.w	12,11,10
	dc.l	blues
	dc.w	00,02,03
	dc.l	blues
	dc.w	13,12,10
	dc.l	blues
	dc.w	00,03,04
	dc.l	blues
	dc.w	14,13,10
	dc.l	blues
	dc.w	00,04,05
	dc.l	blues
	dc.w	15,14,10
	dc.l	blues
	dc.w	00,05,06
	dc.l	blues
	dc.w	16,15,10
	dc.l	blues
	dc.w	00,06,07
	dc.l	blues
	dc.w	17,16,10
	dc.l	blues
	dc.w	00,07,08
	dc.l	blues
	dc.w	18,17,10
	dc.l	blues
	dc.w	00,08,09
	dc.l	blues
	dc.w	19,18,10
cone1:
	dc.l	cone
	dc.l	conefaces
cone:
	dc.w	11
	dc.w	000,000,-500
	dc.w	000,000,500
	dc.w	500,000,-500
	dc.w	404,293,-500
	dc.w	154,475,-500
	dc.w	-154,475,-500
	dc.w	-404,293,-500
	dc.w	-500,000,-500
	dc.w	-404,-293,-500
	dc.w	-154,-475,-500
	dc.w	154,-475,-500
	dc.w	404,-293,-500

conefaces:
	dc.w	19
	dc.l	yellows
	dc.w	03,02,01
	dc.l	yellows
	dc.w	03,00,02
	dc.l	yellows
	dc.w	04,03,01
	dc.l	yellows
	dc.w	04,00,03
	dc.l	yellows
	dc.w	05,04,01
	dc.l	yellows
	dc.w	05,00,04
	dc.l	yellows
	dc.w	06,05,01
	dc.l	yellows
	dc.w	06,00,05
	dc.l	yellows
	dc.w	07,06,01
	dc.l	yellows
	dc.w	07,00,06
	dc.l	yellows
	dc.w	08,07,01
	dc.l	yellows
	dc.w	08,00,07
	dc.l	yellows
	dc.w	09,08,01
	dc.l	yellows
	dc.w	09,00,08
	dc.l	yellows
	dc.w	10,09,01
	dc.l	yellows
	dc.w	10,00,09
	dc.l	yellows
	dc.w	11,10,01
	dc.l	yellows
	dc.w	11,00,10
	dc.l	yellows
	dc.w	02,11,01
	dc.l	yellows
	dc.w	02,00,11

ball1:
	dc.l	ball
	dc.l	ballfaces	;plain ball
ball2:
	dc.l	ball
	dc.l	ballfaces2	;checked

ball:
	dc.w	25
	dc.w	353,000,353
	dc.w	500,000,000
	dc.w	353,000,-353
	dc.w	000,000,-500
	dc.w	000,000,500
	dc.w	249,249,353
	dc.w	353,353,000
	dc.w	249,249,-353
	dc.w	000,353,353
	dc.w	000,500,000
	dc.w	000,353,-353
	dc.w	-249,249,353
	dc.w	-353,353,000
	dc.w	-249,249,-353
	dc.w	-353,000,353
	dc.w	-500,000,000
	dc.w	-353,000,-353
	dc.w	-249,-249,353
	dc.w	-353,-353,000
	dc.w	-249,-249,-353
	dc.w	000,-353,353
	dc.w	000,-500,000
	dc.w	000,-353,-353
	dc.w	249,-249,353
	dc.w	353,-353,000
	dc.w	249,-249,-353
ballfaces:
	dc.w	47
	dc.l	reds
	dc.w	06,01,00
	dc.l	reds
	dc.w	05,06,00
	dc.l	reds
	dc.w	07,02,01
	dc.l	reds
	dc.w	06,07,01
	dc.l	reds
	dc.w	07,03,02
	dc.l	reds
	dc.w	05,00,04
	dc.l	reds
	dc.w	09,06,05
	dc.l	reds
	dc.w	08,09,05
	dc.l	reds
	dc.w	10,07,06
	dc.l	reds
	dc.w	09,10,06
	dc.l	reds
	dc.w	10,03,07
	dc.l	reds
	dc.w	08,05,04
	dc.l	reds
	dc.w	12,09,08
	dc.l	reds
	dc.w	11,12,08
	dc.l	reds
	dc.w	13,10,09
	dc.l	reds
	dc.w	12,13,09
	dc.l	reds
	dc.w	13,03,10
	dc.l	reds
	dc.w	11,08,04
	dc.l	reds
	dc.w	15,12,11
	dc.l	reds
	dc.w	14,15,11
	dc.l	reds
	dc.w	16,13,12
	dc.l	reds
	dc.w	15,16,12
	dc.l	reds
	dc.w	16,03,13
	dc.l	reds
	dc.w	14,11,04
	dc.l	reds
	dc.w	18,15,14
	dc.l	reds
	dc.w	17,18,14
	dc.l	reds
	dc.w	19,16,15
	dc.l	reds
	dc.w	18,19,15
	dc.l	reds
	dc.w	19,03,16
	dc.l	reds
	dc.w	17,14,04
	dc.l	reds
	dc.w	21,18,17
	dc.l	reds
	dc.w	20,21,17
	dc.l	reds
	dc.w	22,19,18
	dc.l	reds
	dc.w	21,22,18
	dc.l	reds
	dc.w	22,03,19
	dc.l	reds
	dc.w	20,17,04
	dc.l	reds
	dc.w	24,21,20
	dc.l	reds
	dc.w	23,24,20
	dc.l	reds
	dc.w	25,22,21
	dc.l	reds
	dc.w	24,25,21
	dc.l	reds
	dc.w	25,03,22
	dc.l	reds
	dc.w	23,20,04
	dc.l	reds
	dc.w	01,24,23
	dc.l	reds
	dc.w	00,01,23
	dc.l	reds
	dc.w	02,25,24
	dc.l	reds
	dc.w	01,02,24
	dc.l	reds
	dc.w	02,03,25
	dc.l	reds
	dc.w	00,23,04
ballfaces2:
	dc.w	47
	dc.l	greys
	dc.w	06,01,00
	dc.l	greys
	dc.w	05,06,00
	dc.l	reds
	dc.w	07,02,01
	dc.l	reds
	dc.w	06,07,01
	dc.l	greys
	dc.w	07,03,02
	dc.l	reds
	dc.w	05,00,04
	dc.l	reds
	dc.w	09,06,05
	dc.l	reds
	dc.w	08,09,05
	dc.l	greys
	dc.w	10,07,06
	dc.l	greys
	dc.w	09,10,06
	dc.l	reds
	dc.w	10,03,07
	dc.l	greys
	dc.w	08,05,04
	dc.l	greys
	dc.w	12,09,08
	dc.l	greys
	dc.w	11,12,08
	dc.l	reds
	dc.w	13,10,09
	dc.l	reds
	dc.w	12,13,09
	dc.l	greys
	dc.w	13,03,10
	dc.l	reds
	dc.w	11,08,04
	dc.l	reds
	dc.w	15,12,11
	dc.l	reds
	dc.w	14,15,11
	dc.l	greys
	dc.w	16,13,12
	dc.l	greys
	dc.w	15,16,12
	dc.l	reds
	dc.w	16,03,13
	dc.l	greys
	dc.w	14,11,04
	dc.l	greys
	dc.w	18,15,14
	dc.l	greys
	dc.w	17,18,14
	dc.l	reds
	dc.w	19,16,15
	dc.l	reds
	dc.w	18,19,15
	dc.l	greys
	dc.w	19,03,16
	dc.l	reds
	dc.w	17,14,04
	dc.l	reds
	dc.w	21,18,17
	dc.l	reds
	dc.w	20,21,17
	dc.l	greys
	dc.w	22,19,18
	dc.l	greys
	dc.w	21,22,18
	dc.l	reds
	dc.w	22,03,19
	dc.l	greys
	dc.w	20,17,04
	dc.l	greys
	dc.w	24,21,20
	dc.l	greys
	dc.w	23,24,20
	dc.l	reds
	dc.w	25,22,21
	dc.l	reds
	dc.w	24,25,21
	dc.l	greys
	dc.w	25,03,22
	dc.l	reds
	dc.w	23,20,04
	dc.l	reds
	dc.w	01,24,23
	dc.l	reds
	dc.w	00,01,23
	dc.l	greys
	dc.w	02,25,24
	dc.l	greys
	dc.w	01,02,24
	dc.l	reds
	dc.w	02,03,25
	dc.l	greys
	dc.w	00,23,04
cube1:
	dc.l	cube
	dc.l	cubefaces
cube2:
	dc.l	cube
	dc.l	cubefaces2

cube:
	dc.w	7
	dc.w	400,-400,400
	dc.w	400,-400,-400
	dc.w	-400,-400,-400
	dc.w	-400,-400,400
	dc.w	400,400,400
	dc.w	400,400,-400
	dc.w	-400,400,-400
	dc.w	-400,400,400
cubefaces:
	dc.w	11
	dc.l	cyans
	dc.w	1,3,0
	dc.l	cyans
	dc.w	2,3,1
	dc.l	cyans
	dc.w	7,5,4
	dc.l	cyans
	dc.w	7,6,5
	dc.l	cyans
	dc.w	4,5,0
	dc.l	cyans
	dc.w	5,1,0
	dc.l	cyans
	dc.w	2,1,5
	dc.l	cyans
	dc.w	5,6,2
	dc.l	cyans
	dc.w	6,3,2
	dc.l	cyans
	dc.w	3,6,7
	dc.l	cyans
	dc.w	7,4,3
	dc.l	cyans
	dc.w	4,0,3

cubefaces2:
	dc.w	11
	dc.l	mono2
	dc.w	1,3,0
	dc.l	mono2
	dc.w	2,3,1
	dc.l	mono2
	dc.w	7,5,4
	dc.l	mono2
	dc.w	7,6,5
	dc.l	mono1
	dc.w	4,5,0
	dc.l	mono1
	dc.w	5,1,0
	dc.l	mono3
	dc.w	2,1,5
	dc.l	mono3
	dc.w	5,6,2
	dc.l	mono1
	dc.w	6,3,2
	dc.l	mono1
	dc.w	3,6,7
	dc.l	mono3
	dc.w	7,4,3
	dc.l	mono3
	dc.w	4,0,3

spyramid:
	dc.l	simplepyramid
	dc.l	simplepyramidfaces
simplepyramid:
	dc.w	3
*	dc.w	0,-500,-500
*	dc.w	500,-500,500
*	dc.w	-500,-500,500
*	dc.w	0,500,0

	dc.w	942,0,-333
	dc.w	-471,816,-333
	dc.w	-471,-816,-333
	dc.w	0,0,1000
	

simplepyramidfaces:
	dc.w	3
	dc.l	purples
	dc.w	0,1,2
	dc.l	purples
	dc.w	0,3,1
	dc.l	purples
	dc.w	2,1,3
	dc.l	purples
	dc.w	2,3,0
pyramid:
	dc.l	pyramidp
	dc.l	pfaces
pyramid2:
	dc.l	pyramidp
	dc.l	pfaces2
pfaces:
	dc.w	15
	dc.l	greens
	dc.w	0,1,8
	dc.l	greens
	dc.w	0,2,1
	dc.l	greens
	dc.w	0,3,2
	dc.l	greens
	dc.w	0,4,3
	dc.l	greens
	dc.w	0,5,4
	dc.l	greens
	dc.w	0,6,5
	dc.l	greens
	dc.w	0,7,6
	dc.l	greens
	dc.w	0,8,7
	dc.l	greens
	dc.w	9,1,2
	dc.l	greens
	dc.w	9,2,3
	dc.l	greens
	dc.w	9,3,4
	dc.l	greens
	dc.w	9,4,5
	dc.l	greens
	dc.w	9,5,6
	dc.l	greens
	dc.w	9,6,7
	dc.l	greens
	dc.w	9,7,8
	dc.l	greens
	dc.w	9,8,1
pfaces2:
	dc.w	15
	dc.l	shinyred
	dc.w	0,1,8
	dc.l	shinyred
	dc.w	0,2,1
	dc.l	shinyred
	dc.w	0,3,2
	dc.l	shinyred
	dc.w	0,4,3
	dc.l	shinyred
	dc.w	0,5,4
	dc.l	shinyred
	dc.w	0,6,5
	dc.l	shinyred
	dc.w	0,7,6
	dc.l	shinyred
	dc.w	0,8,7
	dc.l	shinyred
	dc.w	9,1,2
	dc.l	shinyred
	dc.w	9,2,3
	dc.l	shinyred
	dc.w	9,3,4
	dc.l	shinyred
	dc.w	9,4,5
	dc.l	shinyred
	dc.w	9,5,6
	dc.l	shinyred
	dc.w	9,6,7
	dc.l	shinyred
	dc.w	9,7,8
	dc.l	shinyred
	dc.w	9,8,1

pyramidp:
	dc.w 	9
	dc.w 	0,0,600
	dc.w 	0,-600,0
	dc.w 	420,-420,0
	dc.w 	600,0,0
	dc.w 	420,420,0
	dc.w 	0,600,0
	dc.w 	-420,420,0
	dc.w 	-600,0,0
	dc.w 	-420,-420,0
	dc.w 	0,0,-600

gouraud:
	movem.l	d0-d7/a0-a6,-(a7)
	move.w	z1,d0
	neg.w	d0
	add.w	#val200a,d0
	ext.l	d0
	asl.l 	#4,d0
	divs 	#val670a,d0
	bge.s 	large1
	moveq 	#0,d0
large1:
	cmp.w 	#val15a,d0
	ble.s 	small1
	move.w 	#val15a,d0
small1:
	move.w 	d0,topbright
	move.w 	z2,d0
	neg.w 	d0
	add.w 	#val200a,d0
	ext.l 	d0
	asl.l 	#4,d0
	divs 	#val670a,d0
	bge.s 	large2
	moveq 	#0,d0
large2:
	cmp.w 	#val15a,d0
	ble.s 	small2
	move.w 	#val15a,d0
small2:
	move.w 	d0,midbright
	move.w 	z3,d0
	neg.w 	d0
	add.w 	#val200a,d0
	ext.l 	d0
	asl.l 	#4,d0
	divs 	#val670a,d0
	bge.s 	large3
	moveq 	#0,d0
large3:
	cmp.w 	#val15a,d0
	ble.s 	small3
	move.w 	#val15a,d0
small3:
	move.w 	d0,botbright
	move.w 	x2,d0
	sub.w 	x1,d0
	move.w 	y3,d1
	sub.w 	y1,d1
	muls 	d1,d0

	move.w 	x3,d1
	sub.w 	x1,d1
	move.w 	y2,d2
	sub.w 	y1,d2
	muls 	d2,d1
	sub.l 	d1,d0
	move.l 	d0,d1
	sub.l 	#5,d0		;25
	ble 	nopoly

	move.l 	x1,d0
	move.l 	x2,d1
	cmp.w 	d0,d1
	bge.s 	noswap1
	move.l 	d0,x2
	move.l 	d1,x1

	move.w 	topbright,d0
	move.w 	midbright,topbright
	move.w 	d0,midbright
noswap1:
	move.l 	x2,d0
	move.l 	x3,d1
	cmp.w 	d0,d1
	bge.s 	noswap2
	move.l 	d0,x3
	move.l 	d1,x2
	move.w 	midbright,d0
	move.w 	botbright,midbright
	move.w 	d0,botbright
noswap2:
	move.l 	x1,d0
	move.l 	x2,d1
	cmp.w 	d0,d1
	bge.s 	noswap3
	move.l 	d0,x2
	move.l 	d1,x1
	move.w 	topbright,d0
	move.w 	midbright,topbright
	move.w 	d0,midbright
noswap3:
	move.w 	botbright,d0
	sub.w 	topbright,d0
	move.w 	d0,difftopbot

	move.w 	midbright,d0
	sub.w 	topbright,d0
	move.w 	d0,difftopmid

	move.w 	y3,d0
	sub.w 	y1,d0
	move.w 	d0,topbot
	move.w 	y2,d0
	sub.w 	y1,d0
	move.w 	d0,topmid
	move.w 	y3,d0
	sub.w 	y2,d0
	move.w 	d0,midbot

	move.w 	y1,d0
	move.w 	x1,d1
	move.w 	y3,cm1
	sub.w 	d0,cm1
	move.w 	x3,cm2
	sub.w 	d1,cm2
	move.w 	x2,cm3
	sub.w 	d1,cm3
	move.w 	y2,cm4
	sub.w 	d0,cm4
	move.w 	cm1,d1
	muls 	cm3,d1
	move.w 	cm2,d2
	muls 	cm4,d2
	sub.l 	d2,d1
	beq 	nopoly
	move.w 	d1,cm5
bpnow:
	move.w 	x1,d0
	move.w 	y1,d1
	move.w 	x2,d2
	move.w 	y2,d3
	move.w 	#0,d7
	bsr 	linedraw

	move.w 	x2,d0
	move.w 	y2,d1
	move.w 	x3,d2
	move.w 	y3,d3
	move.w 	#0,d7
	bsr 	linedraw

	move.w 	x1,d0
	move.w 	y1,d1
	move.w 	x3,d2
	move.w 	y3,d3
	move.w 	#0,d7
	bsr 	linedraw
bp2:
	lea 	lefts,a0
	move.w 	y1,d0
	move.w 	y3,d7
	sub.w 	d0,d7		;height of poly??
	add.w 	d0,d0
	adda.w 	d0,a0
	adda.w 	d0,a0		;a0 points to start of left right
	move.l 	viewscreen2,a4		;screen address
	muls 	#320,d0		;already mult by 2 up a bit, makes *640
	add.l 	d0,a4

	move.w 	midbright,d0
	muls 	topbot,d0
	asl.l 	#8,d0
	divs 	cm5,d0
	move.w 	d0,cm6

	move.w 	botbright,d0
	muls 	topmid,d0
	neg.l 	d0
	asl.l 	#8,d0
	divs 	cm5,d0
	add.w 	d0,cm6

	move.w 	topbright,d0
	muls 	midbot,d0
	neg.l 	d0
	asl.l 	#8,d0
	divs 	cm5,d0
	add.w 	d0,cm6

	moveq 	#0,d2	; y-y1
	move.l	facecolor,a1
	move.l	clipbot2,a5
	move.l	cliptop2,a6
plotem:
	movem.w	(a0)+,d0-d1
	sub.w 	d0,d1
	beq 	noplot
	lea	(a4,d0),a3	;a3 is screen add of line start
	asr.w 	#1,d1
	asr.w 	#1,d0
	sub.w 	x1,d0
	move.w 	cm1,d3
	muls 	d0,d3
	move.w 	cm2,d4
	muls 	d2,d4
	sub.l 	d4,d3
	asl.l 	#8,d3
	divs 	cm5,d3		; a

	move.w 	cm3,d4
	muls 	d2,d4
	move.w 	cm4,d5
	muls 	d0,d5
	sub.l 	d5,d4
	asl.l 	#8,d4
	divs 	cm5,d4		; b

	move.w 	topbright,d0
	ext.l 	d0
	asl.l 	#8,d0
	muls 	difftopmid,d3
	add.l 	d3,d0
	muls 	difftopbot,d4
	add.l 	d4,d0		; initial brightness
	move.w 	cm6,d6
	ext.l 	d6
	move.w 	d0,d5		;D0 IS COLOR (BRIGHTNESS)
	asr.w	#7,d5
	cmpi.w	#31,d5
	ble.s	.ok1
	moveq	#31,d5
	bra.s	.ok2
.ok1:
	tst.w	d5
	bge.s	.ok2
	moveq	#0,d5
.ok2:
	move.w	d5,d3
	asl.w	#1,d3
	asl.w 	#7,d5		;8
	sub.w 	d5,d0		; how far through first colour
	sub.w 	#sba,d0
	moveq 	#32,d5
	tst.w 	d6
	bge.s 	okok
	neg.w 	d0
	sub.w 	#sba,d0
	neg.w 	d6
	neg.w 	d5
okok:
	asr.w	#4,d5
	move.w	(a1,d3.w),d4
drawpoints:
	move.w	d4,(a3)+
np2:	add.w 	d6,d0
backone:
	ble.s 	nonext
	add.w 	d5,d3
	bge	.ok1
	moveq	#0,d3
	moveq	#0,d5
.ok1:
	cmp.w	#62,d3
	ble.s	.ok2
	move.w	#62,d3
	moveq	#0,d5
.ok2:
	move.w	(a1,d3.w),d4
	sub.w 	#sba,d0
	bra.s 	backone
nonext:
	dbra 	d1,drawpoints
noplot:
	lea	sw*2(a4),a4
np:	addq.w 	#1,d2
	dbra 	d7,plotem
nopoly:
	movem.l (a7)+,d0-d7/a0-a6
	rts

mono1:
	rept	32
*	      bitrrrrrggggggbbbbb
	dc.w	%1100011000011000
	endr
mono2:
	rept	32
*	      bitrrrrrggggggbbbbb
	dc.w	%0111001110001110
	endr
mono3:
	rept	32
*	      bitrrrrrggggggbbbbb
	dc.w	%0011000110000110
	endr
blues:
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000000000000000
g	set	g+%0000000000000000
b	set	b+%0000000000000001
	endr


shinyred:
r	set	0
g	set	0
b	set	0
	rept	20
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000000000000
b	set	b+%0000000000000000
	endr
	rept	11
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000010100000
b	set	b+%0000000000000011
	endr
	dc.w	-1	
shinyyellows:
r	set	0
g	set	0
b	set	0
	rept	20
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000001000000
b	set	b+%0000000000000000
	endr
	rept	11
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000001000000
b	set	b+%0000000000000011
	endr
	dc.w	-1	

purples:
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000000000000
b	set	b+%0000000000000001
	endr
cyans:
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000000001000000
g	set	g+%0000000000000000
b	set	b+%0000000000000001
	endr
 
yellows:				;yellow
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000001000000
b	set	b+%0000000000000000
	endr
greens:				;green
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000000000000000
g	set	g+%0000000001000000
b	set	b+%0000000000000000
	endr
reds:				;red
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000000000000
b	set	b+%0000000000000000
	endr
greys:				;grey
r	set	0
g	set	0
b	set	0
	rept	32
	dc.w	r|g|b
*		bitrrrrrggggggbbbbb
r	set	r+%0000100000000000
g	set	g+%0000000001000000
b	set	b+%0000000000000001
	endr


leftpt:
	dc.l	0
rightpt:
	dc.l	0
oldleft:
	dc.l 	0
oldright:
	dc.l 	0
cm1:
	dc.w 	0
cm2:
	dc.w 	0
cm3:
	dc.w 	0
cm4:
	dc.w 	0
cm5:
	dc.w 	0
cm6:
	dc.w 	0

x1: 	dc.w 	160
y1: 	dc.w 	60
x2: 	dc.w 	230
y2: 	dc.w 	110
x3: 	dc.w 	100
y3: 	dc.w 	160

z1: 	dc.w 	0
z2: 	dc.w 	0
z3: 	dc.w 	0

zvals:
	ds.l 	1600


linedraw:
	moveq 	#0,d7
	cmp.w 	d1,d3
	beq.s 	noline
	bge.s 	okdown
	exg 	d1,d3
	exg 	d0,d2
okdown:
	moveq 	#2,d6
	sub.w 	d1,d3		; dy

	sub.w 	d0,d2		; dx
	bge.s 	okright
	neg.w 	d2
	neg.w 	d6
okright:
	asl.w	#2,d1
	lea 	lefts,a0
	adda.w 	d1,a0
	move.w 	d0,d7		;x1
	add.w 	d7,d7		;x1*2
	move.w 	d3,d0		;dy
	moveq	#0,d1
	moveq	#0,d4
	moveq	#0,d5
lineloop:
	cmp.w 	2(a0),d7
	bgt.s 	onright
	blt.s 	onleft
			; still undecided
	move.w 	d7,(a0)+
	move.w 	d7,(a0)+
	add.w 	d2,d5
test:
	cmp.w 	d3,d5
	blt.s 	noacross
	sub.w 	d3,d5
	add.w 	d6,d7
	bra.s 	test
noacross:
	dbra 	d0,lineloop
noline:
	rts

onright:
	move.w 	2(a0),(a0)+
	move.w 	d7,(a0)+
	add.w 	d2,d5
test2:
	cmp.w 	d3,d5
	blt.s 	noacross2
	sub.w 	d3,d5
	add.w 	d6,d7
	bra.s 	test2
noacross2:
	dbra 	d0,onright
	rts

onleft:
	move.w 	d7,(a0)+
	addq.w 	#2,a0
	add.w 	d2,d5
test3:
	cmp.w 	d3,d5
	blt.s 	noacross3
	sub.w 	d3,d5
	add.w 	d6,d7
	bra.s 	test3
noacross3:
	dbra 	d0,onleft
	rts

xoff:
 	dc.w 	0
yoff:
 	dc.w 	0

lefts:	ds.w 	256
rights:	ds.w 	256
lefts2:	ds.w 	256
rights2:	ds.w 	256

showpt:	dc.l	0
clrpt:	dc.l	0
zpos: 	dc.w	0
scypos:	dc.w	0
xpos:	ds.w	320
saveinters:	dc.w	0
which:	dc.w	0
pts:	ds.l	16
leftbits:
rightbits:
dummy:	ds.w	512
botbright:	dc.w	15
midbright:	dc.w	8
topbright:	dc.w	0
difftopbot:	dc.w	0
difftopmid:	dc.w	0
brights:
val SET 0
 REPT 16
 dc.w val,val,val
val SET val+1
 ENDR 

val SET 15
 REPT 16
 dc.w val,val
val SET val-1
 ENDR 

endbr
toppt:	dc.l	0
botpt:	dc.l	0
midpt:	dc.l	0
topbot:	dc.w	0
topmid:	dc.w	0
midbot:	dc.w	0
sin:
	incbin "bigsine"
xspos:	dc.w	0
yspos:	dc.w	0
zspos:	dc.w	0
svals:
;xcos
	dc.w	0
;xsin
	dc.w	0 
;ycos
	dc.w	0
;ysin
	dc.w	0
;zcos
	dc.w	0
;zsin
	dc.w	0

keyboard:
*	move.w	#$ff,-(sp)
*	move.w	#$6,-(sp)
*	trap	#1
*	addq.l	#4,sp
	moveq	#0,d0
	move.b	key,d0
	tst.b	d0
	beq	keyback
*	swap	d0
	cmp.b	#16+$80,d0		*space
	beq	exit		*yes/no
	cmpi.b	#$39+$80,d0
	beq	pause
ckey:
	cmpi.b	#$2e+$80,d0
	bne	keyback
	neg.w	doclear
	move.b	#0,key
keyback:
	rts
doclear:	dc.w	1
pause:
	move.w	#7,-(sp)
	trap	#1
	addq.l	#2,sp
	rts

buttondat:	dc.w	0
mx:		dc.w	200
my:		dc.w	100
*************puts my mouse interupt in***************** 
putrout:move.w  #34,-(sp)
        trap    #14
        addq.l  #2,sp
        move.l  d0,a0
	move.l	16(a0),oldmouse
        move.l  #myrout,16(a0)
        rts
lastb:		dc.w	-1
mousehasgoneup:	dc.w	0

**************my ubeut mouse interupt*******************
myrout:
	movem.l	d0-d2/a0-a1,-(sp)
	moveq	#0,d0	
	move.b	(a0),d0
	cmpi.b	#$fa,d0
	bne	myr1
	move.w	#1,buttondat
	bra	myrxy
myr1:
	cmpi.b	#$f9,d0
	bne	myr2
	move.w	#2,buttondat
	bra	myrxy
myr2:
	cmpi.b	#$fb,d0
	bne	myr3
	move.w	#3,buttondat
	bra	myrxy
myr3:
	move.w	#1,mousehasgoneup
	move.w	#0,buttondat
myrxy:
	moveq	#0,d0
	move.b	1(a0),d0
	ext.w	d0
	moveq	#0,d1
	move.b	2(a0),d1
	ext.w	d1
*	asl.w	#mscale,d1
*	asl.w	#mscale,d0
	add.w	d0,mx
	add.w	d1,my
myr4:	move.w	mx,d0
	move.w	my,d1
	bsr	extra
	move.w	d0,mx
	move.w	d1,my
	movem.l	(sp)+,d0-d2/a0-a1
	rts

extra:  cmpi.w	#mminx,d0
        bge	extra1
        move.w	#mminx,d0
        bra	extra2
extra1: cmpi.w   #mmaxx,d0
        ble	extra2
        move.w  #mmaxx,d0
extra2:	cmpi.w  #mminy,d1
        bge	extra3
        move.w  #mminy,d1
        bra	extra4
extra3: cmpi.w   #mmaxy,d1
        ble	extra4
        move.w  #mmaxy,d1
extra4:
        rts

mminx:	equ	0
*mmaxx:	equ	2048*4
mmaxx:	equ	300
mminy:	equ	0
*mmaxy:	equ	2048*4
mmaxy:	equ	240


putvbl:
	move.l	vbl_vec,vblt+2		;set up vbl handler
	move.l	vbl_vec,oldvblvec
	move.l	#vbl_handler,vbl_vec
	rts

halfframe:	dc.w	0
ddl:		dc.w	-1
vbl_handler:
	move.w	#-1,vblflag
vblt:
	jmp	$0.L

exit:
		BSR stop_music
		BSR restore_ints		; restore gem..


*	move.w  #34,-(sp)
*        trap    #14
*        addq.l  #2,sp
*        move.l  d0,a0
*	move.l	oldmouse,16(a0)

*	move.w	#%0000000000000000,-(sp)	;stop the sound
*	move.w	#$88,-(sp)
*	trap	#14
*	addq.l	#4,sp
*	move.w	#$81,-(sp)		;unlock the sound system
*	trap	#14
*	addq.l	#2,sp

	lea	memlist,a6
demem:
	move.l	(a6)+,d0
	bmi	nomoremem
	beq	demem
	bsr	deallocate
	bra	demem
nomoremem:
*	move.l	oldvblvec,vbl_vec

	ifne	scon
	move.w	savemode,-(sp)
	move.w	#3,-(sp)
	move.l	savescreen,-(sp)
	move.l	savescreen,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#14,sp
	endc

	move.l	savesp,-(sp)
	move.w	#$20,-(sp)
	trap	#1
	addq.l	#6,sp

	clr.w	-(sp)
	trap	#1

deallocate:
	move.l	d0,-(sp)
	move.w	#$49,-(sp)
	trap	#1
	addq.l	#6,sp
	rts

*********************************************************
*	One call does it all				*
*	Allocates memory for 3 screens 			*
*	targa load/hold area is internal.		*
*	Then sets all the hardware stuff to create	*
*	a 384*480 16bit screen				*
*********************************************************
setupscreen:
	move.l	#((sw*2)*sh)+4+((sw*2)*100),-(sp)	;thats 1 screen size
	move.w	#$48,-(sp)
	trap	#1
	addq.l	#6,sp
	tst.l	d0
	bmi	exit
	move.l	d0,savemem1
	add.l	#4,d0
	and.l	#$fffffffc,d0
	move.l	d0,viewscreen1
	move.l	d0,a0

	move.l	#((sw*2)*sh)+4+((sw*2)*100),-(sp)	;thats 1 screen size
	move.w	#$48,-(sp)
	trap	#1
	addq.l	#6,sp
	tst.l	d0
	bmi	exit
	move.l	d0,savemem2
	add.l	#4,d0
	and.l	#$fffffffc,d0
	move.l	d0,viewscreen2

	ifne	scon

	move.w	#2,-(sp)
	trap	#14
	addq.l	#2,sp
	move.l	d0,savescreen


	move.w	#-1,-(sp)
	move.w	#88,-(sp)
	trap	#14
	addq.l	#4,sp
	move.w	d0,savemode

	move.w	#vertflag|vga|col40|bps16,-(sp)
	move.w	#3,-(sp)
	move.l	#-1,-(sp)
	move.l	#-1,-(sp)
	move.w	#5,-(sp)
	trap	#14
	add.l	#14,sp

*	move.l	#0,$ffff9800

	endc

	move.w	#2,-(sp)
	trap	#14
	addq.l	#2,sp
	move.l	d0,savescreen2

	rts


*********************************************************
*	copy whole screen with blitter			*
*	set screen to copy to in a1			*
*********************************************************
copywhole:
	move.l	savescreen2,a0
*	move.l	viewscreen,a1
	lea	blitter,a6
.waitblit:
	btst	#7,line_num(a6)
	bne	.waitblit

	move.l	a0,src_addr(a6)
	move.l	a1,dst_addr(a6)
	move.w	#2,src_xinc(a6)
	move.w	#2,dst_xinc(a6)
	move.w	#2,src_yinc(a6)
	move.w	#2,dst_yinc(a6)
	move.w	#sw,x_count(a6)
	move.w	#sh,y_count(a6)
	move.w	#-1,endmask1(a6)
	move.w	#-1,endmask2(a6)
	move.w	#-1,endmask3(a6)
	move.b	#0,skew(a6)
	move.b	#$3,op(a6)
	move.b	#2,hop(a6)
	bset	#6,line_num(a6)
	bset	#7,line_num(a6)
	rts


doscreens:
	lea	scrnback,a0
	move.l	savescreen2,a1
	jsr	ice_unpack
	move.l	viewscreen1,a1
	bsr	copywhole
	move.l	viewscreen2,a1
	bsr	copywhole
	rts

;********************************************* Unpackroutine von ICE-PACK
; assemble with Devpac or any other Assembler
; length of this unpacking routine: 294 bytes
;  a0 = address of packed data
;  a1 = address of unpacked data
ice_unpack:
	movem.l d0-a6,-(sp)
	bsr	ice04
	cmpi.l	#'Ice!',d0		; Is file packed?
	bne	ice03			; no, leave this routine
	bsr	ice04
	lea	-8(a0,d0.l),a5
	bsr	ice04
*	move.l	d0,(sp)
	movea.l a1,a4
	movea.l a1,a6
	adda.l	d0,a6
	movea.l a6,a3
	move.b	-(a5),d7
	bsr	ice06
ice03:
	movem.l (sp)+,d0-a6
	rts
ice04:	moveq	#3,d1
ice05:	lsl.l	#8,d0
	move.b	(a0)+,d0
	dbra	d1,ice05
	rts
ice06:	bsr	ice0a
	bcc	ice09
	moveq	#0,d1
	bsr	ice0a
	bcc	ice08
	lea	ice17(pc),a1
	moveq	#4,d3
ice07:	move.l	-(a1),d0
	bsr	ice0c
	swap	d0
	cmp.w	d0,d1
	dbne	d3,ice07
	add.l	20(a1),d1
ice08:	move.b	-(a5),-(a6)
	dbra	d1,ice08
ice09:	cmpa.l	a4,a6
	bgt	ice0f
	rts
ice0a:	add.b	d7,d7
	bne	ice0b
	move.b	-(a5),d7
	addx.b	d7,d7
ice0b:	rts
ice0c:	moveq	#0,d1
ice0d:	add.b	d7,d7
	bne	ice0e
	move.b	-(a5),d7
	addx.b	d7,d7
ice0e:	addx.w	d1,d1
	dbra	d0,ice0d
	rts
ice0f:	lea	ice18(pc),a1
	moveq	#3,d2
ice10:	bsr	ice0a
	dbcc	d2,ice10
	moveq	#0,d4
	moveq	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bmi	ice11
	bsr	ice0c
ice11:	move.b	6(a1,d2.w),d4
	add.w	d1,d4
	beq	ice13
	lea	ice19(pc),a1
	moveq	#1,d2
ice12:	bsr	ice0a
	dbcc	d2,ice12
	moveq	#0,d1
	move.b	1(a1,d2.w),d0
	ext.w	d0
	bsr	ice0c
	add.w	d2,d2
	add.w	6(a1,d2.w),d1
	bpl	ice15
	sub.w	d4,d1
	bra	ice15
ice13:	moveq	#0,d1
	moveq	#5,d0
	moveq	#-1,d2
	bsr	ice0a
	bcc	ice14
	moveq	#8,d0
	moveq	#$3f,d2
ice14:	bsr	ice0c
	add.w	d2,d1
ice15:	lea	2(a6,d4.w),a1
	adda.w	d1,a1
	move.b	-(a1),-(a6)
ice16:	move.b	-(a1),-(a6)
	dbra	d4,ice16
	bra	ice06

	DC.B $7f,$ff,$00,$0e,$00,$ff,$00,$07
	DC.B $00,$07,$00,$02,$00,$03,$00,$01
	DC.B $00,$03,$00,$01
ice17:	DC.B $00,$00,$01,$0d,$00,$00,$00,$0e
	DC.B $00,$00,$00,$07,$00,$00,$00,$04
	DC.B $00,$00,$00,$01
ice18:	DC.B $09,$01,$00,$ff,$ff,$08,$04,$02
	DC.B $01,$00
ice19:	DC.B $0b,$04,$07,$00,$01,$1f,$ff,$ff
	DC.B $00,$1f
	even

;-------------------------------------------------------------------------
; Subroutines for interrupts and replay.

; Save mfp vectors and ints and install our own.(very 'clean' setup rout)

init_ints	MOVEQ #$13,D0			; pause keyboard
		BSR Writeikbd			; (stop from sending)
		MOVE #$2700,SR
		LEA old_stuff+32(PC),A0
		MOVE.B $FFFFFA07.W,(A0)+
		MOVE.B $FFFFFA09.W,(A0)+
		MOVE.B $FFFFFA13.W,(A0)+
		MOVE.B $FFFFFA15.W,(A0)+	; Save mfp registers 
		MOVE.B $FFFFFA19.W,(A0)+
		MOVE.B $FFFFFA1F.W,(A0)+
		MOVE.L $70.W,(A0)+
		MOVE.L $B0.W,(A0)+
		MOVE.L $118.W,(A0)+
		MOVE.L $134.W,(A0)+
		CLR.B $fffffa07.W
		MOVE.B #$40,$fffffa09.W
		CLR.B $fffffa13.W
		MOVE.B #$40,$fffffa15.W
		BCLR.B #3,$fffffa17.W		; software end of int.
		LEA my_vbl(PC),A0
		MOVE.L A0,$70.W			; set our vbl
		LEA key_rout(PC),A0
		MOVE.L A0,$118.W		; and our keyrout.
		LEA supers(PC),A0
		MOVE.L A0,$B0.W
		CLR key			
		MOVE #$2300,SR
		MOVEQ #$11,D0			; resume sending
		BSR Writeikbd
		MOVEQ #$12,D0			; kill mouse
		BSR Writeikbd
		BSR flush
		RTS

supers		BCHG #13-8,(SP)			; toggle super
		RTE

; Restore mfp vectors and ints.

restore_ints	
		MOVEQ #$13,D0			; pause keyboard
		BSR Writeikbd			; (stop from sending)
		MOVE #$2700,SR
		LEA old_stuff+32(PC),A0
		MOVE.B (A0)+,$FFFFFA07.W
		MOVE.B (A0)+,$FFFFFA09.W
		MOVE.B (A0)+,$FFFFFA13.W
		MOVE.B (A0)+,$FFFFFA15.W	; restore mfp
		MOVE.B (A0)+,$FFFFFA19.W
		MOVE.B (A0)+,$FFFFFA1F.W
		MOVE.L (A0)+,$70.W
		MOVE.L (A0)+,$B0.W
		MOVE.L (A0)+,$118.W
		MOVE.L (A0)+,$134.W
		BSET.B #3,$FFFFFA17.W
		MOVE #$2300,SR
		MOVEQ #$11,D0			; resume
		BSR Writeikbd		
		MOVEQ #$8,D0			; restore mouse.
		BSR Writeikbd
		BSR flush
		RTS

; Wait for a vbl..

Wait_Vbl	MOVE #37,-(SP)
		TRAP #14
		ADDQ.L #2,SP
		RTS

; Wait for a vbl,(Not Gems..)

Wait_VblNG	MOVE.W vbl_timer(PC),D0
.waitvb		CMP.W vbl_timer(PC),D0
		BEQ.S .waitvb
		RTS

old_stuff:	DS.L 18
oldsp		DS.L 1

; Flush IKBD

flush		BTST.B #0,$FFFFFC00.W		; any waiting?
		BEQ.S .flok			; exit if none waiting.
		MOVE.B $FFFFFC02.W,D0		; get next in queue
		BRA.S flush			; and continue
.flok		RTS

; Write d0 to IKBD

Writeikbd	BTST.B #1,$FFFFFC00.W
		BEQ.S Writeikbd			; wait for ready
		MOVE.B D0,$FFFFFC02.W		; and send...
		RTS

; Keyboard handler interrupt routine...
; (crap)

key_rout	PEA (A0)
		MOVE D0,-(SP)
		MOVE.B $FFFFFC00.W,D0
		BTST #7,D0			; int req?
		BEQ.S .end			
		BTST #0,D0			; 
		BEQ.S .end
		LEA keytab(PC),A0
		MOVE.B $FFFFFC02.W,D0
		MOVE.B D0,key			; store keypress
		BGE.S .pressed 			; naff naff ultra naff
.released	AND.W #$7F,D0
		SF.B (A0,D0)
.end		MOVE (SP)+,D0
		MOVE.L (SP)+,A0
		RTE
.pressed	AND.W #$7F,D0
		ST.B (A0,D0)
		MOVE (SP)+,D0
		MOVE.L (SP)+,A0
		RTE

key		DC.W 0
keytab		DS.B 256			; 'held' down table!

; The vbl - simply increments a timer.

my_vbl		MOVE.W #$2700,SR
	move.w	#-1,vblflag
*		MOVE.L #$00f0f000,$FFFF9800.W
		ADDQ #1,vbl_timer
		RTE
vbl_timer	DC.W 0


RealTempo	dc.w 125
OldTempo	dc.w 125

; Various variables.

modlength	DC.L 0
mt_data_ptr	DC.L 0
error_no	DC.L 0
errorflag	DC.B 0
tempo_cont_flg	DC.B -1
playingtxt	DC.B "Now Playing : "
realmodname	DS.B 24
unnamed_mod	DC.B "Unnamed Module!",0
loading		DC.B 27,"E","Loading : "
filename	DS.B 128
		EVEN

thetext
 dc.b 27,"E"	
 dc.b "  ProTracker V2.1a Replay  ",$a,$d
 dc.b "- Falcon030 Version v1.2p -",$a,$d
 dc.b "       Programmed by       ",$a,$d
 dc.b " Griff of Electronic Images",$a,$d,$a,$d
 dc.b 0
		EVEN

;-----------------------------------------------------------------------;

; Here we have the replay rout.

; Initialise Music Sequencer and ST Specific bits (e.g interrupts etc.)
; D0=0 then turn music OFF. D1=0 straight off else d1=fadeOUT speed.
; D0=1 then turn music ON.  D1=0 straight on else d1=fadeIN speed.

Init_ST		LEA vol_bitflag(PC),A0	
		BSET #0,(A0)		; still fading.
		LEA fadeINflag(PC),A0
		SF (A0)			; reset fade IN flag 
		LEA fadeOUTflag(PC),A0
		SF (A0)			; reset fade OUT flag
		TST.B D0		
		BNE.S .init_music

; Deinitialise music - turn off/fade out.

.deinit_music	TST.B D1		; any fade down?
		BNE.S .trigfadedown
		LEA global_vol(PC),A0
		MOVE.W #$0,(A0) 	; turn off music
		RTS
.trigfadedown	LEA fadeOUTflag(PC),A0
		ST.B (A0)+
		MOVE.B D1,(A0)+
		MOVE.B D1,(A0)+
		RTS

; Initialise music - turn on/fade in.

.init_music	TST.B D1
		BNE.S .trigfadein
		LEA global_vol(PC),A0
		MOVE.W #$40,(A0) 	; assume no fade in.
		BSR mt_init 
		BRA STspecific
.trigfadein	LEA global_vol(PC),A0
		MOVE.W #$0,(A0) 	; ensure zero to start with!
		LEA fadeINflag(PC),A0
		ST.B (A0)+
		MOVE.B D1,(A0)+
		MOVE.B D1,(A0)+
		BSR mt_init 
		BRA STspecific

vol_bitflag	DC.W 0			; bit 0 is 1 if we are fading!
global_vol	DC.W 0
fadeOUTflag	DC.B 0
fadeOUTcurr	DC.B 0
fadeOUTspeed	DC.B 0
fadeINflag	DC.B 0
fadeINcurr	DC.B 0
fadeINspeed	DC.B 0

		EVEN

; Paula emulation storage structure.

		RSRESET
sam_start	RS.L 1				; sample start
sam_length	RS.L 1				; sample length
sam_period	RS.W 1				; sample period(freq)
sam_vol		RS.W 1				; sample volume
sam_lpstart	RS.L 1				; sample loop start
sam_lplength	RS.L 1	 			; sample loop length
sam_vcsize	RS.B 1				; structure size.

ch1s		DS.B sam_vcsize
ch2s		DS.B sam_vcsize			; shadow channel regs
ch3s		DS.B sam_vcsize
ch4s		DS.B sam_vcsize
shadow_dmacon	DS.W 1
shadow_filter	DS.W 1

; Macro to move parameter '\1' into the shadow dma register...
; (Remember - bit 15 of 'dmacon' determines clearing or setting of bits!)

move_dmacon	MACRO
.setdma\@	MOVE.W D4,-(Sp)			; save D4
		MOVE.W \1,D4
		BTST #15,D4			; set or clear?
		BNE.S .setbits\@		
.clearbits\@	NOT.W D4			; zero so clear
		AND.W D4,shadow_dmacon		; mask bits in dmacon
		BRA.S .dmacon_set\@		; and exit...
.setbits\@	OR.W D4,shadow_dmacon		; not zero so set 'em
.dmacon_set\@	MOVE.W (sp)+,D4			; restore D4
		ENDM

; Player - This is THE  'Paula' Emulator.

do_music:	BSR Set_DMA
		MOVE.W #$2500,SR
*		MOVE.W #$300,$FFFF8240.W
*		MOVE.L #$00f0f0f0,$FFFF9800.W
		MOVEM.L D0-D7/A0-A6,-(SP)
.do_fadein	LEA fadeINflag(PC),A0
		TST.B (A0)			; are we fadeing down?
		BEQ.S .nofadein
		SUBQ.B #1,1(A0)			; curr count-1
		BNE.S .nofadein
		MOVE.B 2(A0),1(A0)		; reset count
		LEA global_vol(PC),A1
		CMP #$40,(A1)			; reached max?
		BLT.S .notinyet
		SF (A0)				; global vol=$40!
		LEA vol_bitflag(PC),A1
		BCLR #0,(A1)			; signal fade done
		BRA.S .nofadein
.notinyet	ADDQ #1,(A1)			; global vol+1
.nofadein
.do_fadedown	LEA fadeOUTflag(PC),A0
		TST.B (A0)			; are we fadeing down?
		BEQ.S .nofadedown
		SUBQ.B #1,1(A0)			; curr count-1
		BNE.S .nofadedown
		MOVE.B 2(A0),1(A0)		; reset count
		LEA global_vol(PC),A1
		TST.W (A1)
		BNE.S .notdownyet
		SF (A0)				; global vol=0!
		LEA vol_bitflag(PC),A1
		BCLR #0,(A1)			; signal fade done
		BRA.S .nofadedown
.notdownyet	SUBQ #1,(A1)			; global vol-1
.nofadedown	

		LEA.L Voice1Set(PC),A0		; Setup Chan 1
		LEA.L ch1s(PC),A5
		MOVEQ #0,D4
		BSR SetupVoice		
		LEA.L Voice2Set(PC),A0		;      "     2
		LEA.L ch2s(PC),A5
		MOVEQ #1,D4
		BSR SetupVoice		
		LEA.L Voice3Set(PC),A0  	;      "     3
		LEA.L ch3s(PC),A5
		MOVEQ #2,D4
		BSR SetupVoice
		LEA.L Voice4Set(PC),A0  	;      "     4
		LEA.L ch4s(PC),A5
		MOVEQ #3,D4
		BSR SetupVoice
		BSR Goforit
		BSR mt_music
skipit1		MOVEM.L (SP)+,D0-D7/A0-A6
skipit		
*		MOVE.L #$00000000,$FFFF9800.W
*		MOVE.W #$000,$FFFF8240.W
		RTE

		RSRESET
Vaddr		RS.L 1
Voffy		RS.L 1
Vfrac		RS.L 1
Vfreqint	RS.W 1				; structure produced
Vfreqfrac	RS.L 1
Vvoltab		RS.W 1				; from 'paula' data
Vlpaddr		RS.L 1
Vlpoffy		RS.L 1
Vlpfreqint	RS.W 1
Vlpfreqfrac	RS.L 1

; Routine to add/move one voice to buffer. The real Paula emulation part!!

SetupVoice	MOVE.L sam_start(A5),A2		; current sample end address(shadow amiga!)
		MOVE.L sam_length(A5),D0
		MOVEM.W sam_period(A5),D1/D2	; offset/period/volume
		CMP.W #$40,D2
		BLS.S .ok
		MOVEQ #$40,D2
.ok		MULU global_vol(PC),D2
		LSR #6,D2			; /64
		LSL.W #8,D2			; offset into volume tab
		ADD.W D2,D2
		LEA ftab(PC),A6
.OK2		MULU #6,D1
		ADD.L D1,A6
		MOVE.W (A6)+,D1			; int part
		MOVE.L (A6)+,D3
.zero		NEG.L D0			; negate sample offset
		MOVE.W shadow_dmacon(PC),D7
		BTST D4,D7
		BNE.S .vcon2
		MOVEQ #0,D1			; clear freq if off.
		MOVEQ #0,D3			; clear freq if off.
		MOVEQ #0,D2			; volume off for safety!!
.vcon2		
		LEA nulsamp+2(PC),A6
		CMP.L A6,A2
		BNE.S .vcon
		MOVEQ #0,D1			; clear freq if off.
		MOVEQ #0,D3			; clear freq if off.
		MOVEQ #0,D2			; volume off for safety!!
.vcon		MOVE.L sam_lpstart(a5),A6	; loop addr
		MOVE.L sam_lplength(a5),D5	; loop length
		NEG.L D5			; negate it.
		MOVE.W D1,D6			; freq on loop
		MOVE.L D3,D7			;
		CMP.L #-2,D5
		BNE.S .isloop
.noloop		MOVEQ #0,D6
		MOVEQ #0,D7			; no loop-no frequency
		LEA nulsamp+2(PC),A6		; no loop-point to nul
.isloop		MOVE.L A2,(A0)+			; store address
		MOVE.L D0,(A0)+			; store offset int.L
		ADDQ.L #4,A0			; skip current frac.l
		MOVE.W D1,(A0)+			; store freq int.w
		MOVE.L D3,(A0)+			; store freq 32bit fraction
		MOVE.W D2,(A0)+			; address of volume tab.
		MOVE.L A6,(A0)+			; store loop addr
		MOVE.L D5,(A0)+			; store loop offset.L
		MOVE.W D6,(A0)+			; store loop freq int.w
		MOVE.L D7,(A0)+			; store loop freq frac.L
		RTS
ftab		DS.W 3
		INCBIN FRQ32BIT.TAB

ciaem_tab	INCBIN CIA_EMU.TAB

; Make that buffer! (channels are paired together!)

Goforit		LEA ch1s(PC),A2
		LEA ch3s(PC),A3
		LEA Voice1Set(PC),A5
		LEA Voice3Set(PC),A6
		MOVE.W #0,bufoff
		BSR do2chans
		LEA ch2s(PC),A2
		LEA ch4s(PC),A3
		LEA Voice2Set(PC),A5
		LEA Voice4Set(PC),A6
		MOVE.W #2,bufoff
		BSR do2chans
		RTS

; Create 2 channels in the buffer.

do2chans	MOVEM.L A2-A3/A5-A6,-(SP)
		MOVE.L voltab_ptr(PC),D2
		MOVE.L D2,D3
		MOVEQ #0,D4
		MOVE.W Vvoltab(A5),D4
		ADD.L D4,D2			; volume tab chan 1
		MOVE.W Vvoltab(A6),D4
		ADD.L D4,D3			; volume tab chan 2

		MOVE.L Vaddr(A5),A0		; ptr to end of each sample!
		MOVE.L Voffy(A5),D0		; int.w offset
		MOVE.L Vfrac(A5),D4		; frac.w offset
		MOVE.W Vfreqint(A5),D6 
		MOVE.L Vfreqfrac(A5),A2		; frac.w/int.w freq

		MOVE.L Vaddr(A6),A1
		MOVE.L Voffy(A6),D1
		MOVE.L Vfrac(A6),D5
		MOVE.W Vfreqint(A6),D7
		MOVE.L Vfreqfrac(A6),A3	
		SWAP D6

		MOVE.L Vlpaddr(A5),lp1start
		MOVE.L Vlpoffy(A5),lp1off
		MOVE.L Vlpfreqfrac(A5),lp1freqfrac
		MOVE.W Vlpfreqint(A5),lp1freqwhole

		MOVE.L Vlpaddr(A6),lp2start
		MOVE.L Vlpoffy(A6),lp2off
		MOVE.L Vlpfreqfrac(A6),lp2freqfrac
		MOVE.W Vlpfreqint(A6),lp2freqwhole

		LEA ciaem_tab(PC),A4
		MOVE.W RealTempo(PC),D6
		ADD.W D6,D6
		MOVE.W (A4,D6),D6

		MOVE.L stebuf_ptrs(pc),a4
		BSR add2

		MOVEM.L (SP)+,A2-A3/A5-A6
		NEG.L D0			; +ve offset(as original!)
		NEG.L D1		
		MOVE.L A0,sam_start(A2)		; store voice address
		MOVE.L D0,sam_length(A2)	; store offset for next time
		MOVE.L D4,Vfrac(A5)		; store frac part
		MOVE.L A1,sam_start(A3)		; same for chan 2
		MOVE.L D1,sam_length(A3)		
		MOVE.L D5,Vfrac(A6)
		RTS

add2		SUBQ #1,D6
		LEA (a4),a6
		ADD.W bufoff(pc),a6
		MOVE.L d2,a4
		MOVE.L d3,a5
		MOVEQ #0,D2
make12_stelp	MOVE.B (A0,D0.L),D2
		MOVE.W (A4,d2.W*2),D3
		MOVE.B (A1,D1.L),D2
		ADD.W (A5,d2.W*2),D3
		MOVE.W D3,(a6)+
		ADDQ.L #2,A6
		SWAP D6
		ADD.L A2,D4			; 32 bit fraction
		ADDX.W D6,D0
		BCS.S lpvc1ste
contlp1ste	SWAP D6
		ADD.L A3,D5			; 
		ADDX.W D7,D1
contlp2ste	DBCS D6,make12_stelp
		BCS.S lpvc2ste
exitadd12	RTS

lpvc1ste	EXT.L D0
		MOVE.L lp1start(pc),A0	    ; 0+2
		ADD.L lp1off(pc),D0	    ; 6+4
		MOVE.L lp1freqfrac(pc),A2   ; 12+2
		MOVE.W lp1freqwhole(pc),D6  ; 18+2
		BRA.S contlp1ste
lp1start	dc.l 0
lp1off		dc.l 0
lp1freqfrac	dc.l 0
lp1freqwhole	dc.w 0

lpvc2ste	EXT.L D1
		MOVE.L lp2start(PC),A1	    ; 0+2
		ADD.L lp2off(PC),D1	    ; 6+2
		MOVE.L lp2freqfrac(PC),A3   ; 12+2
		MOVE.W lp2freqwhole(PC),D7  ; 18+2
		MOVE.W #0,CCR
		BRA.S contlp2ste	
lp2start	dc.l 0
lp2off		dc.l 0
lp2freqfrac	dc.l 0
lp2freqwhole	dc.w 0

bufoff		dc.w 0

Voice1Set	DS.L 10
Voice2Set	DS.L 10		 ; voice data (setup from 'paula' data)
Voice3Set	DS.L 10
Voice4Set	DS.L 10

		DS.L 16		; (in case!!)
nulsamp		DS.L 16		; nul sample
music_on	DC.W 0		; music on flag
voltab_ptr	DC.L 0		; ptr to volume table
                   
; ST specific initialise - sets up shadow amiga registers etc

STspecific:	BSR makevoltab
		LEA nulsamp+2(PC),A2
		MOVEQ #0,D0
		LEA ch1s(pc),A0
		BSR initvoice
		LEA ch2s(pc),A0
		BSR initvoice
		LEA ch3s(pc),A0
		BSR initvoice
		LEA ch4s(pc),A0
		BSR initvoice
		BSR start_music
		LEA music_on(PC),A0
		ST (A0)
		RTS

; A0-> voice data (paula voice) to initialise.

initvoice:	MOVE.L	A2,sam_start(A0)    ; point voice to nul sample
		MOVE.L	#2,sam_length(A0)		
		MOVE.W	D0,sam_period(A0)   ; period=0
		MOVE.W	D0,sam_vol(A0)	    ; volume=0
		MOVE.L	A2,sam_lpstart(A0)  ; and loop point to nul sample
		MOVE.L	#2,sam_lplength(A0)
		RTS

; Start up music.

start_music:	BSR Set_DMA
		BSR Start_DMA
		MOVE.W #$2700,SR
		BSET.B #5,$FFFFFA07.W	;iera
		BSET.B #5,$FFFFFA13.W	;imra
		MOVE.B #0,$FFFFFA19.W
		MOVE.B #1,$FFFFFA1F.W
		MOVE.B #8,$FFFFFA19.W	;timer a event mode.
		MOVE.L #do_music,$134.W
		MOVE.W #$2300,SR
		RTS

; Set DMA to play buffer(buffer len based on TEMPO)

Set_DMA		MOVEM.L D0/A0-a1,-(SP)
		MOVE.L stebuf_ptrs+4(PC),A0
		LEA ciaem_tab(PC),A1
		MOVE.W RealTempo(PC),D0
		MOVE.W (A1,D0*2),D0
		LSL.W #2,D0
		MOVE.L A0,a1
		ADD.W D0,A1
		PEA (A1)
		PEA (A0)
setptrs		bclr #7,$FFFF8901.W		; set play dma!
		clr.w d0			; (hehe!)
		move.b 3(a7),d0		
		move.w d0,$FFFF8906.W
		move.b 2(a7),d0		
		move.w d0,$FFFF8904.W
		move.b 1(a7),d0		
		move.w d0,$FFFF8902.W	
		move.b 7(a7),d0		
		move.w d0,$FFFF8912.W
		move.b 6(a7),d0		
		move.w d0,$FFFF8910.W
		move.b 5(a7),d0		
		move.w d0,$FFFF890E.W
		ADDQ.L #8,SP
		MOVEM.L stebuf_ptrs(PC),A0/A1
		EXG A0,A1
		MOVEM.L A0-A1,stebuf_ptrs
		MOVEM.L (SP)+,D0/A0-a1
		RTS

Start_DMA	bsr locksound
		moveq #6,d0
		moveq #2,d0
		bsr soundcom
		moveq #1,d0
		bsr setmode
		moveq #0,d0
		moveq #0,d1
		bsr settracks
		moveq #0,d0
		bsr setmontracks
		moveq #0,d0
		moveq #1,d1
		bsr setinterrupt
		moveq #3,d0
		bsr setbufptr
		moveq #0,d0
		moveq #8,d1
		moveq #0,d2
		moveq #1,d3
		moveq #1,d4
		bsr devconnect
		RTS

locksound	move.w #128,-(sp)
		trap #14
		addq.l #2,sp
		rts
unlocksound	move.w #129,-(sp)
		trap #14
		addq.l #2,sp
		rts
soundcom	move.w d1,-(sp)
		move.w d0,-(sp)
		move.w #130,-(sp)
		trap #14
		addq.l #6,sp
		rts
setmode		move.w d0,-(sp)
		move.w #132,-(sp)
		trap #14
		addq.l #4,sp
		rts
settracks	move.w d1,-(sp)
		move.w d0,-(sp)
		move.w #133,-(sp)
		trap #14
		addq.l #6,sp
		rts
setmontracks	move.w d0,-(sp)
		move.w #134,-(sp)
		trap #14
		addq.l #4,sp
		rts
setinterrupt	move.w d1,-(sp)
		move.w d0,-(sp)
		move.w #135,-(sp)
		trap #14
		addq.l #6,sp
		rts

setbufptr	
		move.w d0,-(sp)
		move.w #136,-(sp)
		trap #14
		addq.l #4,sp
		rts

devconnect	move.w d4,-(sp)
		move.w d3,-(sp)
		move.w d2,-(sp)
		move.w d1,-(sp)
		move.w d0,-(sp)
		move.w #139,-(sp)
		trap #14
		lea 12(sp),sp
		rts

stop_music:	moveq #0,d0
		bsr setbufptr
		bsr unlocksound
		MOVE.W #$2700,SR
		BCLR.B #5,$FFFFFA07.W		; iera
		BCLR.B #5,$FFFFFA13.W		; imra
		MOVE.W #$2300,SR
		RTS 

; Create the 65 volume lookup tables

makevoltab:	MOVE.L #vols,D0
		MOVE.L D0,A0
		MOVE.L A0,voltab_ptr
		ADD.L #16640*2,A0
		MOVEQ #$40,D0 
.lp1		MOVE.W #$FF,D1 
.lp2		MOVE.W D1,D2 
		EXT.W D2
		MULS D0,D2 
		ASL.W #1,D2
		MOVE.W D2,-(A0)
		DBF D1,.lp2
		DBF D0,.lp1
		LEA stebuf1,A0
		LEA stebuf2,A1
		MOVE.W #bufsize-1,d0
		MOVEQ #0,D1
.lp		MOVE.L d1,(A0)+
		MOVE.L d1,(A1)+
		DBF D0,.lp
		RTS

; ----- Protracker V2.1A Playroutine ----- 

; CIA Version 1:
; This playroutine is not very fast, optimized or well commented,
; but all the new commands in PT2.1 should work.
; If it's not good enough, you'll have to change it yourself.
; We'll try to write a faster routine soon...

; Changes from V1.0C playroutine:
; - Vibrato depth changed to be compatible with Noisetracker 2.0.
;   You'll have to double all vib. depths on old PT modules.
; - Funk Repeat changed to Invert Loop.
; - Period set back earlier when stopping an effect.

n_note		EQU	0  ; W
n_cmd		EQU	2  ; W
n_cmdlo		EQU	3  ; B
n_start		EQU	4  ; L
n_length	EQU	8  ; W
n_loopstart	EQU	10 ; L
n_replen	EQU	14 ; W
n_period	EQU	16 ; W
n_finetune	EQU	18 ; B
n_volume	EQU	19 ; B
n_dmabit	EQU	20 ; W
n_toneportdirec	EQU	22 ; B
n_toneportspeed	EQU	23 ; B
n_wantedperiod	EQU	24 ; W
n_vibratocmd	EQU	26 ; B
n_vibratopos	EQU	27 ; B
n_tremolocmd	EQU	28 ; B
n_tremolopos	EQU	29 ; B
n_wavecontrol	EQU	30 ; B
n_glissfunk	EQU	31 ; B
n_sampleoffset	EQU	32 ; B
n_pattpos	EQU	33 ; B
n_loopcount	EQU	34 ; B
n_funkoffset	EQU	35 ; B
n_wavestart	EQU	36 ; L
n_reallength	EQU	40 ; W

mt_init	MOVE.L	mt_data_ptr(PC),A0
	MOVE.L	A0,mt_SongDataPtr
	MOVE.L	A0,A1
	LEA	952(A1),A1
	MOVEQ	#127,D0
	MOVEQ	#0,D1
mtloop	MOVE.L	D1,D2
	SUBQ.W	#1,D0
mtloop2	MOVE.B	(A1)+,D1
	CMP.B	D2,D1
	BGT.S	mtloop
	DBRA	D0,mtloop2
	ADDQ.B	#1,D2
			
	LEA	mt_SampleStarts(PC),A1
	ASL.L	#8,D2
	ASL.L	#2,D2
	ADD.L	#1084,D2
	ADD.L	A0,D2
	MOVE.L	D2,A2
	MOVEQ	#30,D0
mtloop3	CLR.L	(A2)
	MOVE.L	A2,(A1)+
	MOVEQ	#0,D1
	MOVE.W	42(A0),D1
	ASL.L	#1,D1
	ADD.L	D1,A2
	ADD.L	#30,A0
	DBRA	D0,mtloop3

	MOVE.B	#6,mt_speed
	CLR.B	mt_counter
	CLR.B	mt_SongPos
	CLR.W	mt_PatternPos
	ST	mt_Enable
	move_dmacon #$F
	RTS

mt_end	SF	mt_Enable
	move_dmacon #$F
	RTS

mt_music
	TST.B	mt_Enable
	BEQ	mt_exit
	ADDQ.B	#1,mt_counter
	MOVE.B	mt_counter(PC),D0
	CMP.B	mt_speed(PC),D0
	BLO.S	mt_NoNewNote
	CLR.B	mt_counter
	TST.B	mt_PattDelTime2
	BEQ.S	mt_GetNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_dskip

mt_NoNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_NoNewPosYet

mt_NoNewAllChannels
	LEA	ch1s(PC),A5
	LEA	mt_chan1temp(PC),A6
	BSR	mt_CheckEfx
	LEA	ch2s(PC),A5
	LEA	mt_chan2temp(PC),A6
	BSR	mt_CheckEfx
	LEA	ch3s(PC),A5
	LEA	mt_chan3temp(PC),A6
	BSR	mt_CheckEfx
	LEA	ch4s(PC),A5
	LEA	mt_chan4temp(PC),A6
	BRA	mt_CheckEfx

mt_GetNewNote
	MOVE.L	mt_SongDataPtr(PC),A0
	LEA	12(A0),A3
	LEA	952(A0),A2	;pattpo
	LEA	1084(A0),A0	;patterndata
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	MOVE.B	mt_SongPos(PC),D0
	MOVE.B	(A2,D0.W),D1
	ASL.L	#8,D1
	ASL.L	#2,D1
	ADD.W	mt_PatternPos(PC),D1
	CLR.W	mt_DMACONtemp

	LEA	ch1s(PC),A5
	LEA	mt_chan1temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	ch2s(PC),A5
	LEA	mt_chan2temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	ch3s(PC),A5
	LEA	mt_chan3temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	ch4s(PC),A5
	LEA	mt_chan4temp(PC),A6
	BSR.S	mt_PlayVoice
	BRA	mt_SetDMA

mt_PlayVoice
	TST.L	(A6)
	BNE.S	mt_plvskip
	BSR	mt_PerNop
mt_plvskip
	MOVE.L	(A0,D1.L),(A6)
	ADDQ.L	#4,D1
	MOVEQ	#0,D2
	MOVE.B	n_cmd(A6),D2
	AND.B	#$F0,D2
	LSR.B	#4,D2
	MOVE.B	(A6),D0
	AND.B	#$F0,D0
	OR.B	D0,D2
	TST.B	D2
	BEQ	mt_SetRegs
	MOVEQ	#0,D3
	LEA	mt_SampleStarts(PC),A1
	MOVE	D2,D4
	SUBQ.L	#1,D2
	ASL.L	#2,D2
	MULU	#30,D4
	MOVE.L	(A1,D2.L),n_start(A6)
	MOVE.W	(A3,D4.L),n_length(A6)
	MOVE.W	(A3,D4.L),n_reallength(A6)
	MOVE.B	2(A3,D4.L),n_finetune(A6)
	MOVE.B	3(A3,D4.L),n_volume(A6)
	MOVE.W	4(A3,D4.L),D3 ; Get repeat
	TST.W	D3
	BEQ.S	mt_NoLoop
	MOVE.L	n_start(A6),D2	; Get start
	ASL.W	#1,D3
	ADD.L	D3,D2		; Add repeat
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	4(A3,D4.L),D0	; Get repeat
	ADD.W	6(A3,D4.L),D0	; Add replen
	MOVE.W	D0,n_length(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,sam_vol(A5)	; Set volume
	BRA.S	mt_SetRegs

mt_NoLoop
	MOVE.L	n_start(A6),D2
	ADD.L	D3,D2
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,sam_vol(A5)	; Set volume
mt_SetRegs
	MOVE.W	(A6),D0
	AND.W	#$0FFF,D0
	BEQ	mt_CheckMoreEfx	; If no note
	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0E50,D0
	BEQ.S	mt_DoSetFineTune
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#3,D0	; TonePortamento
	BEQ.S	mt_ChkTonePorta
	CMP.B	#5,D0
	BEQ.S	mt_ChkTonePorta
	CMP.B	#9,D0	; Sample Offset
	BNE.S	mt_SetPeriod
	BSR	mt_CheckMoreEfx
	BRA.S	mt_SetPeriod

mt_DoSetFineTune
	BSR	mt_SetFineTune
	BRA.S	mt_SetPeriod

mt_ChkTonePorta
	BSR	mt_SetTonePorta
	BRA	mt_CheckMoreEfx

mt_SetPeriod
	MOVEM.L	D0-D1/A0-A1,-(SP)
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	LEA	mt_PeriodTable(PC),A1
	MOVEQ	#0,D0
	MOVEQ	#36,D2
mt_ftuloop
	CMP.W	(A1,D0.W),D1
	BHS.S	mt_ftufound
	ADDQ.L	#2,D0
	DBRA	D2,mt_ftuloop
mt_ftufound
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	ADD.L	D1,A1
	MOVE.W	(A1,D0.W),n_period(A6)
	MOVEM.L	(SP)+,D0-D1/A0-A1

	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0ED0,D0 ; Notedelay
	BEQ	mt_CheckMoreEfx

	move_dmacon n_dmabit(A6)
	BTST	#2,n_wavecontrol(A6)
	BNE.S	mt_vibnoc
	CLR.B	n_vibratopos(A6)
mt_vibnoc
	BTST	#6,n_wavecontrol(A6)
	BNE.S	mt_trenoc
	CLR.B	n_tremolopos(A6)
mt_trenoc
	MOVE.L	n_start(A6),sam_start(A5)	; Set start
	MOVEQ #0,D0
	MOVE.W	n_length(A6),D0
	ADD.L D0,D0
	ADD.L D0,sam_start(A5)
	MOVE.L D0,sam_length(A5)		; Set length

	MOVE.W	n_period(A6),D0
	MOVE.W	D0,sam_period(A5)		; Set period
	MOVE.W	n_dmabit(A6),D0
	OR.W	D0,mt_DMACONtemp
	BRA	mt_CheckMoreEfx
 
mt_SetDMA
	MOVE.W	mt_DMACONtemp(PC),D0
	OR.W	#$8000,D0
	move_dmacon d0

	LEA ch4s(PC),A5
	LEA mt_chan4temp(PC),A6
	MOVE.L n_loopstart(A6),sam_lpstart(A5)
	MOVEQ #0,D0
	MOVE.W	n_replen(A6),D0
	ADD.L D0,D0
	MOVE.L D0,sam_lplength(A5)
	ADD.L D0,sam_lpstart(A5)

	LEA ch3s(PC),A5
	LEA mt_chan3temp(PC),A6
	MOVE.L n_loopstart(A6),sam_lpstart(A5)
	MOVEQ #0,D0
	MOVE.W	n_replen(A6),D0
	ADD.L D0,D0
	MOVE.L D0,sam_lplength(A5)
	ADD.L D0,sam_lpstart(A5)

	LEA ch2s(PC),A5
	LEA mt_chan2temp(PC),A6
	MOVE.L n_loopstart(A6),sam_lpstart(A5)
	MOVEQ #0,D0
	MOVE.W	n_replen(A6),D0
	ADD.L D0,D0
	MOVE.L D0,sam_lplength(A5)
	ADD.L D0,sam_lpstart(A5)

	LEA ch1s(PC),A5
	LEA mt_chan1temp(PC),A6
	MOVE.L n_loopstart(A6),sam_lpstart(A5)
	MOVEQ #0,D0
	MOVE.W	n_replen(A6),D0
	ADD.L D0,D0
	MOVE.L D0,sam_lplength(A5)
	ADD.L D0,sam_lpstart(A5)

mt_dskip
	ADD.W	#16,mt_PatternPos
	MOVE.B	mt_PattDelTime,D0
	BEQ.S	mt_dskc
	MOVE.B	D0,mt_PattDelTime2
	CLR.B	mt_PattDelTime
mt_dskc	TST.B	mt_PattDelTime2
	BEQ.S	mt_dska
	SUBQ.B	#1,mt_PattDelTime2
	BEQ.S	mt_dska
	SUB.W	#16,mt_PatternPos
mt_dska	TST.B	mt_PBreakFlag
	BEQ.S	mt_nnpysk
	SF	mt_PBreakFlag
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	CLR.B	mt_PBreakPos
	LSL.W	#4,D0
	MOVE.W	D0,mt_PatternPos
mt_nnpysk
	CMP.W	#1024,mt_PatternPos
	BLO.S	mt_NoNewPosYet
mt_NextPosition	
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	LSL.W	#4,D0
	MOVE.W	D0,mt_PatternPos
	CLR.B	mt_PBreakPos
	CLR.B	mt_PosJumpFlag
	ADDQ.B	#1,mt_SongPos
	AND.B	#$7F,mt_SongPos
	MOVE.B	mt_SongPos(PC),D1
	MOVE.L	mt_SongDataPtr(PC),A0
	CMP.B	950(A0),D1
	BLO.S	mt_NoNewPosYet
	CLR.B	mt_SongPos
mt_NoNewPosYet	
	TST.B	mt_PosJumpFlag
	BNE.S	mt_NextPosition
mt_exit	
	RTS

mt_CheckEfx
	BSR	mt_UpdateFunk
	MOVE.W	n_cmd(A6),D0
	AND.W	#$0FFF,D0
	BEQ.S	mt_PerNop
	MOVE.B	n_cmd(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_Arpeggio
	CMP.B	#1,D0
	BEQ	mt_PortaUp
	CMP.B	#2,D0
	BEQ	mt_PortaDown
	CMP.B	#3,D0
	BEQ	mt_TonePortamento
	CMP.B	#4,D0
	BEQ	mt_Vibrato
	CMP.B	#5,D0
	BEQ	mt_TonePlusVolSlide
	CMP.B	#6,D0
	BEQ	mt_VibratoPlusVolSlide
	CMP.B	#$E,D0
	BEQ	mt_E_Commands
SetBack	MOVE.W	n_period(A6),sam_period(A5)
	CMP.B	#7,D0
	BEQ	mt_Tremolo
	CMP.B	#$A,D0
	BEQ	mt_VolumeSlide
mt_Return
	RTS

mt_PerNop
	MOVE.W	n_period(A6),sam_period(A5)
	RTS

mt_Arpeggio
	MOVEQ	#0,D0
	MOVE.B	mt_counter(PC),D0
	DIVS	#3,D0
	SWAP	D0
	CMP.W	#0,D0
	BEQ.S	mt_Arpeggio2
	CMP.W	#2,D0
	BEQ.S	mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#15,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio2
	MOVE.W	n_period(A6),D2
	BRA.S	mt_Arpeggio4

mt_Arpeggio3
	ASL.W	#1,D0
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D1,A0
	MOVEQ	#0,D1
	MOVE.W	n_period(A6),D1
	MOVEQ	#36,D3
mt_arploop
	MOVE.W	(A0,D0.W),D2
	CMP.W	(A0),D1
	BHS.S	mt_Arpeggio4
	ADDQ.L	#2,A0
	DBRA	D3,mt_arploop
	RTS

mt_Arpeggio4
	MOVE.W	D2,sam_period(A5)
	RTS

mt_FinePortaUp
	TST.B	mt_counter
	BNE.S	mt_Return
	MOVE.B	#$0F,mt_LowMask
mt_PortaUp
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	SUB.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#113,D0
	BPL.S	mt_PortaUskip
	AND.W	#$F000,n_period(A6)
	OR.W	#113,n_period(A6)
mt_PortaUskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,sam_period(A5)
	RTS	
 
mt_FinePortaDown
	TST.B	mt_counter
	BNE	mt_Return
	MOVE.B	#$0F,mt_LowMask
mt_PortaDown
	CLR.W	D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	ADD.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#856,D0
	BMI.S	mt_PortaDskip
	AND.W	#$F000,n_period(A6)
	OR.W	#856,n_period(A6)
mt_PortaDskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,sam_period(A5)
	RTS

mt_SetTonePorta
	MOVE.L	A0,-(SP)
	MOVE.W	(A6),D2
	AND.W	#$0FFF,D2
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#37*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D0,A0
	MOVEQ	#0,D0
mt_StpLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_StpFound
	ADDQ.W	#2,D0
	CMP.W	#37*2,D0
	BLO.S	mt_StpLoop
	MOVEQ	#35*2,D0
mt_StpFound
	MOVE.B	n_finetune(A6),D2
	AND.B	#8,D2
	BEQ.S	mt_StpGoss
	TST.W	D0
	BEQ.S	mt_StpGoss
	SUBQ.W	#2,D0
mt_StpGoss
	MOVE.W	(A0,D0.W),D2
	MOVE.L	(SP)+,A0
	MOVE.W	D2,n_wantedperiod(A6)
	MOVE.W	n_period(A6),D0
	CLR.B	n_toneportdirec(A6)
	CMP.W	D0,D2
	BEQ.S	mt_ClearTonePorta
	BGE	mt_Return
	MOVE.B	#1,n_toneportdirec(A6)
	RTS

mt_ClearTonePorta
	CLR.W	n_wantedperiod(A6)
	RTS

mt_TonePortamento
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_TonePortNoChange
	MOVE.B	D0,n_toneportspeed(A6)
	CLR.B	n_cmdlo(A6)
mt_TonePortNoChange
	TST.W	n_wantedperiod(A6)
	BEQ	mt_Return
	MOVEQ	#0,D0
	MOVE.B	n_toneportspeed(A6),D0
	TST.B	n_toneportdirec(A6)
	BNE.S	mt_TonePortaUp
mt_TonePortaDown
	ADD.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BGT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)
	BRA.S	mt_TonePortaSetPer

mt_TonePortaUp
	SUB.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BLT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)

mt_TonePortaSetPer
	MOVE.W	n_period(A6),D2
	MOVE.B	n_glissfunk(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_GlissSkip
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#36*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D0,A0
	MOVEQ	#0,D0
mt_GlissLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_GlissFound
	ADDQ.W	#2,D0
	CMP.W	#36*2,D0
	BLO.S	mt_GlissLoop
	MOVEQ	#35*2,D0
mt_GlissFound
	MOVE.W	(A0,D0.W),D2
mt_GlissSkip
	MOVE.W	D2,sam_period(A5) ; Set period
	RTS

mt_Vibrato
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Vibrato2
	MOVE.B	n_vibratocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_vibskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_vibskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_vibskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_vibskip2
	MOVE.B	D2,n_vibratocmd(A6)
mt_Vibrato2
	MOVE.B	n_vibratopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	AND.B	#$03,D2
	BEQ.S	mt_vib_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_vib_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_vib_set
mt_vib_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_vib_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_sine
	MOVE.B	(A4,D0.W),D2
mt_vib_set
	MOVE.B	n_vibratocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#7,D2
	MOVE.W	n_period(A6),D0
	TST.B	n_vibratopos(A6)
	BMI.S	mt_VibratoNeg
	ADD.W	D2,D0
	BRA.S	mt_Vibrato3
mt_VibratoNeg
	SUB.W	D2,D0
mt_Vibrato3
	MOVE.W	D0,sam_period(A5)
	MOVE.B	n_vibratocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_vibratopos(A6)
	RTS

mt_TonePlusVolSlide
	BSR	mt_TonePortNoChange
	BRA	mt_VolumeSlide

mt_VibratoPlusVolSlide
	BSR.S	mt_Vibrato2
	BRA	mt_VolumeSlide

mt_Tremolo
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Tremolo2
	MOVE.B	n_tremolocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_treskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_treskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_treskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_treskip2
	MOVE.B	D2,n_tremolocmd(A6)
mt_Tremolo2
	MOVE.B	n_tremolopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	LSR.B	#4,D2
	AND.B	#$03,D2
	BEQ.S	mt_tre_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_tre_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_tre_set
mt_tre_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_tre_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_sine
	MOVE.B	(A4,D0.W),D2
mt_tre_set
	MOVE.B	n_tremolocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#6,D2
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	TST.B	n_tremolopos(A6)
	BMI.S	mt_TremoloNeg
	ADD.W	D2,D0
	BRA.S	mt_Tremolo3
mt_TremoloNeg
	SUB.W	D2,D0
mt_Tremolo3
	BPL.S	mt_TremoloSkip
	CLR.W	D0
mt_TremoloSkip
	CMP.W	#$40,D0
	BLS.S	mt_TremoloOk
	MOVE.W	#$40,D0
mt_TremoloOk
	MOVE.W	D0,sam_vol(A5)
	MOVE.B	n_tremolocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_tremolopos(A6)
	RTS

mt_SampleOffset
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_sononew
	MOVE.B	D0,n_sampleoffset(A6)
mt_sononew
	MOVE.B	n_sampleoffset(A6),D0
	LSL.W	#7,D0
	CMP.W	n_length(A6),D0
	BGE.S	mt_sofskip
	SUB.W	D0,n_length(A6)
	LSL.W	#1,D0
	ADD.L	D0,n_start(A6)
	RTS
mt_sofskip
	MOVE.W	#$0001,n_length(A6)
	RTS

mt_VolumeSlide
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	TST.B	D0
	BEQ.S	mt_VolSlideDown
mt_VolSlideUp
	ADD.B	D0,n_volume(A6)
	CMP.B	#$40,n_volume(A6)
	BMI.S	mt_vsuskip
	MOVE.B	#$40,n_volume(A6)
mt_vsuskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,sam_vol(A5)
	RTS

mt_VolSlideDown
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
mt_VolSlideDown2
	SUB.B	D0,n_volume(A6)
	BPL.S	mt_vsdskip
	CLR.B	n_volume(A6)
mt_vsdskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,sam_vol(A5)
	RTS

mt_PositionJump
	MOVE.B	n_cmdlo(A6),D0
	SUBQ.B	#1,D0
	MOVE.B	D0,mt_SongPos
mt_pj2	CLR.B	mt_PBreakPos
	ST 	mt_PosJumpFlag
	RTS

mt_VolumeChange
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	CMP.B	#$40,D0
	BLS.S	mt_VolumeOk
	MOVEQ	#$40,D0
mt_VolumeOk
	MOVE.B	D0,n_volume(A6)
	MOVE.W	D0,sam_vol(A5)
	RTS

mt_PatternBreak
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	MOVE.L	D0,D2
	LSR.B	#4,D0
	MULU	#10,D0
	AND.B	#$0F,D2
	ADD.B	D2,D0
	CMP.B	#63,D0
	BHI.S	mt_pj2
	MOVE.B	D0,mt_PBreakPos
	ST	mt_PosJumpFlag
	RTS

mt_SetSpeed
	MOVEQ	#0,D0
	MOVE.B	3(A6),D0
	BEQ	mt_end
	TST.B tempo_cont_flg		; tempo control on?
	BEQ.S .notempo
	CMP.B	#32,D0			; yes then d0>=32
	BHS	SetTempo		; then Set Tempo
	CLR.B	mt_counter
	MOVE.B	D0,mt_speed
	RTS
.notempo				; tempo control is OFF
	CLR.B	mt_counter
	MOVE.B	D0,mt_speed		; so set speed  regardless
	CMP.W   #32,D0
	BLO.S 	.okdefspeed
	MOVE.W D0,OldTempo		; but store in old tempo
.okdefspeed				; for tempo turn back on.
	RTS

SetTempo
	CMP.W	#32,D0
	BHS.S	setemsk
	MOVEQ	#32,D0
setemsk	MOVE.W	D0,RealTempo		; set tempo speed
	RTS

mt_CheckMoreEfx
	BSR	mt_UpdateFunk
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#$9,D0
	BEQ	mt_SampleOffset
	CMP.B	#$B,D0
	BEQ	mt_PositionJump
	CMP.B	#$D,D0
	BEQ	mt_PatternBreak
	CMP.B	#$E,D0
	BEQ.S	mt_E_Commands
	CMP.B	#$F,D0
	BEQ	mt_SetSpeed
	CMP.B	#$C,D0
	BEQ	mt_VolumeChange
	BRA	mt_PerNop

mt_E_Commands
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	LSR.B	#4,D0
	BEQ.S	mt_FilterOnOff
	CMP.B	#1,D0
	BEQ	mt_FinePortaUp
	CMP.B	#2,D0
	BEQ	mt_FinePortaDown
	CMP.B	#3,D0
	BEQ.S	mt_SetGlissControl
	CMP.B	#4,D0
	BEQ	mt_SetVibratoControl
	CMP.B	#5,D0
	BEQ	mt_SetFineTune
	CMP.B	#6,D0
	BEQ	mt_JumpLoop
	CMP.B	#7,D0
	BEQ	mt_SetTremoloControl
	CMP.B	#9,D0
	BEQ	mt_RetrigNote
	CMP.B	#$A,D0
	BEQ	mt_VolumeFineUp
	CMP.B	#$B,D0
	BEQ	mt_VolumeFineDown
	CMP.B	#$C,D0
	BEQ	mt_NoteCut
	CMP.B	#$D,D0
	BEQ	mt_NoteDelay
	CMP.B	#$E,D0
	BEQ	mt_PatternDelay
	CMP.B	#$F,D0
	BEQ	mt_FunkIt
	RTS

mt_FilterOnOff
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#1,D0
	ASL.B	#1,D0
;	AND.B	#$FD,$BFE001		; filter!
;	OR.B	D0,$BFE001		; hehe
	RTS	

mt_SetGlissControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	RTS

mt_SetVibratoControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_SetFineTune
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	MOVE.B	D0,n_finetune(A6)
	RTS

mt_JumpLoop
	TST.B	mt_counter
	BNE	mt_Return
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_SetLoop
	TST.B	n_loopcount(A6)
	BEQ.S	mt_jumpcnt
	SUBQ.B	#1,n_loopcount(A6)
	BEQ	mt_Return
mt_jmploop	MOVE.B	n_pattpos(A6),mt_PBreakPos
	ST	mt_PBreakFlag
	RTS

mt_jumpcnt
	MOVE.B	D0,n_loopcount(A6)
	BRA.S	mt_jmploop

mt_SetLoop
	MOVE.W	mt_PatternPos(PC),D0
	LSR.W	#4,D0
	MOVE.B	D0,n_pattpos(A6)
	RTS

mt_SetTremoloControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_RetrigNote
	MOVE.L	D1,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
	BNE.S	mt_rtnskp
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	BNE	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
mt_rtnskp
	DIVU	D0,D1
	SWAP	D1
	TST.W	D1
	BNE.S	mt_rtnend
mt_DoRetrig
	move_dmacon n_dmabit(A6)	; Channel DMA off
	MOVE.L	n_start(A6),sam_start(A5) ; Set sampledata pointer
	MOVEQ #0,D0
	MOVE.W	n_length(A6),D0		; Set length
	ADD.L D0,D0
	ADD.L D0,sam_start(A5)
	MOVE.L D0,sam_length(A5)		; Set length

	MOVE.W	n_dmabit(A6),D0
	BSET	#15,D0
	move_dmacon d0
	MOVE.L	n_loopstart(A6),sam_lpstart(A5)
	MOVEQ #0,D0
	MOVE.W	n_replen(A6),D0
	ADD.L D0,D0
	ADD.L D0,sam_lpstart(A5)
	MOVE.L D0,sam_lplength(A5)
	MOVE.W	n_replen+2(A6),sam_period(A5)
mt_rtnend
	MOVE.L	(SP)+,D1
	RTS

mt_VolumeFineUp
	TST.B	mt_counter
	BNE	mt_Return
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F,D0
	BRA	mt_VolSlideUp

mt_VolumeFineDown
	TST.B	mt_counter
	BNE	mt_Return
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BRA	mt_VolSlideDown2

mt_NoteCut
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_counter(PC),D0
	BNE	mt_Return
	CLR.B	n_volume(A6)
	MOVE.W	#0,sam_vol(A5)
	RTS

mt_NoteDelay
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_counter,D0
	BNE	mt_Return
	MOVE.W	(A6),D0
	BEQ	mt_Return
	MOVE.L	D1,-(SP)
	BRA	mt_DoRetrig

mt_PatternDelay
	TST.B	mt_counter
	BNE	mt_Return
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	TST.B	mt_PattDelTime2
	BNE	mt_Return
	ADDQ.B	#1,D0
	MOVE.B	D0,mt_PattDelTime
	RTS

mt_FunkIt
	TST.B	mt_counter
	BNE	mt_Return
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	TST.B	D0
	BEQ	mt_Return
mt_UpdateFunk
	MOVEM.L	A0/D1,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_glissfunk(A6),D0
	LSR.B	#4,D0
	BEQ.S	mt_funkend
	LEA	mt_FunkTable(PC),A0
	MOVE.B	(A0,D0.W),D0
	ADD.B	D0,n_funkoffset(A6)
	BTST	#7,n_funkoffset(A6)
	BEQ.S	mt_funkend
	CLR.B	n_funkoffset(A6)

	MOVE.L	n_loopstart(A6),D0
	MOVEQ	#0,D1
	MOVE.W	n_replen(A6),D1
	ADD.L	D1,D0
	ADD.L	D1,D0
	MOVE.L	n_wavestart(A6),A0
	ADDQ.L	#1,A0
	CMP.L	D0,A0
	BLO.S	mt_funkok
	MOVE.L	n_loopstart(A6),A0
mt_funkok
	MOVE.L	A0,n_wavestart(A6)
	MOVEQ	#-1,D0
	SUB.B	(A0),D0
	MOVE.B	D0,(A0)
mt_funkend
	MOVEM.L	(SP)+,A0/D1
	RTS


mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128

mt_VibratoTable	
	dc.b   0, 24, 49, 74, 97,120,141,161
	dc.b 180,197,212,224,235,244,250,253
	dc.b 255,253,250,244,235,224,212,197
	dc.b 180,161,141,120, 97, 74, 49, 24

mt_PeriodTable
; Tuning 0, Normal
	dc.w	856,808,762,720,678,640,604,570,538,508,480,453
	dc.w	428,404,381,360,339,320,302,285,269,254,240,226
	dc.w	214,202,190,180,170,160,151,143,135,127,120,113
; Tuning 1
	dc.w	850,802,757,715,674,637,601,567,535,505,477,450
	dc.w	425,401,379,357,337,318,300,284,268,253,239,225
	dc.w	213,201,189,179,169,159,150,142,134,126,119,113
; Tuning 2
	dc.w	844,796,752,709,670,632,597,563,532,502,474,447
	dc.w	422,398,376,355,335,316,298,282,266,251,237,224
	dc.w	211,199,188,177,167,158,149,141,133,125,118,112
; Tuning 3
	dc.w	838,791,746,704,665,628,592,559,528,498,470,444
	dc.w	419,395,373,352,332,314,296,280,264,249,235,222
	dc.w	209,198,187,176,166,157,148,140,132,125,118,111
; Tuning 4
	dc.w	832,785,741,699,660,623,588,555,524,495,467,441
	dc.w	416,392,370,350,330,312,294,278,262,247,233,220
	dc.w	208,196,185,175,165,156,147,139,131,124,117,110
; Tuning 5
	dc.w	826,779,736,694,655,619,584,551,520,491,463,437
	dc.w	413,390,368,347,328,309,292,276,260,245,232,219
	dc.w	206,195,184,174,164,155,146,138,130,123,116,109
; Tuning 6
	dc.w	820,774,730,689,651,614,580,547,516,487,460,434
	dc.w	410,387,365,345,325,307,290,274,258,244,230,217
	dc.w	205,193,183,172,163,154,145,137,129,122,115,109
; Tuning 7
	dc.w	814,768,725,684,646,610,575,543,513,484,457,431
	dc.w	407,384,363,342,323,305,288,272,256,242,228,216
	dc.w	204,192,181,171,161,152,144,136,128,121,114,108
; Tuning -8
	dc.w	907,856,808,762,720,678,640,604,570,538,508,480
	dc.w	453,428,404,381,360,339,320,302,285,269,254,240
	dc.w	226,214,202,190,180,170,160,151,143,135,127,120
; Tuning -7
	dc.w	900,850,802,757,715,675,636,601,567,535,505,477
	dc.w	450,425,401,379,357,337,318,300,284,268,253,238
	dc.w	225,212,200,189,179,169,159,150,142,134,126,119
; Tuning -6
	dc.w	894,844,796,752,709,670,632,597,563,532,502,474
	dc.w	447,422,398,376,355,335,316,298,282,266,251,237
	dc.w	223,211,199,188,177,167,158,149,141,133,125,118
; Tuning -5
	dc.w	887,838,791,746,704,665,628,592,559,528,498,470
	dc.w	444,419,395,373,352,332,314,296,280,264,249,235
	dc.w	222,209,198,187,176,166,157,148,140,132,125,118
; Tuning -4
	dc.w	881,832,785,741,699,660,623,588,555,524,494,467
	dc.w	441,416,392,370,350,330,312,294,278,262,247,233
	dc.w	220,208,196,185,175,165,156,147,139,131,123,117
; Tuning -3
	dc.w	875,826,779,736,694,655,619,584,551,520,491,463
	dc.w	437,413,390,368,347,328,309,292,276,260,245,232
	dc.w	219,206,195,184,174,164,155,146,138,130,123,116
; Tuning -2
	dc.w	868,820,774,730,689,651,614,580,547,516,487,460
	dc.w	434,410,387,365,345,325,307,290,274,258,244,230
	dc.w	217,205,193,183,172,163,154,145,137,129,122,115
; Tuning -1
	dc.w	862,814,768,725,684,646,610,575,543,513,484,457
	dc.w	431,407,384,363,342,323,305,288,272,256,242,228
	dc.w	216,203,192,181,171,161,152,144,136,128,121,114

mt_chan1temp	dc.l	0,0,0,0,0,$00010000,0,  0,0,0,0
mt_chan2temp	dc.l	0,0,0,0,0,$00020000,0,  0,0,0,0
mt_chan3temp	dc.l	0,0,0,0,0,$00040000,0,  0,0,0,0
mt_chan4temp	dc.l	0,0,0,0,0,$00080000,0,  0,0,0,0

mt_SampleStarts	dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

mt_SongDataPtr	dc.l 0
mt_speed	dc.b 6
mt_counter	dc.b 0
mt_SongPos	dc.b 0
mt_PBreakPos	dc.b 0
mt_PosJumpFlag	dc.b 0
mt_PBreakFlag	dc.b 0
mt_LowMask	dc.b 0
mt_PattDelTime	dc.b 0
mt_PattDelTime2	dc.b 0
mt_Enable	dc.b 0
mt_PatternPos	dc.w 0
mt_DMACONtemp	dc.w 0

;/* End of File */
stebuf_ptrs	DC.L stebuf1,stebuf2

		SECTION BSS
vols		DS.L (16640*2)/4
stebuf1:	DS.l bufsize	 	; buffers must be this big to handle
stebuf2:	DS.l bufsize		; downto tempo 32

		DS.L 399
my_stack	DS.L 3
		EVEN
	section data

mt_data					; module is loaded here.
		incbin	"E:\dev_stuf\tracker\tar.MOD"
	ds.w	1000
		even

viewscreen2:	dc.l	-1
viewscreen1:	dc.l	-1
memlist:
savemem1:	dc.l	0
savemem2:	dc.l	0
savemem3:	dc.l	0
savemem4:	dc.l	0
savemem5:	dc.l	0
		dc.l	-1	;end of mem list flag

soundmem:	dc.l	0
howlong:	dc.l	0
handles:	dc.w	0
fnamesound:	dc.b	'df1.SPL'
	even
	section data
scrnback:	incbin	'road.img'
balls:		incbin	'test.img'

	SECTION BSS
		ds.l	1000
mystack:	ds.w	1	;stacks go backwards
svft:	ds.w	1
svss:	ds.w	1
svbb:	ds.w	1
svbe:	ds.w	1
svdb:	ds.w	1
svde:	ds.w	1
shht:	ds.w	1
shss:	ds.w	1
shbb:	ds.w	1
shbe:	ds.w	1
shdb:	ds.w	1
shde:	ds.w	1
shfs:	ds.w	1
shee	ds.w	1
sst_shift:	ds.w	1
ssp_shift:	ds.w	1
svco:	ds.w	1
svwrap:	ds.w	1
svid_bh:	ds.w	1
svid_bm:	ds.w	1
svid_bl:	ds.w	1
savepal:	ds.w	16

color:		ds.w	1
pixelx:		ds.w	1
pixely:		ds.w	1
savesp:		ds.l	1
time:		ds.l	1
frames:		ds.l	1
blitx:		ds.l	1
blity:		ds.l	1
picsource:	ds.l	1
expansion:	ds.w	1
oldmouse:	ds.l	1
whichpic:	ds.l	1
frame:		ds.l	1
whicheffect:	ds.l	1
oldvblvec:	ds.l	1
vblflag:	ds.w	1
savescreen:	ds.l	1
savescreen2:	ds.l	1
savemode:	ds.w	1
save114:	ds.l	1
mastervol:	ds.w	1
obpointlist:	ds.l	1
obfacelist:	ds.l	1
facecolor:	ds.l	1
clipbot1:	ds.l	1
clipbot2:	ds.l	1
clipbot3:	ds.l	1
cliptop1:	ds.l	1
cliptop2:	ds.l	1
cliptop3:	ds.l	1
bufferword:	ds.w	1
