
	*********************************************************
	*							*
	*    TMC_Replay.s v4.2  coded by Sync/DreamDealers	*
	*		Last change : 4 August 1993		*
	*							*
	*	This replay is for 68020 and more only!!	*
	*		NOTE: VBR must be set to 0		*
	*							*
	*	bsr mt_init	: at the init (D0/A0-A1 used )	*
	*	bsr mt_music	: each vbl (D0-D7/A0-A5 used)	*
	*	bsr mt_end	: at the end (D0/A0 used )	*
	*							*
	*	Uses an interrupt of level 6  ( $78.w )		*
	*	DO NOT DISABLE the 13th and 14th bits of INTENA	*
	*	ALSO DO NOT DISABLE bit 9 of DMACON if ya want	*
	*	to hear something...				*
	*	Also uses the CIA-B timer B for initializing	*
	*	the samples while replaying			*
	*							*
	*  Suported commands :  0/1/2/3/4/5/6/7/9/A/B/C/D/F	*
	*			E0/E1/E2/E6/E9/EA/EB/EC/ED/EE	*
	*			+ FineTune			*
	*							*
	*********************************************************

	rsreset
mt_struct_voice	rs.b 0
mt_info		rs.b 1
mt_sampleoffset	rs.b 1
mt_finetune	rs.l 1
mt_samp_adr	rs.l 1
mt_len		rs.w 1
mt_volume	rs.w 1
mt_repeat	rs.l 1
mt_replen	rs.w 1
mt_period	rs.w 1
mt_port_per	rs.w 1
mt_port_speed	rs.w 1
mt_vib_depth	rs.w 1
mt_trem_depth	rs.w 1
mt_vib_rate	rs.b 1
mt_trem_rate	rs.b 1
mt_vib_pos	rs.b 1
mt_trem_pos	rs.b 1
mt_retrig_tic	rs.w 1
mt_cutnote_tic	rs.b 1
mt_delay_tic	rs.b 1
mt_loop_counter	rs.b 1
mt_vumetre	rs.b 1
mt_loop_start	rs.w 1
mt_function	rs.w 1
mt_dma		rs.w 1
mt_SIZEOF	rs.b 0
	rsreset
mt_sample	rs.b 0
mt_samp_repeat	rs.l 1
mt_samp_replen	rs.w 1
mt_samp_volume	rs.w 1
mt_samp_length	rs.w 1
mt_samp_data	rs.w 0
mt_init
	lea mt_voice0(pc),a0
	moveq #mt_SIZEOF-1,d0
mt_clear_voice
	clr.l (a0)+
	dbf d0,mt_clear_voice
	addq.w #$1,mt_voice0+mt_dma-mt_dmacon(a0)
	addq.w #$2,mt_voice1+mt_dma-mt_dmacon(a0)
	addq.w #$4,mt_voice2+mt_dma-mt_dmacon(a0)
	addq.w #$8,mt_voice3+mt_dma-mt_dmacon(a0)
	clr.w (a0)
	lea mt_pos(pc),a1
	move.l a1,mt_songpos-mt_dmacon(a0)
	move.l (a1),a1
	move.w (a1),mt_pattern_len-mt_dmacon(a0)
	move.l #(5<<16)!(5),mt_counter-mt_dmacon(a0)
	move.l #(2<<16),mt_pattpos-mt_dmacon(a0)
	bsr.s mt_set_global_volume
	lea $dff000,a0
	lea $bfe000,a1
	move.w #$2000,$9a(a0)
	move.l #mt_IT6_1,$78.w
	move.b #$7f,$dd00-$e000(a1)
	move.b #$80,$d600-$e000(a1)
	move.b #$01,$d700-$e000(a1)
	move.b #$19,$df00-$e000(a1)
	bset #1,$e001-$e000(a1)
mt_wait
	btst #1,$dd00-$e000(a1)
	beq.s mt_wait
	move.b #$82,$dd00-$e000(a1)
	move.w #$2000,$9c(a0)
	move.w #$a000,$9a(a0)
mt_end
	moveq #0,d0
	lea $dff000,a0
	move.w d0,$a8(a0)
	move.w d0,$b8(a0)
	move.w d0,$c8(a0)
	move.w d0,$d8(a0)
	move.w #$f,$96(a0)
	rts
mt_set_global_volume
	move.l mt_global_volume(pc),d0
	divu.l #100,d0
	lea mt_percent(pc),a0
	move.l d0,(a0)
	rts
mt_music
	lea mt_samples_list(pc),a4
	move.w mt_counter(pc),d0
	cmp.w mt_speed(pc),d0
	bne mt_nonew
	clr.l mt_dmacon-mt_samples_list(a4)
	move.l mt_songpos(pc),a0
	move.l (a0),a0
	add.w mt_pattpos(pc),a0
	lea mt_voice0(pc),a1
	lea $dff000,a3
	lea $a0(a3),a2
	moveq #0,d3
	moveq #4-1,d4
	moveq #3*4,d5
	move.w mt_pattdelay(pc),d6
	moveq #0,d7
	bra.s mt_playvoice
mt_loop_playvoice
	lea mt_SIZEOF(a1),a1
	lea $10(a2),a2
mt_playvoice
	tst.b mt_vumetre(a1)
	beq.s mt_vumetre_init
	subq.b #1,mt_vumetre(a1)
mt_vumetre_init
	move.b (a0)+,d1
	bmi mt_pack
	and.w #$7c,d1
	beq.s mt_oldinstr
	move.l -4(a4,d1.w),a5
	move.l (a5)+,mt_len(a1)
	move.w -2(a5),8(a2)
	move.l (a5)+,mt_repeat(a1)
	move.w (a5)+,mt_replen(a1)
	move.l (a5)+,mt_finetune(a1)
	move.l a5,mt_samp_adr(a1)
	move.b mt_volume+1(a1),mt_vumetre(a1)
mt_oldinstr	
	moveq #0,d0
	move.w mt_volume(a1),d0
	mulu.l mt_percent(pc),d0
	swap d0
	move.w d0,8(a2)
	move.b (a0)+,d0
	and.w #$f,d0
	move.w d0,mt_function(a1)
	jmp mt_com2_function(pc,d0.w*4)
mt_com2_function
	bra.w mt_others
	bra.w mt_others
	bra.w mt_others
	bra.w mt_setport
	bra.w mt_others
	bra.w mt_setvolport
	bra.w mt_others
	bra.w mt_others
	bra.w mt_others
	bra.w mt_sample_offset
	bra.w mt_others
	bra.w mt_posjmp
	bra.w mt_setvol
	bra.w mt_pattbreak
	bra.w mt_E_commands
mt_set_speed
	move.b (a0)+,mt_speed+1-mt_samples_list(a4)
	bra mt_set_instr
mt_setvolport
	move.b (a0)+,(a1)
	bra.s mt_do_setport
mt_setport
	move.b (a0)+,d1
	beq.s mt_do_setport
	move.w d1,mt_port_speed(a1)
mt_do_setport
	bfextu -3(a0){6:6},d1
	move.l mt_finetune(a1),a5
	move.w (a5,d1.w*2),d0
	beq mt_no_instr
	move.b mt_volume+1(a1),mt_vumetre(a1)
	move.w d0,mt_port_per(a1)
	dbf d4,mt_loop_playvoice
	bra mt_end_playvoice
mt_sample_offset
	move.b (a0)+,d1
	beq.s mt_offset_old
	move.b d1,mt_sampleoffset(a1)
mt_offset_old
	move.b mt_sampleoffset(a1),d1
	lsl.w #7,d1
	cmp.w mt_len(a1),d1
	bge.s mt_offset_skip
	sub.w d1,mt_len(a1)
	add.w d1,d1
	add.l d1,mt_samp_adr(a1)
	bra mt_set_instr
mt_offset_skip
	move.w #$1,mt_len(a1)
	move.w mt_dma(a1),$96(a3)
	dbf d4,mt_loop_playvoice
	bra mt_end_playvoice
mt_posjmp
	move.w #2,mt_pattpos-mt_samples_list(a4)
	move.b (a0)+,d1
	lea mt_pos-mt_samples_list(a4,d1.w*2),a5
	move.l a5,mt_songpos-mt_samples_list(a4)
	move.l (a5),a5
	move.w (a5),mt_pattern_len-mt_samples_list(a4)
	moveq #-5,d3
	bra mt_set_instr
mt_setvol
	moveq #0,d1
	move.b (a0)+,d1
	move.b d1,mt_volume+1(a1)
	mulu.l mt_percent(pc),d1
	swap d1
	move.w d1,8(a2)
	bra mt_set_instr
mt_pattbreak
	move.b (a0)+,d1
	move.w mt_break(pc,d1.w),mt_pattpos-mt_samples_list(a4)
	addq.w #1,d3
	bra mt_set_instr
mt_break
	dc.w 2,14,26,38,50,62,74,86,98,110,122,134,146,158,170,182,194
	dc.w 206,218,230,242,254,266,278,290,302,314,326,338,350,362
	dc.w 374,386,398,410,422,434,446,458,470,482,494,506,518,530
	dc.w 542,554,566,578,590,602,614,626,638,650,662,674,686,698
	dc.w 710,722,734,746,758
mt_E_commands
	move.b (a0)+,d1
	move.b d1,d2
	and.w #$f0,d1
	lsr.w #2,d1
	and.w #$f,d2
	jmp mt_com2_E_function(pc,d1.w)
mt_com2_E_function
	bra.w mt_set_filter
	bra.w mt_fineslide_up
	bra.w mt_fineslide_down
	bra.w mt_set_instr
	bra.w mt_set_instr
	bra.w mt_set_instr
	bra.w mt_set_loop
	bra.w mt_set_instr
	bra.w mt_set_instr
	bra.w mt_set_retrig
	bra.w mt_finevolslide_up
	bra.w mt_finevolslide_down
	bra.w mt_set_cutnote
	bra.w mt_set_notedelay
	bra.w mt_set_patterndelay
	bra.w mt_set_instr
mt_set_filter
	beq.s mt_filter_on
	bset #1,$bfe001
	bra mt_set_instr
mt_filter_on
	bclr #1,$bfe001
	bra mt_set_instr
mt_fineslide_up
	bfextu -3(a0){6:6},d1
	move.l mt_finetune(a1),a5
	move.w (a5,d1.w*2),d0
	beq mt_no_instr
	sub.w d2,d0
	bra mt_E_branch
mt_fineslide_down
	bfextu -3(a0){6:6},d1
	move.l mt_finetune(a1),a5
	move.w (a5,d1.w*2),d0
	beq mt_no_instr
	add.w d2,d0
	bra mt_E_branch
mt_set_loop
	beq.s mt_init_loop_start
	tst.b mt_loop_counter(a1)
	bne.s mt_jump_loop
	move.b d2,mt_loop_counter(a1)
	move.w mt_loop_start(a1),mt_pattpos-mt_samples_list(a4)
	moveq #-1,d7
	bra mt_set_instr
mt_init_loop_start
	move.w mt_pattpos(pc),mt_loop_start(a1)
	bra mt_set_instr
mt_jump_loop
	subq.b #1,mt_loop_counter(a1)
	beq.s mt_remove_loop
	move.w mt_loop_start(a1),mt_pattpos-mt_samples_list(a4)
	moveq #-1,d7
	bra mt_set_instr
mt_remove_loop
	clr.w mt_loop_start(a1)
	bra mt_set_instr
mt_set_retrig
	beq.s mt_zero_retrig
	move.w d2,mt_retrig_tic(a1)
	move.w #$10,mt_function(a1)
mt_zero_retrig
	bra mt_set_instr
mt_finevolslide_up
	add.w d2,mt_volume(a1)
	cmp.w #64,mt_volume(a1)
	ble.s mt_finevolslide_ok
	move.w #64,mt_volume(a1)
mt_finevolslide_ok
	moveq #0,d0
	move.w mt_volume(a1),d0
	mulu.l mt_percent(pc),d0
	swap d0
	move.w d0,8(a2)
	bra.s mt_set_instr
mt_finevolslide_down
	sub.w d2,mt_volume(a1)
	bge.s mt_finevolslide_ok
	move.w #0,8(a2)
	clr.w mt_volume(a1)
	bra.s mt_set_instr
mt_set_cutnote
	move.b d2,mt_cutnote_tic(a1)
	move.w #$11,mt_function(a1)
	bra.s mt_set_instr
mt_set_notedelay
	move.b d2,mt_delay_tic(a1)
	move.w #$12,mt_function(a1)
	bra.s mt_no_instr
mt_set_patterndelay
	tst.w mt_pattdelay-mt_samples_list(a4)
	bne.s mt_set_instr
	move.w d2,d6
	addq.w #1,d6
	bra.s mt_set_instr
mt_pack
	and.w #$3,d1
	sub.w d1,d4
	addq.w #1,d5
mt_pack_skip
	moveq #0,d0
	move.w mt_volume(a1),d0
	mulu.l mt_percent(pc),d0
	swap d0
	move.w d0,8(a2)
	clr.b (a1)
	clr.w mt_function(a1)
	lea mt_SIZEOF(a1),a1
	lea $10(a2),a2
	subq.w #3,d5
	dbf d1,mt_pack_skip
	dbf d4,mt_playvoice
	bra.s mt_end_playvoice
mt_others
	move.b (a0)+,(a1)
mt_set_instr
	bfextu -3(a0){6:6},d1
	move.l mt_finetune(a1),a5
	move.w (a5,d1.w*2),d0
	beq.s mt_no_instr
	move.b mt_volume+1(a1),mt_vumetre(a1)
mt_E_branch
	move.w mt_dma(a1),d1
	move.w d1,$96(a3)
	or.w d1,mt_dmacon-mt_samples_list(a4)
	move.l mt_samp_adr(a1),(a2)
	move.w mt_len(a1),4(a2)
	move.w d0,mt_period(a1)
	move.w d0,6(a2)
	clr.w mt_vib_pos(a1)
mt_no_instr
	dbf d4,mt_loop_playvoice
mt_end_playvoice
	tst.w mt_dmacon-mt_samples_list(a4)
	beq.s mt_nodma
	move.b #$19,$bfdf00
	or.w #$8000,mt_dmacon-mt_samples_list(a4)
mt_nodma
	tst.w d6
	beq.s mt_no_pattdelay
	subq.w #1,d6
	move.w d6,mt_pattdelay-mt_samples_list(a4)
	bne.s mt_exit
mt_no_pattdelay
	tst.w d7
	bne.s mt_exit
	tst.w d3
	bmi.s mt_exit
	bne.s mt_do_break
	add.w d5,mt_pattpos-mt_samples_list(a4)
	move.w mt_pattern_len(pc),d0
	cmp.w mt_pattpos-mt_samples_list(a4),d0
	bne.s mt_exit
	move.w #2,mt_pattpos-mt_samples_list(a4)
mt_do_break
	addq.l #4,mt_songpos-mt_samples_list(a4)
	move.l mt_songpos(pc),a0
	cmp.l #mt_pos_end,a0
	blt.s mt_exit2
	move.l mt_restart(pc),a0
	move.l a0,mt_songpos-mt_samples_list(a4)
mt_exit2
	move.l (a0),a0
	move.w (a0),mt_pattern_len-mt_samples_list(a4)
mt_exit
	rts
mt_do_retrig
	move.w mt_dmacon(pc),d1
	beq.s mt_retrig_nodma
	move.w d1,$96-$d0(a1)
	move.b #$19,$bfdf00
	or.w #$8000,mt_dmacon-mt_samples_list(a4)
mt_retrig_nodma
	rts
mt_nonew
	pea mt_do_retrig(pc)
	clr.w mt_dmacon-mt_samples_list(a4)
	addq.w #1,mt_counter-mt_samples_list(a4)
	lea mt_voice0(pc),a0
	lea $dff0a0,a1
	moveq #4-1,d4
	bra.s mt_com
mt_loop_nonew
	lea mt_SIZEOF(a0),a0
	lea $10(a1),a1
mt_com
	tst.b mt_vumetre(a0)
	beq.s mt_vumetre_com
	subq.b #1,mt_vumetre(a0)
mt_vumetre_com
	moveq #0,d1
	move.w mt_volume(a0),d1
	mulu.l mt_percent(pc),d1
	swap d1
	move.w d1,8(a1)
	move.w mt_function(a0),d0
	jmp mt_com_function(pc,d0.w*4)
mt_com_function
	bra.w mt_check_arp
	bra.w mt_portup
	bra.w mt_portdown
	bra.w mt_port
	bra.w mt_vibrato
	bra.w mt_volport
	bra.w mt_volvib
	bra.w mt_tremolo
	bra.w mt_com_exit
	bra.w mt_com_exit
	bra.w mt_volslide
	bra.w mt_com_exit
	bra.w mt_com_exit
	bra.w mt_com_exit
	bra.w mt_com_exit
	bra.w mt_com_exit
	bra.w mt_retrig
	bra.w mt_cutnote
	bra.w mt_notedelay
mt_check_arp
	move.b (a0),d1
	bne.s mt_arp
mt_normper
	move.w mt_period(a0),6(a1)
mt_com_exit
	dbf d4,mt_loop_nonew
	rts
mt_arp
	move.w mt_counter(pc),d0
	move.b mt_arplist(pc,d0.w),d0
	beq.s mt_normper
	bpl.s mt_arp2
mt_arp1
	lsr.b #4,d1
mt_arp2
	and.w d0,d1
mt_arpdo
	move.w mt_period(a0),d0
	move.l mt_finetune(a0),a2
mt_search_arp
	cmp.w (a2)+,d0
	blt.s mt_search_arp
mt_arpfound
	move.w -2(a2,d1.w*2),6(a1)
	dbf d4,mt_loop_nonew
	rts
mt_arplist
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f,0,$8f,$f
	dc.b 0,$8f,$f,0,$8f,$f,0,$8f,$f,0
mt_portup
 	move.b (a0),d0
	move.w mt_period(a0),d1
	sub.w d0,d1
	cmp.w #113,d1
	bge.s mt_portup2
	move.w #113,d1
mt_portup2
	move.w d1,mt_period(a0)
	move.w d1,6(a1)
	dbf d4,mt_loop_nonew
	rts
mt_portdown
	move.b (a0),d0
	move.w mt_period(a0),d1
	add.w d0,d1
	cmp.w #856,d1
	ble.s mt_portup2
	move.w #856,d1
	move.w d1,mt_period(a0)
	move.w d1,6(a1)
	dbf d4,mt_loop_nonew
	rts
mt_port
	pea mt_com_exit(pc)
mt_port2
	move.w mt_period(a0),d0
	beq.s mt_port_exit
	move.w mt_port_per(a0),d1
	beq.s mt_port_exit
	cmp.w d0,d1
	beq.s mt_port_end
	bgt.s mt_port_add
mt_port_sub
	sub.w mt_port_speed(a0),d0
	cmp.w d0,d1
	bge.s mt_port_end
	move.w d0,6(a1)
	move.w d0,mt_period(a0)
mt_port_exit
	rts
mt_port_add
	add.w mt_port_speed(a0),d0
	cmp.w d0,d1
	ble.s mt_port_end
	move.w d0,6(a1)
	move.w d0,mt_period(a0)
	rts
mt_port_end
	move.w d1,6(a1)
	move.w d1,mt_period(a0)
	clr.w mt_port_per(a0)
	rts
mt_vibrato
	pea mt_com_exit(pc)
	move.b (a0),d1
	beq.s mt_vibrato2
	move.b d1,d2
	and.w #$f,d2
	beq.s mt_vib_skip
	add.w d2,d2
	add.w d2,d2
	move.b d2,mt_vib_rate(a0)
mt_vib_skip
	and.w #$f0,d1
	beq.s mt_vibrato2
	add.w d1,d1
	move.w d1,mt_vib_depth(a0)
mt_vibrato2
	moveq #$3c,d1
	and.b mt_vib_pos(a0),d1
	lsr.w #2,d1
	add.w mt_vib_depth(a0),d1
	move.b mt_vibrato_table(pc,d1.w),d0
	move.w mt_period(a0),d1
	tst.b mt_vib_pos(a0)
	bpl.s mt_vib_add
	neg.w d0
mt_vib_add
	add.w d0,d1
	move.w d1,6(a1)
	move.b mt_vib_rate(a0),d0
	add.b d0,mt_vib_pos(a0)
	rts
mt_vibrato_table
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0
	dc.b 0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,0,0
	dc.b 0,0,1,1,2,2,3,3,4,4,4,5,5,5,5,5,5,5,5,5,5,5,4,4,4,3,3,2,2,1,1,0
	dc.b 0,0,1,2,3,3,4,5,5,6,6,7,7,7,7,7,7,7,7,7,7,7,6,6,5,5,4,3,3,2,1,0
	dc.b 0,0,1,2,3,4,5,6,7,7,8,8,9,9,9,9,9,9,9,9,9,8,8,7,7,6,5,4,3,2,1,0
	dc.b 0,1,2,3,4,5,6,7,8,9,9,10,11,11,11,11,11,11,11,11,11,10,9,9,8,7,6,5,4,3,2,1
	dc.b 0,1,2,4,5,6,7,8,9,10,11,12,12,13,13,13,13,13,13,13,12,12,11,10,9,8,7,6,5,4,2,1
	dc.b 0,1,3,4,6,7,8,10,11,12,13,14,14,15,15,15,15,15,15,15,14,14,13,12,11,10,8,7,6,4,3,1
	dc.b 0,1,3,5,6,8,9,11,12,13,14,15,16,17,17,17,17,17,17,17,16,15,14,13,12,11,9,8,6,5,3,1
	dc.b 0,1,3,5,7,9,11,12,14,15,16,17,18,19,19,19,19,19,19,19,18,17,16,15,14,12,11,9,7,5,3,1
	dc.b 0,2,4,6,8,10,12,13,15,16,18,19,20,20,21,21,21,21,21,20,20,19,18,16,15,13,12,10,8,6,4,2
	dc.b 0,2,4,6,9,11,13,15,16,18,19,21,22,22,23,23,23,23,23,22,22,21,19,18,16,15,13,11,9,6,4,2
	dc.b 0,2,5,7,9,12,14,16,18,20,21,22,23,24,25,25,25,25,25,24,23,22,21,20,18,16,14,12,9,7,5,2
	dc.b 0,2,5,8,10,13,15,17,19,21,23,24,25,26,27,27,27,27,27,26,25,24,23,21,19,17,15,13,10,8,5,2
	dc.b 0,2,5,8,11,14,16,18,21,23,24,26,27,28,29,29,29,29,29,28,27,26,24,23,21,18,16,14,11,8,5,2
mt_tremolo
	move.b (a0),d1
	beq.s mt_tremolo2
	move.b d1,d2
	and.w #$f,d2
	beq.s mt_trem_skip
	add.w d2,d2
	add.w d2,d2
	move.b d2,mt_trem_rate(a0)
mt_trem_skip
	and.w #$f0,d1
	beq.s mt_tremolo2
	add.w d1,d1
	move.w d1,mt_trem_depth(a0)
mt_tremolo2
	moveq #$3c,d1
	and.b mt_trem_pos(a0),d1
	lsr.w #2,d1
	add.w mt_trem_depth(a0),d1
	move.b mt_tremolo_table(pc,d1.w),d0
	moveq #0,d1
	move.w mt_volume(a0),d1
	tst.b mt_trem_pos(a0)
	bpl.s mt_trem_add
	neg.w d0
mt_trem_add
	add.w d0,d1
	bpl.s mt_trem_pl
	moveq #0,d1
	bra.s mt_trem_le
mt_trem_pl
	cmp.b #$40,d1
	ble.s mt_trem_le
	moveq #$40,d1
mt_trem_le
	mulu.l mt_percent(pc),d1
	swap d1
	move.w d1,8(a1)
	move.b mt_trem_rate(a0),d0
	add.b d0,mt_trem_pos(a0)
	dbf d4,mt_loop_nonew
	rts
mt_tremolo_table
	dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	dc.b 0,0,0,1,1,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,1,1,1,0,0
	dc.b 0,0,1,2,3,3,4,5,5,6,6,7,7,7,7,7,7,7,7,7,7,7,6,6,5,5,4,3,3,2,1,0
	dc.b 0,1,2,3,4,5,6,7,8,9,9,10,11,11,11,11,11,11,11,11,11,10,9,9,8,7,6,5,4,3,2,1
	dc.b 0,1,3,4,6,7,8,10,11,12,13,14,14,15,15,15,15,15,15,15,14,14,13,12,11,10,8,7,6,4,3,1
	dc.b 0,1,3,5,7,9,11,12,14,15,16,17,18,19,19,19,19,19,19,19,18,17,16,15,14,12,11,9,7,5,3,1
	dc.b 0,2,4,6,9,11,13,15,16,18,19,21,22,22,23,23,23,23,23,22,22,21,19,18,16,15,13,11,9,6,4,2
	dc.b 0,2,5,8,10,13,15,17,19,21,23,24,25,26,27,27,27,27,27,26,25,24,23,21,19,17,15,13,10,8,5,2
	dc.b 0,3,6,9,12,15,17,20,22,24,26,28,29,30,31,31,31,31,31,30,29,28,26,24,22,20,17,15,12,9,6,3
	dc.b 0,3,6,10,13,16,19,22,25,27,29,31,33,34,35,35,35,35,35,34,33,31,29,27,25,22,19,16,13,10,6,3
	dc.b 0,3,7,11,15,18,22,25,28,30,33,35,36,38,39,39,39,39,39,38,36,35,33,30,28,25,22,18,15,11,7,3
	dc.b 0,4,8,12,16,20,24,27,30,33,36,38,40,41,42,43,43,43,42,41,40,38,36,33,30,27,24,20,16,12,8,4
	dc.b 0,4,9,13,18,22,26,30,33,36,39,42,44,45,46,47,47,47,46,45,44,42,39,36,33,30,26,22,18,13,9,4
	dc.b 0,5,10,15,19,24,28,32,36,40,43,45,47,49,50,51,51,51,50,49,47,45,43,40,36,32,28,24,19,15,10,5
	dc.b 0,5,10,16,21,26,30,35,39,43,46,49,51,53,54,55,55,55,54,53,51,49,46,43,39,35,30,26,21,16,10,5
	dc.b 0,5,11,17,22,28,33,37,42,46,49,52,55,57,58,59,59,59,58,57,55,52,49,46,42,37,33,28,22,17,11,5
mt_volport
	pea mt_volslide(pc)
	bra mt_port2
mt_volvib
	bsr mt_vibrato2
mt_volslide
	move.b (a0),d0
	add.b d0,mt_volume+1(a0)
	bmi.s mt_vol2
	cmp.w #64,mt_volume(a0)
	ble.s mt_vol1
	move.w #64,mt_volume(a0)
mt_vol1
	moveq #0,d0
	move.w mt_volume(a0),d0
	mulu.l mt_percent(pc),d0
	swap d0
	move.w d0,8(a1)
	dbf d4,mt_loop_nonew
	rts
mt_vol2
	move.w #0,8(a1)
	clr.w mt_volume(a0)
	dbf d4,mt_loop_nonew
	rts
mt_retrig
	move.w mt_speed(pc),d0
	sub.w mt_counter(pc),d0
	divu.w mt_retrig_tic(a0),d0
	swap d0
	tst.w d0
	bne.s mt_no_retrig
	move.w mt_dma(a0),d0
	or.w d0,mt_dmacon-mt_samples_list(a4)
	move.l mt_samp_adr(a0),(a1)
	move.w mt_len(a0),4(a1)
	move.w mt_period(a0),6(a1)
mt_no_retrig
	dbf d4,mt_loop_nonew
	rts
mt_cutnote
	move.w mt_speed(pc),d0
	sub.w mt_counter(pc),d0
	cmp.b mt_cutnote_tic(a0),d0
	bge.s mt_no_cutnote
	move.w #0,8(a1)
	clr.w mt_volume(a0)
	move.w #$E,mt_function(a0)
mt_no_cutnote
	dbf d4,mt_loop_nonew
	rts
mt_notedelay
	move.w mt_speed(pc),d0
	sub.w mt_counter(pc),d0
	cmp.b mt_delay_tic(a0),d0
	bge.s mt_no_notedelay
	move.w mt_dma(a0),d0
	or.w d0,mt_dmacon-mt_samples_list(a4)
	move.l mt_samp_adr(a0),(a1)
	move.w mt_len(a0),4(a1)
	move.w mt_period(a0),6(a1)
	move.w #$E,mt_function(a0)
mt_no_notedelay
	dbf d4,mt_loop_nonew
	rts
mt_IT6_1
	move.w mt_dmacon(pc),$dff096
	tst.b $bfdd00
	add.l #mt_IT6_2-mt_IT6_1,$78.w
	move.b #$19,$bfdf00
	move.w #$2000,$dff09c
	rte
mt_IT6_2
	move.l a0,-(sp)
	lea $dff0a0,a0
	move.l mt_voice0+mt_repeat(pc),(a0)+
	move.w mt_voice0+mt_replen(pc),(a0)
	move.l mt_voice1+mt_repeat(pc),$b0-$a4(a0)
	move.w mt_voice1+mt_replen(pc),$b4-$a4(a0)
	move.l mt_voice2+mt_repeat(pc),$c0-$a4(a0)
	move.w mt_voice2+mt_replen(pc),$c4-$a4(a0)
	move.l mt_voice3+mt_repeat(pc),$d0-$a4(a0)
	move.w mt_voice3+mt_replen(pc),$d4-$a4(a0)
	tst.b $bfdd00
	sub.l #mt_IT6_2-mt_IT6_1,$78.w
	move.w #$2000,$9c-$a4(a0)
	move.l (sp)+,a0
	rte
	CNOP 0,4
mt_songpos	ds.l 1
mt_percent	ds.l 1
mt_voice0	ds.b mt_SIZEOF
mt_voice1	ds.b mt_SIZEOF
mt_voice2	ds.b mt_SIZEOF
mt_voice3	ds.b mt_SIZEOF
mt_dmacon	ds.w 1
mt_counter	ds.w 1
mt_speed	ds.w 1
mt_pattpos	ds.w 1
mt_pattdelay	ds.w 1
mt_pattern_len	ds.w 1

*************************************************
* INCLUDE here the file Song.s generated by TMC *
* and -maybe- somewhere else the file Samples.s *
*************************************************
