;*********************************
;* SoundTracker VI - Playroutine *
;*                               *
;* Improved by Unknown of D.O.C  *
;* for SoundTracker IV and VI... *
;*********************************
mt_speed	=	$1f4

mt_init:
starta:		bsr.s	mt_setup
		move.w	#$4000,$dff09a
		move.l	$6c.w,mt_oldirq+2	;needs VBR offsetting..
		move.l	#mt_newirq,$6c.w	;ditto..
		move.w	#$c000,$dff09a
		rts

mt_end:
stop:		move.w	#$000f,$dff096
		move.w	#$4000,$dff09a
		move.l	mt_oldirq+2,$6c.w	;needs VBR ofsetting..
		move.w	#$c000,$dff09a
		rts

mt_setup:	move.l	#mt_snd1,mt_sample1
		move.l	#mt_snd2,mt_sample2
		move.l	#mt_snd3,mt_sample3
		move.l	#mt_snd4,mt_sample4
		move.l	#mt_snd5,mt_sample5
		move.l	#mt_snd6,mt_sample6
		move.l	#mt_snd7,mt_sample7
		move.l	#mt_snd8,mt_sample8
		move.l	#mt_snd9,mt_sample9
		move.l	#mt_snda,mt_sample10
		move.l	#mt_sndb,mt_sample11
		move.l	#mt_sndc,mt_sample12
		move.l	#mt_sndd,mt_sample13
		move.l	#mt_snde,mt_sample14
		move.l	#mt_sndf,mt_sample15
		move.l	#mt_sample1,a0
		clr.l	d0
mt_clear:	move.l	(a0,d0),a1
		clr.l	(a1)
		addq	#4,d0
		cmp.l	#$3c,d0
		bne.s	mt_clear

		move.w	#0,$dff0a8
		move.w	#0,$dff0b8
		move.w	#0,$dff0c8
		move.w	#0,$dff0d8
		clr.l	mt_partnrplay
		clr.l	mt_partnote
		clr.l	mt_partpoint

		move.b	mt_muzakdata+$1d6,mt_maxpart+1
		move.b	mt_muzakdata+$1d7,mt_kn1+1
		rts

mt_newirq:	movem.l	d0-d7/a0-a6,-(a7)
		bsr.s	mt_music
		movem.l	(a7)+,d0-d7/a0-a6
		rte

mt_oldirq:	dc.w	$4ef9		;no self modifying code thanks..
		dc.l	$000000

mt_music:	addq.l	#1,mt_counter
mt_cool:	cmp.l	#6,mt_counter
		bne.s	mt_notsix
		clr.l	mt_counter
		bra	mt_rout2

mt_notsix:	lea	mt_aud1temp,a6
		tst.b	3(a6)
		beq.s	mt_arp1
		move.l	#$dff0a0,a5		
		bsr.s	mt_arprout

mt_arp1:	lea	mt_aud2temp,a6
		tst.b	3(a6)
		beq.s	mt_arp2
		move.l	#$dff0b0,a5
		bsr.s	mt_arprout

mt_arp2:	lea	mt_aud3temp,a6
		tst.b	3(a6)
		beq.s	mt_arp3
		move.l	#$dff0c0,a5
		bsr.s	mt_arprout

mt_arp3:	lea	mt_aud4temp,a6
		tst.b	3(a6)
		beq.s	mt_arp4
		move.l	#$dff0d0,a5
		bra.s	mt_arprout
mt_arp4:	rts

mt_arprout:	tst.w	24(a6)
		beq.s	mt_noslide

		clr.w	d0
		move.b	25(a6),d0
		lsr.b	#4,d0
		tst.b	d0
		beq.s	mt_voldwn2
		bsr	mt_pushvol1
		bra.s	mt_noslide

mt_voldwn2:	clr.w	d0
		move.b	25(a6),d0
		bsr	mt_pushvol2

mt_noslide:	move.b	2(a6),d0
		and.b	#$0f,d0
		tst.b	d0
		beq	mt_arpegrt
		cmp.b	#3,d0
		beq	mt_arpegrt
		cmp.b	#4,d0
		beq	mt_arpegrt
		cmp.b	#5,d0
		beq	mt_arpegrt
		cmp.b	#1,d0
		beq.s	mt_portup
		cmp.b	#6,d0
		beq.s	mt_portup
		cmp.b	#7,d0
		beq.s	mt_portup
		cmp.b	#8,d0
		beq.s	mt_portup
		cmp.b	#2,d0
		beq.s	mt_portdwn
		cmp.b	#9,d0
		beq.s	mt_portdwn
		cmp.b	#10,d0
		beq.s	mt_portdwn
		cmp.b	#11,d0
		beq.s	mt_portdwn
		cmp.b	#13,d0
		beq.s	mt_volup
		rts

mt_portup:	clr.w	d0
		move.b	3(a6),d0
		sub.w	d0,22(a6)
		cmp.w	#$71,22(a6)
		bpl.s	mt_ok1
		move.w	#$71,22(a6)
mt_ok1:		move.w	22(a6),6(a5)
		rts

mt_portdwn:	clr.w	d0
		move.b	3(a6),d0
		add.w	d0,22(a6)
		cmp.w	#$358,22(a6)
		bmi.s	mt_ok2
		move.w	#$358,22(a6)
mt_ok2:		move.w	22(a6),6(a5)
		rts

mt_volup:	clr.w	d0
		move.b	3(a6),d0
		lsr.b	#4,d0
		tst.b	d0
		beq.s	mt_voldwn
mt_pushvol1:	add.w	d0,$12(a6)
		cmp.w	#$40,$12(a6)
		bmi.s	mt_ok3
		move.w	#$40,$12(a6)
mt_ok3:		move.w	$12(a6),8(a5)
		rts

mt_voldwn:	clr.w	d0
		move.b	3(a6),d0
mt_pushvol2:	and.b	#$0f,d0
		sub.w	d0,$12(a6)
		bpl.s	mt_ok4
		clr.w	$12(a6)
mt_ok4:		move.w	$12(a6),8(a5)
		rts

mt_arpegrt:	cmp.l	#1,mt_counter
		beq.s	mt_loop2
		cmp.l	#2,mt_counter
		beq.s	mt_loop3
		cmp.l	#3,mt_counter
		beq.s	mt_loop4
		cmp.l	#4,mt_counter
		beq.s	mt_loop2
		cmp.l	#5,mt_counter
		beq.s	mt_loop3
		rts

mt_loop2:	clr.l	d0
		move.b	3(a6),d0
		lsr.b	#4,d0
		bra.s	mt_cont

mt_loop3:	clr.l	d0
		move.b	3(a6),d0
		and.b	#$0f,d0
		bra.s	mt_cont

mt_loop4:	move.w	16(a6),d2
		bra.s	mt_endpart

mt_cont:	lsl.w	#1,d0
		clr.l	d1
		move.w	16(a6),d1
		lea	mt_arpeggio,a0

mt_loop5:	move.w	(a0,d0),d2
		cmp.w	(a0),d1
		beq.s	mt_endpart
		addq.l	#2,a0
		bra.s	mt_loop5

mt_endpart:	move.w	d2,6(a5)
		rts

mt_rout2:	lea	mt_muzakdata,a0
		move.l	a0,a3
		add.l	#$0c,a3
		move.l	a0,a2
		add.l	#$1d8,a2
		add.l	#$258,a0
		move.l	mt_partnrplay,d0
		clr.l	d1
		move.b	(a2,d0),d1
		mulu	#$0400,d1
		add.l	mt_partnote,d1
		move.l	d1,mt_partpoint
		clr.w	mt_dmacon

		move.l	#$dff0a0,a5
		lea	mt_aud1temp,a6
		bsr	mt_playit

		move.l	#$dff0b0,a5
		lea	mt_aud2temp,a6
		bsr	mt_playit

		move.l	#$dff0c0,a5
		lea	mt_aud3temp,a6
		bsr	mt_playit

		move.l	#$dff0d0,a5
		lea	mt_aud4temp,a6
		bsr	mt_playit

		move.l	#mt_speed,d0
mt_rls:		dbf	d0,mt_rls	** LAME CPU DEPENDANT DBF LOOP!! **

		move.l	#$8000,d0
		add.w	mt_dmacon,d0
		move.w	d0,$dff096

		move.l	#mt_aud4temp,a6
		cmp.w	#1,14(a6)
		bne.s	mt_voice3
		move.l	10(a6),$dff0d0
		move.w	#1,$dff0d4
mt_voice3:	move.l	#mt_aud3temp,a6
		cmp.w	#1,14(a6)
		bne.s	mt_voice2
		move.l	10(a6),$dff0c0
		move.w	#1,$dff0c4
mt_voice2:	move.l	#mt_aud2temp,a6
		cmp.w	#1,14(a6)
		bne.s	mt_voice1
		move.l	10(a6),$dff0b0
		move.w	#1,$dff0b4
mt_voice1:	move.l	#mt_aud1temp,a6
		cmp.w	#1,14(a6)
		bne.s	mt_voice0
		move.l	10(a6),$dff0a0
		move.w	#1,$dff0a4
mt_voice0:	move.l	mt_partnote,d0
		add.l	#$10,d0
		move.l	d0,mt_partnote
		cmp.l	#$400,d0
		bne.s	mt_stop
		clr.l	mt_partnote
		addq.l	#1,mt_partnrplay
		clr.l	d0
		move.w	mt_maxpart,d0
		move.l	mt_partnrplay,d1
		cmp.l	d0,d1
		bne.s	mt_stop
		clr.l	mt_partnrplay
mt_stop:	rts

mt_playit:	move.l	(a0,d1),(a6)
		addq.l	#4,d1
		clr.l	d2
		move.b	2(a6),d2
		and.b	#$f0,d2
		lsr.b	#4,d2
		tst.b	d2
		beq.s	mt_nosamplechange

		clr.l	d3
		lea	mt_samples,a1
		move.l	d2,d4
		mulu	#4,d2
		mulu	#$1e,d4
		move.l	(a1,d2),4(a6)
		move.w	(a3,d4),8(a6)
		move.w	2(a3,d4),18(a6)
		move.w	4(a3,d4),d3
		tst.w	d3
		beq.s	mt_displace
		move.l	4(a6),d2
		add.l	d3,d2
		move.l	d2,4(a6)
		move.l	d2,10(a6)
		move.w	6(a3,d4),8(a6)
		move.w	6(a3,d4),14(a6)
		move.w	18(a6),8(a5)
		bra.s	mt_nosamplechange

mt_displace:	move.l	4(a6),d2
		add.l	d3,d2
		move.l	d2,10(a6)
		move.w	6(a3,d4),14(a6)
		move.w	18(a6),8(a5)
mt_nosamplechange:
		tst.w	(a6)
		beq.s	mt_retrout
		move.w	(a6),16(a6)
		move.w	20(a6),$dff096
		move.l	4(a6),(a5)
		move.w	8(a6),4(a5)
		move.w	(a6),6(a5)
		move.w	20(a6),d0
		or.w	d0,mt_dmacon

mt_retrout:	move.w	20(a6),d0
		lsl.w	#4,d0
		add.w	20(a6),d0
		move.w	d0,$dff09e

		tst.w	(a6)
		beq.s	mt_nonewper
		move.w	(a6),22(a6)

mt_nonewper:	move.b	2(a6),d0
		and.b	#$0f,d0
		cmp.b	#14,d0
		bne.s	mt_noset
		move.w	2(a6),24(a6)
		rts

mt_noset:	tst.b	3(a6)
		bne.s	mt_noclr
		clr.w	24(a6)
mt_noclr:	cmp.b	#3,d0
		beq.s	mt_modvol
		cmp.b	#6,d0
		beq.s	mt_modvol
		cmp.b	#9,d0
		beq.s	mt_modvol
		cmp.b	#4,d0
		beq.s	mt_modper
		cmp.b	#7,d0
		beq.s	mt_modper
		cmp.b	#10,d0
		beq.s	mt_modper
		cmp.b	#5,d0
		beq.s	mt_modvolper
		cmp.b	#8,d0
		beq.s	mt_modvolper
		cmp.b	#11,d0
		beq.s	mt_modvolper
		cmp.b	#15,d0
		beq.s	mt_chgspeed
		cmp.b	#12,d0
		bne.s	mt_nochnge
		move.b	3(a6),8(a5)
mt_nochnge:	rts

mt_chgspeed:	move.b	3(a6),d0
		and.b	#$0f,d0
		beq.s	mt_nochnge
		clr.l	mt_counter
		move.b	d0,mt_cool+5
		rts

mt_modvol:	move.w	20(a6),d0
		bra.s	mt_push

mt_modper:	move.w	20(a6),d0
		lsl.w	#4,d0
		bra.s	mt_push

mt_modvolper:	move.w	20(a6),d0
		lsl.w	#4,d0
		add.w	20(a6),d0

mt_push:	add.w	#$8000,d0
		move.w	d0,$dff09e
		rts

mt_aud1temp:	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
		dc.w $0000,$0000,$0001,$0000,$0000
mt_aud2temp:	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
		dc.w $0000,$0000,$0002,$0000,$0000
mt_aud3temp:	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
		dc.w $0000,$0000,$0004,$0000,$0000
mt_aud4temp:	dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
		dc.w $0000,$0000,$0008,$0000,$0000
mt_partnote:	dc.l 0
mt_partnrplay:	dc.l 0
mt_counter:	dc.l 0
mt_partpoint:	dc.l 0
mt_samples:	dc.w $0000,$0000
mt_sample1:	dc.l 0
mt_sample2:	dc.l 0
mt_sample3:	dc.l 0
mt_sample4:	dc.l 0
mt_sample5:	dc.l 0
mt_sample6:	dc.l 0
mt_sample7:	dc.l 0
mt_sample8:	dc.l 0
mt_sample9:	dc.l 0
mt_sample10:	dc.l 0
mt_sample11:	dc.l 0
mt_sample12:	dc.l 0
mt_sample13:	dc.l 0
mt_sample14:	dc.l 0
mt_sample15:	dc.l 0
mt_maxpart:	dc.w $0000
mt_kn1:		dc.w $0000
mt_dmacon:	dc.w $0000

mt_arpeggio:	dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c
		dc.w $023a,$021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d
		dc.w $0168,$0153,$0140,$012e,$011d,$010d,$00fe,$00f0
		dc.w $00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097
		dc.w $008f,$0087,$007f,$0078,$0071,$0000,$0000,$0000
instru:
mt_snd1:	dcb.b	6500,0
mt_snd2:	dcb.b	8900,0
mt_snd3:	dcb.b	9200,0
mt_snd4:	dcb.b	1100,0
mt_snd5:	dcb.b	4000,0
mt_snd6:	dcb.b	2000,0
mt_snd7:	dcb.b	5400,0
mt_snd8:	dcb.b	5000,0
mt_snda:	dcb.b	2000,0
mt_sndb:	dcb.b	8000,0
mt_sndc:	dcb.b	9900,0
mt_sndd:	dcb.b	2000,0
mt_snd9:	dcb.b	2,0
mt_snde:	dcb.b	2,0
mt_sndf:	dcb.b	2,0
song:
mt_muzakdata:	dcb.b	18008,0

