*
* Turbo Racer. Game and Code ©1992 by Mark Sheeky
* You can alter and assemble this, but you cannot give the 
* altered program to anyone without my consent.
* Assembled on Devpac 2
*


program	move.l	#700000,kount
	jsr	delay
	jsr	initialise
	jsr	main
	jsr	exit
	rts

initialise	jsr	initbitmap
	rts

initvars	move.l	#map,a0
	clr.l	d0
	move.b	tlevel,d0
	sub.b	#1,d0
	mulu	#1792,d0
	add.l	d0,a0
	move.l	a0,datapt1
	move.l	a0,datapt2
	move.l	#0,time1
	move.l	#0,time2
	move.l	#0,laptime1
	move.l	#0,laptime2
	move.w	#0,bexpl1
	move.w	#0,bexpl2
	move.w	#0,pexpl1
	move.w	#0,pexpl2
	move.w	#$ffff,$dff044
	move.w	#$ffff,$dff046
	move.w	#256,loopct1
	move.w	#256,loopct2
	move.w	#144,topbluex
	move.w	#144,botbluex
	move.w	#144,toppurpx
	move.w	#144,botpurpx
	move.w	#3776,blueglobal
	move.w	#3776,purpglobal
	move.w	#94,bluey
	move.w	#94,purpy
	move.b	#32,nrg1
	move.b	#32,nrg2
	move.b	#0,spd1
	move.b	#0,spd2
	move.b	#0,status1
	move.b	#0,status2
	move.b	#0,bluedead
	move.b	#0,purpdead
	move.b	#-1,bluelaps
	move.b	#-1,purplaps
	move.b	tacc,accel1
	move.b	tacc,accel2
	move.b	tdcc,decel1
	move.b	tdcc,decel2
	move.b	#0,count1
	move.b	#0,count2
	move.b	#0,flag1
	move.b	#0,flag2
	move.b	#0,gameover
	move.b	#1,fflag1
	move.b	#1,fflag2
	rts

init2	move.b	#1,tlevel
	move.b	#5,tlap
	move.b	#20,tacc
	move.b	#50,tdcc
	move.b	#20,accel1
	move.b	#20,accel2
	move.b	#50,decel1
	move.b	#50,decel2
	rts

exit	jsr	exitbitmap
	rts

main	jsr	initvars
	jsr	init2
.mainloop	jsr	mainmenu

	move.l	#modmain,a0
	jsr	mt_init
**** initialise title music

	jsr	menuloop
	jsr	prog
	jsr	results
.ok	btst	#7,$bfe001
	beq	.ok2
	btst	#6,$bfe001
	beq	.ok2
	bra	.ok
.ok2	move.l	#32,d0
	move.l	#fadetable,a0
	jsr	fadeout
;	btst	#7,$bfe001		; hold fire after
;	bne	.mainloop		; results to exit.
	bra	.mainloop		; no exit !!!!
	rts

prog	jsr	setupsc

	jsr	spron
.vbg	move.l	$dff004,d0
	and.l	#$0001ff00,d0
	cmp.l	#$00012000,d0
	bne	.vbg
	jsr	purpend
	jsr	blueend
	jsr	printships

	jsr	ghost1
	jsr	ghost2

	jsr	collisions

	jsr	topscroll
	jsr	testaccel1
	tst.b	bluedead
	bne	.1dead
	jsr	joystick1

.1dead	jsr	botscroll
	jsr	testaccel2
	tst.b	purpdead
	bne	.2dead
	jsr	joystick2

.2dead	jsr	ranges
	jsr	times
	jsr	ended
	jsr	noise

	cmp.b	#117,$bfec01
	beq	.end
	tst.b	gameover
	beq	.vbg

.end	move.w	#$f,$dff096
	move.l	#100000,kount
	jsr	delay
	move.l	#blacktable,a1
	jsr	copycols
	jsr	sproff
	rts

* check for end of game condition.
ended	tst.b	flag1	; both speeds must be zero
	beq	.end
	tst.b	flag2
	beq	.end
	move.b	#1,gameover

	move.l	#modend,a0
	jsr	mt_init
**** initialise game over music here

.vbg	move.l	$dff004,d0
	and.l	#$0001ff00,d0
	cmp.l	#$00012000,d0
	bne	.vbg

	jsr	mt_music
**** call game over music

	btst	#7,$bfe001
	bne	.vbg

	jsr	mt_end
**** turn off game over music here

.end	rts	

blueend	tst.b	flag1
	bne	.end
	tst.b	spd1
	bne	.end
	tst.b	status1
	beq	.end
	move.b	#1,flag1
	move.b	#3,d0
	move.l	bit.start,a1
	add.l	#1600,a1
	move.l	#raceover,a0
.loop1	move.w	#$4d8,d1
.loop2	move.b	(a0)+,d2
	or.b	d2,(a1)+
	subq.w	#1,d1
	bne	.loop2	
	add.l	#20480-$4d8,a1
	subq.b	#1,d0
	bne	.loop1
.end	rts
purpend	tst.b	flag2
	bne	.end
	tst.b	spd2
	bne	.end
	tst.b	status2
	beq	.end
	move.b	#1,flag2
	move.b	#3,d0
	move.l	bit.start,a1
	add.l	#6520,a1
	move.l	#raceover,a0
.loop1	move.w	#$4d8,d1
.loop2	move.b	(a0)+,d2
	or.b	d2,(a1)+
	subq.w	#1,d1
	bne	.loop2	
	add.l	#20480-$4d8,a1
	subq.b	#1,d0
	bne	.loop1
.end	rts

menuloop	move.l	#$dff194,a6
	move.l	#10,d4
.menloop	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$12000,d0
	bne	.menloop

	jsr	mt_music
**** call title music

	move.w	$dff00c,d0
	btst	#9,d0
	beq	.notleft
	move.b	#-1,d1
	bsr	subone
	bra	.end
.notleft	btst	#1,d0
	beq	.notright
	move.b	#1,d1
	bsr	subone
	bra	.end
.notright	btst	#8,d0
	beq	.notup
	tst.b	d2
	bne	.end
	move.b	#255,d2
	cmp.l	#$dff194,a6
	beq	.notup
	move.w	#0,(a6)
	sub.l	#2,a6
	move.w	#$fff,(a6)
	bra	.end
.notup	btst	#0,d0
	beq	.end2
	tst.b	d2
	bne	.end
	move.b	#255,d2
	cmp.l	#$dff19a,a6
	beq	.end
	move.w	#0,(a6)
	add.l	#2,a6
	move.w	#$fff,(a6)
	bra	.end
.end2	clr.l	d2
.end	btst	#7,$bfe001
	bne	.menloop

	jsr	mt_end
**** turn off title music

	move.l	#32,d0
	move.l	#fadetable,a0
	jsr	fadeout
	jsr	initvars
	rts
subone	subq.b	#1,d4
	bne	.end
	move.l	#10,d4
	cmp.l	#$dff194,a6
	bne	.notlev
	add.b	d1,tlevel
	tst.b	tlevel
	beq	.1bad
	cmp.b	#11,tlevel
	beq	.1bad
.notlev	cmp.l	#$dff196,a6
	bne	.notlaps
	add.b	d1,tlap
	tst.b	tlap
	beq	.2bad
	cmp.b	#41,tlap
	beq	.2bad
.notlaps	cmp.l	#$dff198,a6
	bne	.notacc
	add.b	d1,tacc
	tst.b	tacc
	beq	.3bad
	cmp.b	#51,tacc
	beq	.3bad
.notacc	cmp.l	#$dff19a,a6
	bne	.notdcc
	add.b	d1,tdcc
	tst.b	tdcc
	beq	.4bad
	cmp.b	#51,tdcc
	beq	.4bad
	bra	.notdcc
.1bad	sub.b	d1,tlevel
	bra	.notdcc
.2bad	sub.b	d1,tlap
	bra	.notdcc
.3bad	sub.b	d1,tacc
	bra	.notdcc
.4bad	sub.b	d1,tdcc
.notdcc	jsr	outvals
.end	rts 

* do engine sounds in channels 3 & 4 relative to speed
noise	clr.b	d0
	move.b	spd1,d0
	lsl.l	#4,d0
	move.w	#428,d1
	sub.w	d0,d1
	move.w	d1,$dff0c6
	clr.b	d0
	move.b	spd2,d0
	lsl.l	#4,d0
	move.w	#428,d1
	sub.w	d0,d1
	move.w	d1,$dff0d6
	rts

* set up main screen (title and bars)
mainscreen	jsr	sproff
	jsr	cls
	move.w	#$2c81,$dff08e	* shrink screen
	move.w	#$2cc1,$dff090	* (borders on l & r)
	move.w	#$5000,$dff100	* dual play field mode
	move.l	#blacktable,a1
	jsr	copycols
	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#440,a1
	move.l	#Turbotop,a0
.loop1	move.w	#2480,d1
.loop2	move.b	(a0)+,(a1)+
	subq.w	#1,d1
	bne	.loop2	
	add.l	#10240-2480,a1
	subq.b	#1,d0
	bne	.loop1
	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#8920,a1
	move.l	#Turbobar,a0
.loop3	move.w	#680,d1
.loop4	move.b	(a0)+,(a1)+
	subq.w	#1,d1
	bne	.loop4	
	add.l	#10240-680,a1
	subq.b	#1,d0
	bne	.loop3
	rts

* check ranges
ranges	cmp.w	#44,bluey
	bge	.ok5
	move.w	#44,bluey
.ok5	cmp.w	#44,purpy
	bge	.ok6
	move.w	#44,purpy
.ok6	cmp.w	#143,bluey
	ble	.ok7
	move.w	#143,bluey
.ok7	cmp.w	#143,purpy
	ble	.ok8
	move.w	#143,purpy
.ok8	rts

* print main menu
mainmenu	jsr	mainscreen
	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#3320,a1
	move.l	#Turbomenu,a0
.loop3	move.w	#560,d1
.loop4	move.b	(a0)+,(a1)+
	subq.w	#1,d1
	bne	.loop4	
	add.l	#10240-560,a1
	subq.b	#1,d0
	bne	.loop3
	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#4520,a1
	move.l	#Turboopts,a0
.loop1	move.w	#4000,d1
.loop2	move.b	(a0)+,(a1)+
	subq.w	#1,d1
	bne	.loop2
	add.l	#10240-4000,a1
	subq.b	#1,d0
	bne	.loop1
	move.l	bit.start,a1
	add.l	#4892,a1
	move.l	#txlevel,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#4892,a1
	add.l	#10240,a1
	move.l	#txlevel,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#4892,a1
	add.l	#20480,a1
	move.l	#txlevel,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#4892,a1
	add.l	#30720,a1
	move.l	#txlevel,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#4892,a1
	add.l	#40960,a1
	move.l	#txlevel,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#5892,a1
	move.l	#txlap,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#5892,a1
	add.l	#10240,a1
	move.l	#txlap,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#5892,a1
	add.l	#20480,a1
	move.l	#txlap,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#5892,a1
	add.l	#30720,a1
	move.l	#txlap,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#5892,a1
	add.l	#40960,a1
	move.l	#txlap,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#6892,a1
	move.l	#txacc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#6892,a1
	add.l	#10240,a1
	move.l	#txacc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#6892,a1
	add.l	#20480,a1
	move.l	#txacc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#6892,a1
	add.l	#30720,a1
	move.l	#txacc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#6892,a1
	add.l	#40960,a1
	move.l	#txacc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#7892,a1
	move.l	#txdcc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#7892,a1
	add.l	#10240,a1
	move.l	#txdcc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#7892,a1
	add.l	#20480,a1
	move.l	#txdcc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#7892,a1
	add.l	#30720,a1
	move.l	#txdcc,a0
	jsr	write2
	move.l	bit.start,a1
	add.l	#7892,a1
	add.l	#40960,a1
	move.l	#txdcc,a0
	jsr	write2
	jsr	outvals
	move.l	#32,d0
	move.l	#coltable2,a0
	move.l	#fadetable,a1
	jsr	fadein
	rts
* print results screen
results	jsr	mainscreen
	tst.b	status1
	bne	.ok11
	move.b	#2,status1
.ok11	tst.b	status2
	bne	.ok22
	move.b	#2,status2
.ok22	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#3321,a1
	move.l	#turbores,a0
.loop3	move.w	#560,d1
.loop4	move.b	(a0)+,(a1)+
	subq.w	#1,d1
	bne	.loop4	
	add.l	#10240-560,a1
	subq.b	#1,d0
	bne	.loop3
.not11	cmp.b	#2,status1
	bne	.not21
	move.l	#Turbolose1,a0
.not21	cmp.b	#3,status1
	bne	.not31
	move.l	#Turbowin1,a0
.not31	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#4520,a1
.loop5	move.w	#$a78,d1
.loop6	move.b	(a0)+,d2
	or.b	d2,(a1)+
	subq.w	#1,d1
	bne	.loop6	
	add.l	#10240-$a78,a1
	subq.b	#1,d0
	bne	.loop5
.not12	cmp.b	#2,status2
	bne	.not22
	move.l	#Turbolose2,a0
.not22	cmp.b	#3,status2
	bne	.not32
	move.l	#Turbowin2,a0
.not32	move.b	#5,d0
	move.l	bit.start,a1
	add.l	#4520,a1
.loop7	move.w	#$a78,d1
.loop8	move.b	(a0)+,d2
	or.b	d2,(a1)+
	subq.w	#1,d1
	bne	.loop8
	add.l	#10240-$a78,a1
	subq.b	#1,d0
	bne	.loop7
	move.l	#32,d0
	move.l	#coltable3,a0
	move.l	#fadetable,a1
	jsr	fadein
	rts

* print out values on the title screen
outvals	clr.l	d0
	move.b	tlevel,d0
	move.l	#2,d1
	move.l	#nxlevel,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#4906,a1
	move.l	#nxlevel,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#4906,a1
	add.l	#10240,a1
	move.l	#nxlevel,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#4906,a1
	add.l	#20480,a1
	move.l	#nxlevel,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#4906,a1
	add.l	#30720,a1
	move.l	#nxlevel,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#4906,a1
	add.l	#40960,a1
	move.l	#nxlevel,a0
	jsr	write
	clr.l	d0
	move.b	tlap,d0
	move.l	#2,d1
	move.l	#nxlap,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#5906,a1
	move.l	#nxlap,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#5906,a1
	add.l	#10240,a1
	move.l	#nxlap,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#5906,a1
	add.l	#20480,a1
	move.l	#nxlap,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#5906,a1
	add.l	#30720,a1
	move.l	#nxlap,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#5906,a1
	add.l	#40960,a1
	move.l	#nxlap,a0
	jsr	write
	clr.l	d0
	move.b	tacc,d0
	move.l	#2,d1
	move.l	#nxacc,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#6906,a1
	move.l	#nxacc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#6906,a1
	add.l	#10240,a1
	move.l	#nxacc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#6906,a1
	add.l	#20480,a1
	move.l	#nxacc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#6906,a1
	add.l	#30720,a1
	move.l	#nxacc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#6906,a1
	add.l	#40960,a1
	move.l	#nxacc,a0
	jsr	write
	clr.l	d0
	move.b	tdcc,d0
	move.l	#2,d1
	move.l	#nxdcc,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#7906,a1
	move.l	#nxdcc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#7906,a1
	add.l	#10240,a1
	move.l	#nxdcc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#7906,a1
	add.l	#20480,a1
	move.l	#nxdcc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#7906,a1
	add.l	#30720,a1
	move.l	#nxdcc,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#7906,a1
	add.l	#40960,a1
	move.l	#nxdcc,a0
	jsr	write
	rts
* fade in colours. a1-coltable (the one thats initially black).
* a0-pointer to destination cols. d0-number of colours to fade in.
* change kount value to adjust speed of fade.
fadein	move.l	#$fff,d1
	move.l	a1,a5
	move.l	a0,a4
	clr.l	d2
	move.b	d0,d2
.mloop	move.l	#5000,kount		* fade speed
	jsr	delay
.vbgloop	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$12000,d0
	bne	.vbgloop
	move.l	d2,d0
	move.l	a5,a1
	move.l	a4,a0
.loop1	move.w	(a0)+,(a1)+
	subq.b	#1,d0
	bne	.loop1
	move.l	a5,a1
	move.l	a4,a0
	move.l	d2,d0
.loop2	move.w	(a1),d6
	move.w	d1,d3
	and.w	#$0f00,d3
	move.w	d6,d4
	and.w	#$0f00,d4
	sub.w	d3,d4
	tst.w	d4
	bpl	.ok1
	clr.l	d4
.ok1	move.w	d4,(a1)
	move.w	d4,d5
	move.w	d1,d3
	and.w	#$00f0,d3
	move.w	d6,d4
	and.w	#$00f0,d4
	sub.w	d3,d4
	tst.w	d4
	bpl	.ok2
	move.w	d5,d4
.ok2	or.w	d4,(a1)
	move.w	d4,d5
	move.w	d1,d3
	and.w	#$000f,d3
	move.w	d6,d4
	and.w	#$000f,d4
	sub.w	d3,d4
	tst.w	d4
	bpl	.ok
	move.w	d5,d4
.ok	or.w	d4,(a1)
	add.l	#2,a1
	subq.b	#1,d0
	bne	.loop2
	move.l	a5,a1
	movem.l	d0-d2/a0-a1,-(sp)
	jsr	copycols
	movem.l	(sp)+,d0-d2/a0-a1
	sub.w	#$111,d1
	tst.w	d1
	bmi	.end
	bra	.mloop
.end	rts
* fade out colours. d0-number of colours. a0-pointer to colour table.
fadeout	move.l	#$f,d1
	move.l	a0,a2
	clr.l	d2
	move.b	d0,d2
.mloop	move.l	a2,a0
	move.l	#5000,kount		* fade speed
	jsr	delay
.vbgloop	move.l	$dff004,d0
	and.l	#$1ff00,d0
	cmp.l	#$12000,d0
	bne	.vbgloop
	move.l	d2,d0
.loop	clr.l	d3
	clr.l	d4
	clr.l	d5
	move.w	(a0),d3
	and.w	#$f00,d3
	beq	.redo
	sub.w	#$100,d3
.redo	move.w	(a0),d4
	and.w	#$f0,d4
	beq	.grno
	sub.w	#$10,d4
.grno	move.w	(a0),d5
	and.w	#$f,d5
	beq	.bluo
	sub.w	#1,d5
.bluo	or.w	d4,d3
	or.w	d5,d3
	move.w	d3,(a0)+
	subq.b	#1,d0
	bne	.loop
	move.l	a2,a1
	movem.l	d0-d3/a0-a3,-(sp)
	jsr	copycols
	movem.l	(sp)+,d0-d3/a0-a3
	subq.b	#1,d1
	bne	.mloop
	rts
* collision detector !
collisions	move.w	$dff00e,colreg
	move.w	colreg,d1
	btst	#1,d1
	bne	.bluehit
	btst	#10,d1
	bne	.bluehit
	bra	.blueok
.bluehit	tst.b	status1
	bne	.blueok
	move.b	spd1,d0
	tst.b	d0
	bne	.ok1
	move.b	#1,d0
.ok1	sub.b	d0,nrg1
	bpl	.bluealive
	tst.b	bluedead
	bne	.bluealive
.bluealive	move.b	#0,spd1
	cmp.w	#144,topbluex
	beq	.blueok
	subq.w	#2,topbluex
	subq.w	#2,blueglobal
	bpl	.blueok
	add.w	#4096,blueglobal
.blueok	btst	#4,d1
	bne	.purplehit
	btst	#13,d1
	bne	.purplehit
	bra	.purpleok
.purplehit	tst.b	status2
	bne	.purpleok
	move.b	spd2,d0
	tst.b	d0
	bne	.ok2
	move.b	#1,d0
.ok2	sub.b	d0,nrg2
	bpl	.purpalive
	tst.b	purpdead
	bne	.purpalive
.purpalive	move.b	#0,spd2
	cmp.w	#144,botpurpx
	beq	.purpleok
	subq.w	#2,botpurpx
	subq.w	#2,purpglobal
	bpl	.purpleok
	add.w	#4096,purpglobal
.purpleok	rts

* work out times
times	tst.b	bluelaps
	bmi	.start
	tst.b	bluedead
	bne	.notgo1
	add.l	#2,time1
	cmp.l	#1000000,time1
	bne	.ok1
.start	move.l	#0,time1
.ok1	move.l	time1,d0
	move.l	#6,d1
	move.l	#btime1,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#25042,a1
	move.l	#btime1,a0
	jsr	write
.notgo1	tst.b	purplaps
	bmi	.start2
	tst.b	purpdead
	bne	.end
	add.l	#2,time2
	cmp.l	#1000000,time2
	bne	.ok2
.start2	move.l	#0,time2
.ok2	move.l	time2,d0
	move.l	#6,d1
	move.l	#btime2,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#25072,a1
	move.l	#btime2,a0
	jsr	write
.end	rts
* work out times (lap)
laptime	move.l	laptime1,d0
	move.l	#6,d1
	move.l	#blaptime1,a0
	jsr	convert
	move.l	laptime2,d0
	move.l	#6,d1
	move.l	#blaptime2,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#25049,a1
	move.l	#blaptime1,a0
	jsr	write
	move.l	bit.start,a1
	add.l	#25065,a1
	move.l	#blaptime2,a0
	jsr	write
	rts
* do laps (print on screen)
laps	clr.l	d0
	move.b	bluelaps,d0
	tst.b	d0
	bpl	.notb
	clr.l	d0
.notb	cmp.b	tlap,d0
	bne	.ok1
	move.b	#3,bluedead
	cmp.b	#3,status2
	bne	.notwon1
	move.b	#2,status1
	bra	.ok1
.notwon1	move.b	#3,status1
.ok1	move.l	#2,d1
	move.l	#blaps1,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#25056,a1
	move.l	#blaps1,a0
	jsr	write
	clr.l	d0
	move.b	purplaps,d0
	tst.b	d0
	bpl	.notp
	clr.l	d0
.notp	cmp.b	tlap,d0
	bne	.ok2
	move.b	#3,purpdead
	cmp.b	#3,status1
	bne	.notwon2
	move.b	#2,status2
	bra	.ok2
.notwon2	move.b	#3,status2
.ok2	move.l	#2,d1
	move.l	#blaps2,a0
	jsr	convert
	move.l	bit.start,a1
	add.l	#25062,a1
	move.l	#blaps2,a0
	jsr	write
	rts

* work out blue ship in lower scroll area in correct relative place
ghost1	cmp.b	#1,status1
	bgt	.outofrng
	clr.l	d0
	move.w	purpglobal,d1
	move.w	blueglobal,d0
	sub.w	d1,d0
	cmp.w	#-1024,d0
	bge	.ok1
	add.w	#4096,d0
	bra	.ok2
.ok1	cmp.w	#1024,d0
	blt	.ok2
	sub.w	#4096,d0
.ok2	add.w	botpurpx,d0
	cmp.w	#100,d0
	blt	.outofrng
	cmp.w	#468,d0
	bgt	.outofrng
	tst.b	bluelaps
	bmi	.outofrng
	tst.b	purplaps
	bmi	.outofrng
	move.w	d0,botbluex
	rts
.outofrng	move.w	#0,botbluex
	rts
* work out purple ship in upper scroll area in correct relative place
ghost2	cmp.b	#1,status2
	bgt	.outofrng
	clr.l	d0
	move.w	blueglobal,d1
	move.w	purpglobal,d0
	sub.w	d1,d0
	cmp.w	#-1024,d0
	bge	.ok1
	add.w	#4096,d0
	bra	.ok2
.ok1	cmp.w	#1024,d0
	blt	.ok2
	sub.w	#4096,d0
.ok2	add.w	topbluex,d0
	cmp.w	#100,d0
	blt	.outofrng
	cmp.w	#468,d0
	bgt	.outofrng
	tst.b	bluelaps
	bmi	.outofrng
	tst.b	purplaps
	bmi	.outofrng
	move.w	d0,toppurpx
	rts
.outofrng	move.w	#0,toppurpx
	rts

* write out message at a0 to location a1. 8x9 letters. 1 plane.
write	move.b	(a0),d0		* letter code in d0
	tst.b	d0
	beq	.eom
	sub.l	#40,a1
	move.b	#0,(a1)
	add.l	#40,a1
	cmp.b	#32,d0
	bne	.workout
	move.l	#Null,a2
	bra	.printlet
.workout	sub.b	#47,d0
	move.l	#Alphabet,a2
	sub.l	#8,a2
.loop2	add.l	#8,a2		* work out address
	sub.b	#1,d0		* of letter picture
	bne	.loop2
.printlet	move.b	#8,d1		* print letter
.loop3	move.b	(a2)+,(a1)
	add.l	#40,a1
	sub.b	#1,d1
	bne	.loop3
	sub.l	#319,a1
	add.l	#1,a0
	bra	write
.eom	rts
write2	move.b	(a0),d0
	tst.b	d0
	beq	.eom
	cmp.b	#32,d0
	bne	.workout
	move.l	#Null,a2
	bra	.printlet
.workout	sub.b	#47,d0
	move.l	#Alphabet,a2
	sub.l	#8,a2
.loop2	add.l	#8,a2
	sub.b	#1,d0
	bne	.loop2
.printlet	move.b	#8,d1
.loop3	move.b	(a2)+,d2
	or.b	d2,(a1)
	add.l	#40,a1
	sub.b	#1,d1
	bne	.loop3
	sub.l	#319,a1
	add.l	#1,a0
	bra	write2
.eom	rts
* converts a number to ascii. d0-The number
* d1-How many chars to convert (2 - 6). a0-Address of where to put result
convert	move.l	#1,d2
	move.b	d1,d3
	subq.b	#1,d3
.loop	mulu	#10,d2
	subq.b	#1,d3
	bne	.loop
.loop1	move.b	#48,(a0)
.loop2	cmp.l	d2,d0
	blt	.end
	sub.l	d2,d0
	addq.b	#1,(a0)
	bra	.loop2
.end	add.l	#1,a0
	divu	#10,d2
	subq.b	#1,d1
	bne	.loop1
	rts

* check the joystick for player 1
joystick1	move.w	$dff00c,d0
	btst	#9,d0
	beq	.notleft
	btst	#7,$bfe001
	bne	.left
	sub.b	#15,decel1
.left	cmp.w	#144,topbluex
	beq	.ok1
	subq.w	#2,topbluex
	subq.w	#2,blueglobal
	bpl	.ok1
	add.w	#4096,blueglobal
.ok1	btst	#8,d0
	beq	.uptoo
	btst	#0,d0
	bne	.downtoo
	rts
.notleft	btst	#1,d0
	beq	.notright
	cmp.w	#300,topbluex
	beq	.ok2
	addq.w	#2,topbluex
	addq.w	#2,blueglobal
	bra	blap
.ok2	btst	#0,d0
	beq	.downtoo
	btst	#8,d0
	bne	.uptoo
	rts
.notright	btst	#9,d0
	bne	.notup
	btst	#8,d0
	beq	.notup
	btst	#1,d0
	bne	.notup
.uptoo	subq.w	#2,bluey
	rts
.notup	btst	#8,d0
	bne	.end
	btst	#1,d0
	bne	.end
	btst	#0,d0
	beq	.end
.downtoo	addq.w	#2,bluey
.end	rts
* check the joystick for player 2
joystick2	move.w	$dff00a,d0
	btst	#9,d0
	beq	.notleft
	btst	#6,$bfe001
	bne	.left
	sub.b	#15,decel2
.left	cmp.w	#144,botpurpx
	beq	.ok1
	subq.w	#2,botpurpx
	subq.w	#2,purpglobal
	bpl	.ok1
	add.w	#4096,purpglobal
.ok1	btst	#8,d0
	beq	.uptoo
	btst	#0,d0
	bne	.downtoo
	rts
.notleft	btst	#1,d0
	beq	.notright
	cmp.w	#300,botpurpx
	beq	.ok2
	addq.w	#2,botpurpx
	addq.w	#2,purpglobal
	bra	plap
.ok2	btst	#0,d0
	beq	.downtoo
	btst	#8,d0
	bne	.uptoo
	rts
.notright	btst	#9,d0
	bne	.notup
	btst	#8,d0
	beq	.notup
	btst	#1,d0
	bne	.notup
.uptoo	subq.w	#2,purpy
	rts
.notup	btst	#8,d0
	bne	.end
	btst	#1,d0
	bne	.end
	btst	#0,d0
	beq	.end
.downtoo	addq.w	#2,purpy
.end	rts

* set up screen
setupsc	move.l	#blacktable,a1
	jsr	copycols
	jsr	cls
	move.w	#$2c91,$dff08e	* shrink screen
	move.w	#$2cb1,$dff090	* (borders on l & r)
	move.w	#$5400,$dff100	* dual play field mode
	move.w	#$f041,$dff098	* collisions

	move.l	bit.start,a3
	move.b	#20,d1
.loop01	move.b	#7,d2
	move.l	#mapp,a1
.loop1	move.b	#16,d4
.loop	move.w	(a1),(a3)
	add.l	#40,a3
	subq.b	#1,d4
	bne	.loop
	add.l	#2,a1
	subq.b	#1,d2
	bne	.loop1
	sub.l	#4478,a3
	subq.b	#1,d1
	bne	.loop01

	move.l	bit.start,a3
	add.l	#4920,a3
	move.b	#20,d1
.loop21	move.b	#7,d2
	move.l	#mapp,a1
.loop2	move.b	#16,d4
.loop0	move.w	(a1),(a3)
	add.l	#40,a3
	subq.b	#1,d4
	bne	.loop0
	add.l	#2,a1
	subq.b	#1,d2
	bne	.loop2
	sub.l	#4478,a3
	subq.b	#1,d1
	bne	.loop21

	move.l	bit.start,a1
	add.l	#10240,a1
	add.l	#4920,a1
	move.l	#cavewall,a0
	move.w	#4480,d0
.loop3	move.b	(a0)+,(a1)+
	subq.w	#1,d0
	bne	.loop3
	move.l	bit.start,a1
	add.l	#30720,a1
	add.l	#4920,a1
	move.w	#4480,d0
.loop4	move.b	(a0)+,(a1)+
	subq.w	#1,d0
	bne	.loop4
	move.l	bit.start,a1
	add.l	#10240,a1
	move.l	#cavewall,a0
	move.w	#4480,d0
.loop5	move.b	(a0)+,(a1)+
	subq.w	#1,d0
	bne	.loop5
	move.l	bit.start,a1
	add.l	#30720,a1
	move.w	#4480,d0
.loop6	move.b	(a0)+,(a1)+
	subq.w	#1,d0
	bne	.loop6
	jsr	times
	jsr	laptime
	jsr	laps
	move.l	#coltable,a1
	jsr	copycols
	move.l	#Engine,$dff0c0
	move.w	#3538,$dff0c4
	move.w	#64,$dff0c8
	move.w	#430,$dff0c6
	move.l	#Engine,$dff0d0
	move.w	#3538,$dff0d4
	move.w	#64,$dff0d8
	move.w	#430,$dff0d6
	move.w	#$800c,$dff096
	rts

* speed up if neccesary/slow down if not speeding up
testaccel1	tst.b	bluedead
	bne	.end2
	btst	#7,$bfe001
	bne	.end2
	move.w	$dff00c,d0
	btst	#9,d0
	bne	.end2
	subq.b	#1,accel1
	bne	.end
	move.b	tacc,accel1
	cmp.b	#16,spd1
	beq	.end
	add.b	#1,spd1
	rts
.end2	subq.b	#1,decel1
	bpl	.end
	move.b	tdcc,decel1
	tst.b	spd1
	beq	.end
	subq.b	#1,spd1
.end	rts
* speed up if neccesary/slow down if not speeding up
testaccel2	tst.b	purpdead
	bne	.end2
	btst	#6,$bfe001
	bne	.end2
	move.w	$dff00a,d0
	btst	#9,d0
	bne	.end2
	subq.b	#1,accel2
	bne	.end
	move.b	tacc,accel2
	cmp.b	#16,spd2
	beq	.end
	add.b	#1,spd2
	rts
.end2	subq.b	#1,decel2
	bpl	.end
	move.b	tdcc,decel2
	tst.b	spd2
	beq	.end
	subq.b	#1,spd2
.end	rts

* turn on sprites. Uses dma, so all sprites are enabled
spron	move.l	$dff004,d0
	and.l	#$0001ff00,d0
	cmp.l	#$00012000,d0
	bne	spron
	move.w	#$8020,$dff096
	rts
* turn off sprites. Uses dma, so all sprites are disabled.
sproff	move.l	$dff004,d0
	and.l	#$0001ff00,d0
	cmp.l	#$00012000,d0
	bne	sproff
	move.w	#$20,$dff096
	rts

printships	move.l	#13,d2
	clr.l	d0
	clr.l	d1
	move.w	topbluex,d0
	move.w	bluey,d1
	move.l	#topblue1,a0
	jsr	printpoint
	add.w	#16,d0
	move.l	#topblue2,a0
	jsr	printpoint
	move.w	botbluex,d0
	add.w	#123,d1
	move.l	#botblue1,a0
	jsr	printpoint
	add.w	#16,d0
	move.l	#botblue2,a0
	jsr	printpoint
	clr.l	d0
	clr.l	d1
	move.w	#50,d0
	move.w	toppurpx,d0
	move.w	purpy,d1
	move.l	#toppurp1,a0
	jsr	printpoint
	add.w	#16,d0
	move.l	#toppurp2,a0
	jsr	printpoint
	move.w	#50,d0
	move.w	botpurpx,d0
	add.w	#123,d1
	move.l	#botpurp1,a0
	jsr	printpoint
	add.w	#16,d0
	move.l	#botpurp2,a0
	jsr	printpoint
	rts

* print sprite at word positions d0,d1 address in a0 (of words)
* height in d2
printpoint	movem.l	d0/d1,-(sp)
	move.l	a0,a1
	add.l	#1,a0
	bsr	horzshow
	bsr	chy
	movem.l	(sp)+,d0/d1
	rts
horzshow	lsr.w	#1,d0
	bcs	setit
	move.b	d0,(a0)
	add.l	#2,a0
	bclr	#0,(a0)
	rts
setit	move.b	d0,(a0)
	add.l	#2,a0
	bset	#0,(a0)
	rts
chy	move.w	d1,d0
	move.l	a1,a0
	move.b	d0,(a0)
	add.l	#3,a0
	cmp.w	#255,d0
	ble	notgrt
	bset	#2,(a0)	
	bra	isgrt
notgrt	bclr	#2,(a0)
isgrt	add.w	d2,d0
	cmp.w	#255,d0
	ble	notgrt2
	bset	#1,(a0)
	bra	isgrt2
notgrt2	bclr	#1,(a0)
isgrt2	sub.l	#1,a0
	move.b	d0,(a0)
	rts

* Multipurpose delay
delay	subq.l	#1,kount
	bne	delay
	rts
* clear the screen
cls	move.w	#51200,d0		; 10240 bytes per plane (PAL)
	move.l	bit.start,a0
.loop	move.b	#0,(a0)+
	subq.w	#1,d0
	bne	.loop
	rts

blap	cmp.w	#4096,blueglobal
	blt	.lt
	sub.w	#4096,blueglobal
	tst.b	status1
	bne	.lt
	tst.b	fflag1
	beq	.lt
	move.b	#0,fflag1
	add.b	#1,bluelaps
	jsr	laps
	tst.b	bluelaps
	move.l	time1,laptime1
	move.l	#0,time1
	jsr	laptime
.lt	cmp.w	#2000,blueglobal
	blt	.lt2
	cmp.w	#3000,blueglobal
	bgt	.lt2
	move.b	#1,fflag1
.lt2	rts
* scroll top area completely
topscroll	clr.l	d0
	move.b	spd1,d0
	add.w	d0,blueglobal
	jsr	blap
	clr.l	d2
	move.b	count1,d2
	move.l	d2,d3
	sub.b	spd1,d3
	move.b	d3,count1
	cmp.b	#1,d3
	bge	.gtthan1
	move.l	d2,d0
	jsr	scroll1
	move.l	bit.start,a0
	add.l	#38,a0
	move.l	datapt1,a1
	jsr	printline
	add.l	#1,datapt1
	subq.w	#1,loopct1
	bne	.ok
	sub.l	#256,datapt1
	move.w	#256,loopct1
.ok	neg.b	count1
	clr.l	d0
	move.b	count1,d0
	jsr	scroll1
	move.l	#16,d0
	sub.b	count1,d0
	move.b	d0,count1
	rts
.gtthan1	clr.l	d0
	move.b	spd1,d0
	jsr	scroll1
	rts

plap	cmp.w	#4096,purpglobal
	blt	.lt
	sub.w	#4096,purpglobal
	tst.b	status2
	bne	.lt
	tst.b	fflag2
	beq	.lt
	move.b	#0,fflag2
	add.b	#1,purplaps
	jsr	laps
	move.l	time2,laptime2
	move.l	#0,time2
	jsr	laptime
.lt	cmp.w	#2000,purpglobal
	blt	.lt2
	cmp.w	#3000,purpglobal
	bgt	.lt2
	move.b	#1,fflag2
.lt2	rts
* scroll bottom area completely
botscroll	clr.l	d0
	move.b	spd2,d0
	add.w	d0,purpglobal
	jsr	plap
	clr.l	d2
	move.b	count2,d2
	move.l	d2,d3
	sub.b	spd2,d3
	move.b	d3,count2
	cmp.b	#1,d3
	bge	.gtthan1
	move.l	d2,d0
	jsr	scroll2
	move.l	bit.start,a0
	add.l	#4958,a0
	move.l	datapt2,a1
	jsr	printline
	add.l	#1,datapt2
	subq.w	#1,loopct2
	bne	.ok
	sub.l	#256,datapt2
	move.w	#256,loopct2
.ok	neg.b	count2
	clr.l	d0
	move.b	count2,d0
	jsr	scroll2
	move.l	#16,d0
	sub.b	count2,d0
	move.b	d0,count2
	rts
.gtthan1	clr.l	d0
	move.b	spd2,d0
	jsr	scroll2
	rts

* scroll top area by d0 pixels. uses blitter & d0 & d1
scroll1	tst.b	d0
	beq	.end
	move.l	#16,d1
	sub.b	d0,d1
	lsl.l	#4,d1
	lsl.l	#4,d1
	lsl.l	#4,d1
	or.w	#$9f0,d1
.looop	btst	#14,$dff002
	bne	.looop
	move.w	d1,$dff040
	move.w	#0,$dff042
	move.w	#0,$dff066
	move.w	#0,$dff064
	move.l	bit.start,d0
	move.l	d0,$dff054
	add.l	#2,d0
	move.l	d0,$dff050
	move.w	#112*64+20,$dff058
	move.w	#$8040,$dff096
.end	rts
* scroll bottom area by d0 pixels. uses blitter & d0 & d1
scroll2	tst.b	d0
	beq	.end
	move.l	#16,d1
	sub.b	d0,d1
	lsl.l	#4,d1
	lsl.l	#4,d1
	lsl.l	#4,d1
	or.w	#$9f0,d1
.looop	btst	#14,$dff002
	bne	.looop
	move.w	d1,$dff040
	move.w	#0,$dff042
	move.w	#0,$dff066
	move.w	#0,$dff064
	move.l	bit.start,d0
	add.l	#4920,d0
	move.l	d0,$dff054
	add.l	#2,d0
	move.l	d0,$dff050
	move.w	#112*64+20,$dff058
	move.w	#$8040,$dff096
.end	rts

* printaline of data at a0 with pointer in a1
printline	btst	#14,$dff002
	bne	printline
	move.l	#7,d1
	move.w	#$9f0,$dff040
	move.w	#0,$dff042
	move.w	#38,$dff066
	move.w	#0,$dff064
.loop	move.l	#tiles,a2
	clr.l	d0
	move.b	(a1),d0
	lsl.l	#5,d0
	add.l	d0,a2
	move.l	a0,$dff054
	move.l	a2,$dff050
	move.w	#16*64+1,$dff058
	move.w	#$8040,$dff096
.wait	btst	#14,$dff002
	bne	.wait
	add.l	#256,a1
	add.l	#640,a0
	subq.l	#1,d1
	bne	.loop
	rts

* copys colours into correct registers. Address of table in a1
copycols	move.l	#$dff180,a0
	move.b	#32,d0
.loop	move.w	(a1),(a0)
	addq.l	#2,a0
	addq.l	#2,a1
	subq.b	#1,d0
	bne	.loop
	rts

* initialise bitmap (default pal - 5 planes). no Own blitter.
initbitmap	move.l	4,a6
	jsr	-132(a6)		* stop multitasking
	move.l	4,a6
	move.l	#gfxname,a1
	clr.l	d0
	jsr	-408(a6)
	move.l	a6,gfxbase

	move.l    $4,a6		* reserve memory
	move.l    #51200,d0		* 8000 ntsc, 10240 pal
	move.l    #$10002,d1
	jsr       -198(a6)
	move.l    d0,bit.start

	move.l    #1000,d0
	move.l    #2,d1
	jsr       -198(a6)
	move.l    d0,cop.start

	move.l	cop.start,a0	* create copperlist
	move.l	bit.start,d1
	move.w	#4,d4		* change to planes - 1
	move.w	#$e0,d2
loop	move.w	d2,(a0)+
	swap	d1
	move.w	d1,(a0)+
	add	#2,d2
	move.w	d2,(a0)+
	swap	d1
	move.w	d1,(a0)+
	add.l	#10240,d1
	add	#2,d2
	dbf	d4,loop

	move.l	#topblue1,d0	* sprite 0
	move.w	#$120,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$122,(a0)+	
	move.w	d0,(a0)+
	move.l	#topblue2,d0	* sprite 1
	move.w	#$124,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$126,(a0)+	
	move.w	d0,(a0)+
	move.l	#botblue1,d0	* sprite 2
	move.w	#$128,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$12a,(a0)+	
	move.w	d0,(a0)+
	move.l	#botblue2,d0	* sprite 3
	move.w	#$12c,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$12e,(a0)+	
	move.w	d0,(a0)+
	move.l	#toppurp1,d0	* sprite 4
	move.w	#$130,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$132,(a0)+	
	move.w	d0,(a0)+
	move.l	#toppurp2,d0	* sprite 5
	move.w	#$134,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$136,(a0)+	
	move.w	d0,(a0)+
	move.l	#botpurp1,d0	* sprite 6
	move.w	#$138,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$13a,(a0)+	
	move.w	d0,(a0)+
	move.l	#botpurp2,d0	* sprite 7
	move.w	#$13c,(a0)+
	swap	d0
	move.w	d0,(a0)+
	swap	d0
	move.w	#$13e,(a0)+	
	move.w	d0,(a0)+

	move.w	#$ffff,(a0)+
	move.w	#$fffe,(a0)

	lea	$dff000,a5		* disable dma
.wait	move.b	6(a5),d6
	cmp.b	#$20,d6
	bne	.wait
	move.w	#$01a0,$96(a5)

	move.l	cop.start,$80(a5)	* start copperlist
	clr.w	$88(a5)

	move.l	#coltable,a1
	jsr	copycols

	move.w	#$2c81,$8e(a5)	* diwstart
	move.w	#$2cc1,$90(a5)	* diwstop
	move.w	#$38,$92(a5)	* ddfstart
	move.w	#$d0,$94(a5)	* ddfstop
	move.w	#$5000,$100(a5)	* num of planes, bits 12-14
	clr.w	$102(a5)		* bplcon1
	move.w	#$24,$dff104	* bplcon2
	clr.w	$108(a5)		* bpl1mod
	clr.w	$10a(a5)		* bpl2mod

	move.w	#$8380,$96(a5)	* start dma
	rts

* free bitmap memory, and turn off bitmap
exitbitmap	move.w	#$8020,$dff096
	lea	$dff000,a5
	move.l	4,a6
	move.l	#gfxname,a1
	clr.l	d0
	jsr	-552(a6)
	move.l	d0,a4
	move.l	38(a4),$80(a5)
	clr.w	$88(a5)

	move.l	bit.start,a1
	move.l	#51200,d0		* amount to free
	jsr	-210(a6)
	move.l	cop.start,a1
	move.l	#1000,d0
	jsr	-210(a6)
	move.l	gfxbase,a1		* close gfx library
	jsr	-414(a6)
	move.l	4,a6
	jsr	-138(a6)		* restore System
	rts

;********************************************
;* ----- Protracker V2.0A Playroutine ----- *
;********************************************

; VBlank Version 3:
; Call mt_init to initialize the routine, then call mt_music on
; each vertical blank (50 Hz). To end the song and turn off all
; voices, call mt_end.

DMAWait = 300

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

	OR.B	#2,$BFE001
	MOVE.B	#6,mt_speed
	CLR.B	mt_counter
	CLR.B	mt_SongPos
	CLR.W	mt_PatternPos
mt_end	CLR.W	$DFF0A8
	CLR.W	$DFF0B8
	CLR.W	$DFF0C8
	CLR.W	$DFF0D8
	MOVE.W	#$F,$DFF096
	RTS

mt_music
	MOVEM.L	D0-D4/A0-A6,-(SP)
	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	$DFF0A0,A5
	LEA	mt_chan1temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0B0,A5
	LEA	mt_chan2temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0C0,A5
	LEA	mt_chan3temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0D0,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	$DFF0A0,A5
	LEA	mt_chan1temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0B0,A5
	LEA	mt_chan2temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0C0,A5
	LEA	mt_chan3temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0D0,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,8(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,8(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/A1,-(SP)
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	LEA	mt_PeriodTable(PC),A1
	MOVEQ	#0,D0
	MOVEQ	#36,D4
mt_ftuloop
	CMP.W	(A1,D0.W),D1
	BHS.S	mt_ftufound
	ADDQ.L	#2,D0
	DBRA	D4,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/A1

	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0ED0,D0 ; Notedelay
	BEQ	mt_CheckMoreEfx

	MOVE.W	n_dmabit(A6),$DFF096
	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),(A5)	; Set start
	MOVE.W	n_length(A6),4(A5)	; Set length
	MOVE.W	n_period(A6),D0
	MOVE.W	D0,6(A5)		; Set period
	MOVE.W	n_dmabit(A6),D0
	OR.W	D0,mt_DMACONtemp
	BRA	mt_CheckMoreEfx
 
mt_SetDMA
	MOVE.W	#DMAWait,D0
mt_WaitDMA
	DBRA	D0,mt_WaitDMA
	MOVE.W	mt_DMACONtemp(PC),D0
	OR.W	#$8000,D0
	MOVE.W	D0,$DFF096
	MOVE.W	#DMAWait,D0
mt_WaitDMA2
	DBRA	D0,mt_WaitDMA2

	LEA	$DFF000,A5
	LEA	mt_chan4temp(PC),A6
	MOVE.L	n_loopstart(A6),$D0(A5)
	MOVE.W	n_replen(A6),$D4(A5)
	LEA	mt_chan3temp(PC),A6
	MOVE.L	n_loopstart(A6),$C0(A5)
	MOVE.W	n_replen(A6),$C4(A5)
	LEA	mt_chan2temp(PC),A6
	MOVE.L	n_loopstart(A6),$B0(A5)
	MOVE.W	n_replen(A6),$B4(A5)
	LEA	mt_chan1temp(PC),A6
	MOVE.L	n_loopstart(A6),$A0(A5)
	MOVE.W	n_replen(A6),$A4(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
	MOVEM.L	(SP)+,D0-D4/A0-A6
	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),6(A5)
	CMP.B	#7,D0
	BEQ	mt_Tremolo
	CMP.B	#$A,D0
	BEQ	mt_VolumeSlide
mt_Return2
	RTS

mt_PerNop
	MOVE.W	n_period(A6),6(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,D4
mt_arploop
	MOVE.W	(A0,D0.W),D2
	CMP.W	(A0),D1
	BHS.S	mt_Arpeggio4
	ADDQ.L	#2,A0
	DBRA	D4,mt_arploop
	RTS

mt_Arpeggio4
	MOVE.W	D2,6(A5)
	RTS

mt_FinePortaUp
	TST.B	mt_counter
	BNE.S	mt_Return2
	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,6(A5)
	RTS	
 
mt_FinePortaDown
	TST.B	mt_counter
	BNE	mt_Return2
	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,6(A5)
	RTS

mt_SetTonePorta
	MOVE.L	A0,-(SP)
	MOVE.W	(A6),D2
	AND.W	#$0FFF,D2
	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	#36*2,D0
	BLO.S	mt_StpLoop
	MOVEQ	#35*2,D0
mt_StpFound
	MOVEQ	#0,D2
	MOVE.B	n_finetune(A6),D2
	MULU	#36*2,D2
	ADD.L	D2,A0
	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_Return2
	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_Return2
	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,6(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	0(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,6(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_tremolopos(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	0(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,8(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,8(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,8(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,8(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
	MOVE.B	3(A6),D0
	BEQ	mt_Return2
	CLR.B	mt_counter
	MOVE.B	D0,mt_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.S	mt_PatternBreak
	CMP.B	#$E,D0
	BEQ.S	mt_E_Commands
	CMP.B	#$F,D0
	BEQ.S	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
	OR.B	D0,$BFE001
	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_Return2
	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_Return2
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.S	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
	BNE.S	mt_rtnskp
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	BNE.S	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.W	n_dmabit(A6),$DFF096	; Channel DMA off
	MOVE.L	n_start(A6),(A5)	; Set sampledata pointer
	MOVE.W	n_length(A6),4(A5)	; Set length
	MOVE.W	#DMAWait,D0
mt_rtnloop1
	DBRA	D0,mt_rtnloop1
	MOVE.W	n_dmabit(A6),D0
	BSET	#15,D0
	MOVE.W	D0,$DFF096
	MOVE.W	#DMAWait,D0
mt_rtnloop2
	DBRA	D0,mt_rtnloop2
	MOVE.L	n_loopstart(A6),(A5)
	MOVE.L	n_replen(A6),4(A5)
mt_rtnend
	MOVE.L	(SP)+,D1
	RTS

mt_VolumeFineUp
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F,D0
	BRA	mt_VolSlideUp

mt_VolumeFineDown
	TST.B	mt_counter
	BNE	mt_Return2
	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_Return2
	CLR.B	n_volume(A6)
	MOVE.W	#0,8(A5)
	RTS

mt_NoteDelay
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_Counter,D0
	BNE	mt_Return2
	MOVE.W	(A6),D0
	BEQ	mt_Return2
	MOVE.L	D1,-(SP)
	BRA	mt_DoRetrig

mt_PatternDelay
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	TST.B	mt_PattDelTime2
	BNE	mt_Return2
	ADDQ.B	#1,D0
	MOVE.B	D0,mt_PattDelTime
	RTS

mt_FunkIt
	TST.B	mt_counter
	BNE	mt_Return2
	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_Return2
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,0

mt_PatternPos	dc.w 0
mt_DMACONtemp	dc.w 0

;/* End of File */


	even
;qx

bit.start	dc.l 0
cop.start	dc.l 0
gfxbase	dc.l 0
kount	dc.l 0
datapt1	dc.l 0
datapt2	dc.l 0
time1	dc.l 0
time2	dc.l 0
laptime1	dc.l 0
laptime2	dc.l 0

loopct1	dc.w 0
loopct2	dc.w 0
topbluex	dc.w 0
botbluex	dc.w 0
bluey	dc.w 0
toppurpx	dc.w 0
botpurpx	dc.w 0
purpy	dc.w 0
blueglobal	dc.w 0
purpglobal	dc.w 0
colreg	dc.w 0
pexpl1	dc.w 0
pexpl2	dc.w 0
bexpl1	dc.w 0
bexpl2	dc.w 0

blacktable	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000

fadetable	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000

coltable	dc.w $0000,$0def,$09ab,$0bcd,$0678,$0400,$0800,$0c00
	dc.w $0000,$0667,$0445,$0223,$0000,$0000,$0000,$0000
	dc.w $0000,$0fff,$007a,$0158,$0000,$0fff,$007a,$0158
	dc.w $0000,$0fff,$0a7a,$0858,$0000,$0fff,$0a7a,$0858

coltable2	dc.w $0000,$0def,$0abc,$09ab,$089a,$0789,$0678,$0567
	dc.w $0456,$0345,$0fff,$0000,$0000,$0000,$0102,$0204
	dc.w $0306,$0408,$060b,$070d,$080f,$007a,$0058,$0a7a
	dc.w $0858,$0840,$0a70,$0da0,$0ff0,$0090,$0c40,$0fff

coltable3	dc.w $0000,$0def,$0abc,$09ab,$089a,$0789,$0678,$0567
	dc.w $0456,$0345,$0fff,$0000,$0000,$0000,$0102,$0204
	dc.w $0306,$0408,$060b,$070d,$080f,$007a,$0058,$0a7a
	dc.w $0858,$0840,$0a70,$0da0,$0ff0,$0090,$0c40,$0b00

mapp	dc.w $ffff,0,0,0,0,0,$ffff

spd1	dc.b 0
spd2	dc.b 0
status1	dc.b 0
status2	dc.b 0
accel1	dc.b 0
accel2	dc.b 0
decel1	dc.b 0
decel2	dc.b 0
flag1	dc.b 0
flag2	dc.b 0
gameover	dc.b 0
count1	dc.b 0
count2	dc.b 0
bluelaps	dc.b 0
purplaps	dc.b 0
bexdel	dc.b 0
pexdel	dc.b 0
nrg1	dc.b 0
nrg2	dc.b 0
bluedead	dc.b 0
purpdead	dc.b 0
tlap	dc.b 1
tlevel	dc.b 1
tacc	dc.b 1
tdcc	dc.b 1
gfxname	dc.b "graphics.library",0,0
txlevel	dc.b "TRACK NUMBER",0
txlap	dc.b "LAPS TO RACE",0
txacc	dc.b "ACCELERATION",0
txdcc	dc.b "DECELERATION",0
nxlevel	dc.b "00",0
nxlap	dc.b "00",0
nxacc	dc.b "00",0
nxdcc	dc.b "00",0
btime1	dc.b "000000",0
btime2	dc.b "000000",0
blaptime1	dc.b "000000",0
blaptime2	dc.b "000000",0
blaps1	dc.b "00",0
blaps2	dc.b "00",0
fflag1	dc.b 0
fflag2	dc.b 0

map	incbin df0:maps

cavewall	incbin df0:Turbocave.gfx
turbotop	incbin df0:Turbotop.gfx
turbomenu	incbin df0:Turbomenu.gfx
turbores	incbin df0:Turboresults.gfx
turbobar	incbin df0:Turbobar.gfx
turboopts	incbin df0:Turboopts.gfx
raceover	incbin df0:Turboover.gfx
turbowin1	incbin df0:Turbowin1.gfx
turbowin2	incbin df0:Turbowin2.gfx
turbolose1	incbin df0:Turbolose1.gfx
turbolose2	incbin df0:Turbolose2.gfx

* Techfont 1. 0-9 '©.-,?! A-Z. 8x9  1 plane
Alphabet	dc.b 126,78,78,78,78,78,126,0
	dc.b 24,24,24,24,24,24,24,0
	dc.b 126,14,14,126,64,64,126,0
	dc.b 126,14,14,62,14,14,126,0
	dc.b 78,78,78,126,14,14,14,0
	dc.b 126,64,64,126,14,14,126,0
	dc.b 64,64,64,126,78,78,126,0
	dc.b 126,14,14,14,14,14,14,0
	dc.b 126,78,78,126,78,78,126,0
	dc.b 126,78,78,126,14,14,14,0
	dc.b 24,24,24,0,0,0,0,0
	dc.b 60,66,90,82,90,66,60,0
	dc.b 0,0,0,0,0,24,24,0
	dc.b 0,0,0,126,0,0,0,0
	dc.b 0,0,0,0,0,24,24,8
	dc.b 126,14,14,30,0,24,24,0
	dc.b 56,56,56,56,0,24,24,0
	dc.b 126,114,114,126,114,114,114,0
	dc.b 126,114,114,124,114,114,126,0
	dc.b 126,112,112,112,112,112,126,0
	dc.b 124,114,114,114,114,114,124,0
	dc.b 126,112,112,124,112,112,126,0
	dc.b 126,112,112,124,112,112,112,0
	dc.b 126,112,112,118,114,114,126,0
	dc.b 114,114,114,126,114,114,114,0
	dc.b 60,24,24,24,24,24,60,0
	dc.b 2,2,2,2,114,114,126,0
	dc.b 114,114,114,124,114,114,114,0
	dc.b 112,112,112,112,112,112,126,0
	dc.b 66,102,122,114,114,114,114,0
	dc.b 66,98,114,122,118,114,114,0
	dc.b 126,114,114,114,114,114,126,0
	dc.b 126,114,114,126,112,112,112,0
	dc.b 126,114,114,114,114,118,126,0
	dc.b 126,114,114,124,114,114,114,0
	dc.b 126,112,112,126,2,2,126,0
	dc.b 126,24,24,24,24,24,24,0
	dc.b 114,114,114,114,114,114,126,0
	dc.b 114,114,114,114,114,50,28,0
	dc.b 114,114,114,114,122,102,66,0
	dc.b 114,114,114,60,114,114,114,0
	dc.b 114,114,114,60,24,24,24,0
	dc.b 126,6,12,24,48,112,126,0


	section "chipdata",data_c

null	dc.b 0,0,0,0,0,0,0,0,0,0

topblue1	dc.w $0000,$0000
	dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2
	dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def
	dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3
	dc.w $0000,$ff0f,$0000,$0000
topblue2	dc.w $0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818
	dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000
	dc.w $0030,$ffe0,$0000,$0000

botblue1	dc.w $0000,$0000
	dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2
	dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def
	dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3
	dc.w $0000,$ff0f,$0000,$0000
botblue2	dc.w $0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818
	dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000
	dc.w $0030,$ffe0,$0000,$0000

toppurp1	dc.w $0000,$0000
	dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2
	dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def
	dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3
	dc.w $0000,$ff0f,$0000,$0000
toppurp2	dc.w $0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818
	dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000
	dc.w $0030,$ffe0,$0000,$0000

botpurp1	dc.w $0000,$0000
	dc.w $0000,$1ff0,$03f0,$0fc8,$03f8,$0fe4,$01fc,$07f2
	dc.w $00f0,$07ff,$0003,$07fe,$0077,$0fcf,$06f7,$1def
	dc.w $0800,$1fff,$07fe,$1801,$1fe0,$3fff,$3f01,$7fe3
	dc.w $0000,$ff0f,$0000,$0000
botpurp2	dc.w $0000,$0000
	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
	dc.w $0000,$f800,$b800,$4700,$b800,$7ce0,$b0e0,$f818
	dc.w $0030,$f006,$0000,$f001,$0000,$fffe,$e000,$2000
	dc.w $0030,$ffe0,$0000,$0000

Tiles	ds.b 32
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,1,0,3,0,7,0,15,0,31,0,63,0,127,0,255
	dc.b 1,255,3,255,7,255,15,255,31,255,63,255,127,255,255,255
	dc.b 255,255,255,254,255,252,255,248,255,240,255,224,255,192,255,128
	dc.b 255,0,254,0,252,0,248,0,240,0,224,0,192,0,128,0
	dc.b 128,0,192,0,224,0,240,0,248,0,252,0,254,0,255,0
	dc.b 255,128,255,192,255,224,255,240,255,248,255,252,255,254,255,255
	dc.b 255,255,127,255,63,255,31,255,15,255,7,255,3,255,1,255
	dc.b 0,255,0,127,0,63,0,31,0,15,0,7,0,3,0,1
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255
	dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0
	dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3
	dc.b 0,3,0,15,0,63,0,255,3,255,15,255,63,255,255,255
	dc.b 255,255,63,255,15,255,3,255,0,255,0,63,0,15,0,3
	dc.b 192,0,240,0,252,0,255,0,255,192,255,240,255,252,255,255
	dc.b 255,255,255,252,255,240,255,192,255,0,252,0,240,0,192,0
	dc.b 0,0,0,0,0,0,0,0,7,224,15,240,15,240,15,240
	dc.b 15,240,15,240,15,240,7,224,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,0,0,0,15,0,255,15,255,255,255
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,15,0,255,15,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,0,0,0,0,0,0,0,0,15,0,255,15,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,15,0,255,15,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 240,0,255,0,255,240,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,0,0,0,0,0,0,0,240,0,255,0,255,240,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 240,0,255,0,255,240,255,255,255,255,255,255,255,255,255,255
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,0,0,240,0,255,0,255,240,255,255
	dc.b 255,255,15,255,0,255,0,15,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 255,255,255,255,255,255,255,255,255,255,15,255,0,255,0,15
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,15,255,0,255,0,15,0,0,0,0,0,0,0,0
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,15,255,0,255,0,15
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,255,255,255,255,255,255,255,255,240,255,0,240,0
	dc.b 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
	dc.b 255,255,255,240,255,0,240,0,0,0,0,0,0,0,0,0
	dc.b 255,255,255,255,255,255,255,255,255,255,255,240,255,0,240,0
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 255,255,255,240,255,0,240,0,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

Engine	incbin df0:Turboengine.snd

Modmain	incbin df0:mod.invasion
Modend	incbin df0:mod.gameover

