
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ   NoisetrackerV1.0 replayroutine   ญ
;ญ Mahoney & Kaktus - HALLONSOFT 1989 ญ
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;*** PUT YOUR SOUNDMODULE TO Mt_data: !

BPInit:lea	BPSong,a0
	move.l	a0,a1
	add.l	#$3b8,a1
	moveq	#$7f,d0
	moveq	#0,d1
Mt_loop:move.l	d1,d2
	subq.w	#1,d0
Mt_lop2:move.b	(a1)+,d1
	cmp.b	d2,d1
	bgt.s	Mt_loop
	dbf	d0,Mt_lop2
	addq.b	#1,d2

	lea	Mt_samplestarts(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	#$43c,d2
	add.l	a0,d2
	move.l	d2,a2
	moveq	#$1e,d0
Mt_lop3: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	#$1e,a0
	dbf	d0,Mt_lop3

	or.b	#$2,$bfe001
	move.b	#$6,Mt_speed
	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.b	Mt_songpos
	clr.b	Mt_counter
	clr.w	Mt_pattpos
	rts

Mt_end:	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	move.w	#$f,$dff096
	rts

BPMusic:
	movem.l	d0-d4/a0-a3/a5-a6,-(a7)
	lea	BPSong,a0
	addq.b	#$1,Mt_counter
	move.b	Mt_counter,D0
	cmp.b	Mt_speed,D0
	blt.s	Mt_nonew
	clr.b	Mt_counter
	bra	Mt_getnew

Mt_nonew:
	lea	Mt_voice1(pc),a6
	lea	$dff0a0,a5
	bsr	Mt_checkcom
	lea	Mt_voice2(pc),a6
	lea	$dff0b0,a5
	bsr	Mt_checkcom
	lea	Mt_voice3(pc),a6
	lea	$dff0c0,a5
	bsr	Mt_checkcom
	lea	Mt_voice4(pc),a6
	lea	$dff0d0,a5
	bsr	Mt_checkcom
	bra	Mt_endr

Mt_arpeggio:
	moveq	#0,d0
	move.b	Mt_counter,d0
	divs	#$3,d0
	swap	d0
	cmp.w	#$0,d0
	beq.s	Mt_arp2
	cmp.w	#$2,d0
	beq.s	Mt_arp1

	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	bra.s	Mt_arp3
Mt_arp1:moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	bra.s	Mt_arp3
Mt_arp2:move.w	$10(a6),d2
	bra.s	Mt_arp4
Mt_arp3:asl.w	#1,d0
	moveq	#0,d1
	move.w	$10(a6),d1
	lea	Mt_periods(pc),a0
	moveq	#$24,d7
Mt_arploop:
	move.w	(a0,d0.w),d2
	cmp.w	(a0),d1
	bge.s	Mt_arp4
	addq.l	#2,a0
	dbf	d7,Mt_arploop
	rts
Mt_arp4:move.w	d2,$6(a5)
	rts

Mt_getnew:
	lea	BPSong,a0
	move.l	a0,a3
	move.l	a0,a2
	add.l	#$c,a3
	add.l	#$3b8,a2
	add.l	#$43c,a0

	moveq	#0,d0
	move.l	d0,d1
	move.b	Mt_songpos,d0
	move.b	(a2,d0.w),d1
	asl.l	#8,d1
	asl.l	#2,d1
	add.w	Mt_pattpos,d1
	clr.w	Mt_dmacon

	lea	$dff0a0,a5
	Clr.l	offset
	lea	Mt_voice1(pc),a6
	Move.l	#Equa1,Offset
asas
	bsr.s	Mt_playvoice
	lea	$dff0b0,a5
	lea	Mt_voice2(pc),a6
	Move.l	#Equa2,Offset
	bsr.s	Mt_playvoice
	lea	$dff0c0,a5
	lea	Mt_voice3(pc),a6
	Move.l	#Equa3,Offset
	bsr.s	Mt_playvoice
	lea	$dff0d0,a5
	lea	Mt_voice4(pc),a6
	Move.l	#Equa4,Offset
	bsr.s	Mt_playvoice
	bra	Mt_setdma

Mt_playvoice:
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.b	$2(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.s	Mt_setregs
	moveq	#0,d3
	lea	Mt_samplestarts(pc),a1
	move.l	d2,d4
	subq.l	#$1,d2
	asl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2.l),$4(a6)
	move.w	(a3,d4.l),$8(a6)
	move.w	$2(a3,d4.l),$12(a6)
	move.w	$4(a3,d4.l),d3
	tst.w	d3
	beq.s	Mt_noloop
	move.l	$4(a6),d2
	asl.w	#1,d3
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$4(a3,d4.l),d0
	add.w	$6(a3,d4.l),d0
	move.w	d0,8(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
	bra.s	Mt_setregs
Mt_noloop:
	move.l	$4(a6),d2
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
Mt_setregs:
	move.w	(a6),d0
	and.w	#$fff,d0
	beq	Mt_checkcom2
	move.b	$2(a6),d0
	and.b	#$F,d0
	cmp.b	#$3,d0
	bne.s	Mt_setperiod
	bsr	Mt_setmyport
	bra	Mt_checkcom2
Mt_setperiod:
asas1	Move.l	Offset,A4
	Move.w	#$fff,(A4)
	move.w	(a6),$10(a6)
	and.w	#$fff,$10(a6)
	move.w	$14(a6),d0
	move.w	d0,$dff096
	clr.b	$1b(a6)

	move.l	$4(a6),(a5)
	move.w	$8(a6),$4(a5)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	move.w	$14(a6),d0
	or.w	d0,Mt_dmacon
	bra	Mt_checkcom2

Mt_setdma:
	move.w	#$12c,d0
Mt_wait:dbf	d0,Mt_wait
	move.w	Mt_dmacon,d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	move.w	#$12c,d0
Mt_wai2:dbf	d0,Mt_wai2
	lea	$dff000,a5
	lea	Mt_voice4(pc),a6
	move.l	$a(a6),$d0(a5)
	move.w	$e(a6),$d4(a5)
	lea	Mt_voice3(pc),a6
	move.l	$a(a6),$c0(a5)
	move.w	$e(a6),$c4(a5)
	lea	Mt_voice2(pc),a6
	move.l	$a(a6),$b0(a5)
	move.w	$e(a6),$b4(a5)
	lea	Mt_voice1(pc),a6
	move.l	$a(a6),$a0(a5)
	move.w	$e(a6),$a4(a5)

	add.w	#$10,Mt_pattpos
	cmp.w	#$400,Mt_pattpos
	bne.s	Mt_endr
Mt_nex:	clr.w	Mt_pattpos
	clr.b	Mt_break
	addq.b	#1,Mt_songpos
	and.b	#$7f,Mt_songpos
	move.b	Mt_songpos,d1
	cmp.b	BPSong+$3b6,d1
	bne.s	Mt_endr
	move.b	BPSong+$3b7,Mt_songpos
Mt_endr:tst.b	Mt_break
	bne.s	Mt_nex
	movem.l	(a7)+,d0-d4/a0-a3/a5-a6
	rts

Mt_setmyport:
	move.w	(a6),d2
	and.w	#$fff,d2
	move.w	d2,$18(a6)
	move.w	$10(a6),d0
	clr.b	$16(a6)
	cmp.w	d0,d2
	beq.s	Mt_clrport
	bge.s	Mt_rt
	move.b	#$1,$16(a6)
	rts
Mt_clrport:
	clr.w	$18(a6)
Mt_rt:	rts

Mt_myport:
	move.b	$3(a6),d0
	beq.s	Mt_myslide
	move.b	d0,$17(a6)
	clr.b	$3(a6)
Mt_myslide:
	tst.w	$18(a6)
	beq.s	Mt_rt
	moveq	#0,d0
	move.b	$17(a6),d0
	tst.b	$16(a6)
	bne.s	Mt_mysub
	add.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	bgt.s	Mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
Mt_myok:move.w	$10(a6),$6(a5)
	rts
Mt_mysub:
	sub.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	blt.s	Mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
	move.w	$10(a6),$6(a5)
	rts

Mt_vib:	move.b	$3(a6),d0
	beq.s	Mt_vi
	move.b	d0,$1a(a6)

Mt_vi:	move.b	$1b(a6),d0
	lea	Mt_sin(pc),a4
	lsr.w	#$2,d0
	and.w	#$1f,d0
	moveq	#0,d2
	move.b	(a4,d0.w),d2
	move.b	$1a(a6),d0
	and.w	#$f,d0
	mulu	d0,d2
	lsr.w	#$6,d2
	move.w	$10(a6),d0
	tst.b	$1b(a6)
	bmi.s	Mt_vibmin
	add.w	d2,d0
	bra.s	Mt_vib2
Mt_vibmin:
	sub.w	d2,d0
Mt_vib2:move.w	d0,$6(a5)
	move.b	$1a(a6),d0
	lsr.w	#$2,d0
	and.w	#$3c,d0
	add.b	d0,$1b(a6)
	rts

Mt_nop:	move.w	$10(a6),$6(a5)
	rts

Mt_checkcom:
	move.w	$2(a6),d0
	and.w	#$fff,d0
	beq.s	Mt_nop
	move.b	$2(a6),d0
	and.b	#$f,d0
	tst.b	d0
	beq	Mt_arpeggio
	cmp.b	#$1,d0
	beq.s	Mt_portup
	cmp.b	#$2,d0
	beq	Mt_portdown
	cmp.b	#$3,d0
	beq	Mt_myport
	cmp.b	#$4,d0
	beq	Mt_vib
	move.w	$10(a6),$6(a5)
	cmp.b	#$a,d0
	beq.s	Mt_volslide
	rts

Mt_volslide:
	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	tst.b	d0
	beq.s	Mt_voldown
	add.w	d0,$12(a6)
	cmp.w	#$40,$12(a6)
	bmi.s	Mt_vol2
	move.w	#$40,$12(a6)
Mt_vol2:move.w	$12(a6),$8(a5)
	rts

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

Mt_portup:
	moveq	#0,d0
	move.b	$3(a6),d0
	sub.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$71,d0
	bpl.s	Mt_por2
	and.w	#$f000,$10(a6)
	or.w	#$71,$10(a6)
Mt_por2:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

Mt_portdown:
	clr.w	d0
	move.b	$3(a6),d0
	add.w	d0,$10(a6)
	move.w	$10(a6),d0
	and.w	#$fff,d0
	cmp.w	#$358,d0
	bmi.s	Mt_por3
	and.w	#$f000,$10(a6)
	or.w	#$358,$10(a6)
Mt_por3:move.w	$10(a6),d0
	and.w	#$fff,d0
	move.w	d0,$6(a5)
	rts

Mt_checkcom2:
	move.b	$2(a6),d0
	and.b	#$f,d0
	cmp.b	#$e,d0
	beq.s	Mt_setfilt
	cmp.b	#$d,d0
	beq.s	Mt_pattbreak
	cmp.b	#$b,d0
	beq.s	Mt_posjmp
	cmp.b	#$c,d0
	beq.s	Mt_setvol
	cmp.b	#$f,d0
	beq.s	Mt_setspeed
	rts

Mt_setfilt:
	move.b	$3(a6),d0
	and.b	#$1,d0
	asl.b	#$1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts
Mt_pattbreak:
	not.b	Mt_break
	rts
Mt_posjmp:
	move.b	$3(a6),d0
	subq.b	#$1,d0
	move.b	d0,Mt_songpos
	not.b	Mt_break
	rts
Mt_setvol:
	cmp.b	#$40,$3(a6)
	ble.s	Mt_vol4
	move.b	#$40,$3(a6)
Mt_vol4:move.b	$3(a6),$8(a5)
	rts
Mt_setspeed:
	cmp.b	#$1f,$3(a6)
	ble.s	Mt_sets
	move.b	#$1f,$3(a6)
Mt_sets:move.b	$3(a6),d0
	beq.s	Mt_rts2
	move.b	d0,Mt_speed
	clr.b	Mt_counter
Mt_rts2:rts

Mt_sin:
 DC.b $00,$18,$31,$4a,$61,$78,$8d,$a1,$b4,$c5,$d4,$e0,$eb,$f4,$fa,$fd
 DC.b $ff,$fd,$fa,$f4,$eb,$e0,$d4,$c5,$b4,$a1,$8d,$78,$61,$4a,$31,$18

Mt_periods:
 DC.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a,$021a,$01fc,$01e0
 DC.w $01c5,$01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d,$010d,$00fe
 DC.w $00f0,$00e2,$00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f,$0087
 DC.w $007f,$0078,$0071,$0000,$0000

Mt_speed:	DC.b	6
Mt_songpos:	DC.b	0
Mt_pattpos:	DC.w	0
Mt_counter:	DC.b	0

Mt_break:	DC.b	0
Mt_dmacon:	DC.w	0
Mt_samplestarts:DS.L	$1f
Mt_voice1:	DS.w	10
		DC.w	1
		DS.w	3
Mt_voice2:	DS.w	10
		DC.w	2
		DS.w	3
Mt_voice3:	DS.w	10
		DC.w	4
		DS.w	3
Mt_voice4:	DS.w	10
		DC.w	8
		DS.w	3
Offset		Dc.l	0
Equa1		Dc.l	0
Equa2		Dc.l	0
Equa3		Dc.l	0
Equa4		Dc.l	0

