;***************************************
;*     PATTERNSPACKER  REPLAY V2.0     *
;*   BY EUREKA FROM CONCEPT IN 1991    *
;***************************************    
;*    WARNING THIS REPLAY RUN WITH     *
;*         NOISE/STAR MODULES          *
;*    IF YOU WANT PLAY A SOUNDTRACK    *
;*       THEN CHANGE LINE 177          *
;*         $3b7(a0)  by  #0            *
;***************************************
;*      VOLUME AT  MT_VOICEx+34.b      *
;*(-mt_down PER FRAME) , DONT CARE $Cnn*
;*         VALUE   0 <=> 63            *
;***************************************
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;ญ   NoisetrackerV2.0 Normal replay   ญ
;ญ  9 rasterlines + 2 * 4 lines wait  ญ
;ญ Read instructions at lines 136-155 ญ
;ญ Mahoney & Kaktus - (C) E.A.S. 1990 ญ
;ญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญญ
;mt_data=$50000

mt_down	=	1			; volume -1 per frame

mt_init:lea	mt_data,a0
	move.l	1080(a0),d2
	move.l	a0,a2
	add.l	d2,a2
	lea	mt_samplestarts(pc),a1
	add.l	#42,a0
	moveq	#$1e,d0
mt_lop3:clr.l	(a2)
	move.l	a2,(a1)+
	moveq	#0,d1
	move.w	(a0),d1
	clr.b	2(a0)
	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
	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)
	clr.b	mt_songpos
	clr.b	mt_counter
	clr.w	mt_pattpos


	lea	mt_data+952,a0
	moveq	#0,d0
	move.b	(a0),d0
	lsl	#3,d0
	lea	mt_data+1084,a0
	add.l	d0,a0
	move.l	#mt_data,d1

	lea	mt_voice1,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	clr.b	34(a1)
	lea	mt_voice2,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	clr.b	34(a1)
	lea	mt_voice3,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	clr.b	34(a1)
	lea	mt_voice4,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	clr.b	34(a1)

	rts

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


mt_music:
	lea	mt_data,a0
	addq.b	#1,mt_counter
	move.b	mt_counter(pc),d0
	cmp.b	mt_speed(pc),d0
	blt	mt_nonew
	clr.b	mt_counter

	
	lea	mt_data,a0
	lea	$c(a0),a3
	lea	$3b8(a0),a2
	lea	$43c(a0),a0

	moveq	#0,d0
	moveq	#0,d1
	move.b	mt_songpos(pc),d0
	move.b	(a2,d0.w),d1
	lsl.w	#8,d1
	lsl.w	#2,d1
	add.w	mt_pattpos(pc),d1
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_voice1(pc),a4
	bsr	mt_playvoice
	bsr	mt_vol_down
	addq.l	#4,d1
	lea	$dff0b0,a5
	lea	mt_voice2(pc),a4
	bsr	mt_playvoice
	bsr	mt_vol_down
	addq.l	#4,d1
	lea	$dff0c0,a5
	lea	mt_voice3(pc),a4
	bsr	mt_playvoice
	bsr	mt_vol_down
	addq.l	#4,d1
	lea	$dff0d0,a5
	lea	mt_voice4(pc),a4
	bsr	mt_playvoice
	bsr	mt_vol_down

	bsr	mt_wait
	move.w	mt_dmacon(pc),d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	bsr	mt_wait2
mt_nodma:
	lea	mt_voice1(pc),a4
	lea	$dff000,a3
	move.l	$a(a4),$a0(a3)
	move.w	$e(a4),$a4(a3)
	move.w	$12(a4),$a8(a3)
	move.l	$a+$28(a4),$b0(a3)
	move.w	$e+$28(a4),$b4(a3)
	move.w	$12+$28(a4),$b8(a3)
	move.l	$a+$50(a4),$c0(a3)
	move.w	$e+$50(a4),$c4(a3)
	move.w	$12+$50(a4),$c8(a3)
	move.l	$a+$78(a4),$d0(a3)
	move.w	$e+$78(a4),$d4(a3)
	move.w	$12+$78(a4),$d8(a3)

	add.w	#$10,mt_pattpos
	cmp.w	#$400,mt_pattpos
	bne	mt_exit1
mt_next:clr.w	mt_pattpos
	clr.b	mt_break
	lea	mt_data,a0
	addq.b	#1,mt_songpos
	and.b	#$7f,mt_songpos
	move.b	$3b6(a0),d0
	cmp.b	mt_songpos(pc),d0
	bne.s	mt_exit
	move.b	$3b7(a0),mt_songpos		; change for soundtrack!!!!
mt_exit:
	lea	mt_data+952,a0
	moveq	#0,d0
	move.b	mt_songpos,d0
	add.l	d0,a0

	moveq	#0,d0
	move.b	(a0),d0
	lsl	#3,d0
	lea	mt_data+1084,a0
	add.l	d0,a0
	move.l	#mt_data,d1

	lea	mt_voice1,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	lea	mt_voice2,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	lea	mt_voice3,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)
	lea	mt_voice4,a1
	moveq	#0,d0
	move	(a0)+,D0
	add.l	d1,D0
	move.l	d0,30(a1)
	clr	28(a1)

mt_exit1:tst.b	mt_break
	bne	mt_next
	rts

mt_wait:moveq	#3,d3		;These routines can be replaced with
mt_wai2:move.b	$dff006,d2	;something that takes at least four
mt_wai3:cmp.b	$dff006,d2	;rasterlines. Remove the semicolons
	beq.s	mt_wai3		;below. You do not have to worry about
	dbf	d3,mt_wai2	;any registers.
	moveq	#8,d2
mt_wai4:dbf	d2,mt_wai4
	rts
mt_wait2:	moveq	#3,d3
mt_wa22:	move.b	$dff006,d2
mt_wa23:	cmp.b	$dff006,d2
		beq.s	mt_wa23
		dbf	d3,mt_wa22
		moveq	#8,d2
mt_wa24:	dbf	d2,mt_wa24
		rts

mt_nonew:			;bsr.s	mt_wait
				;bsr.s	mt_wait2
	lea	mt_voice1(pc),a4
	lea	$dff0a0,a5
	bsr	mt_com
	bsr	mt_vol_down
	lea	mt_voice2(pc),a4
	lea	$dff0b0,a5
	bsr	mt_com
	bsr	mt_vol_down
	lea	mt_voice3(pc),a4
	lea	$dff0c0,a5
	bsr	mt_com
	bsr	mt_vol_down
	lea	mt_voice4(pc),a4
	lea	$dff0d0,a5
	bsr	mt_com
	bsr	mt_vol_down
	bra	mt_exit1

mt_mulu:
	dc.w $000,$01e,$03c,$05a,$078,$096,$0b4,$0d2,$0f0,$10e,$12c,$14a
	dc.w $168,$186,$1a4,$1c2,$1e0,$1fe,$21c,$23a,$258,$276,$294,$2b2
	dc.w $2d0,$2ee,$30c,$32a,$348,$366,$384,$3a2

mt_playvoice:
	bsr	mt_decrunch
	moveq	#0,d2
	move.b	2(a4),d2
	lsr.b	#4,d2
	move.b	(a4),d0
	and.b	#$f0,d0
	or.b	d0,d2
	beq.s	mt_oldinstr

	lea	mt_samplestarts-4(pc),a1
	asl.w	#2,d2
	move.l	(a1,d2.l),4(a4)
	lsr.w	#1,d2
	move.w	mt_mulu(pc,d2.w),d2
	move.w	(a3,d2.w),8(a4)
	move.w	2(a3,d2.w),$12(a4)
	move.b	$13(a4),34(a4)			; new volume
	moveq	#0,d3
	move.w	4(a3,d2.w),d3
	tst.w	d3
	beq.s	mt_noloop
	move.l	4(a4),d0
	asl.w	#1,d3
	add.l	d3,d0
	move.l	d0,$a(a4)
	move.w	4(a3,d2.w),d0
	add.w	6(a3,d2.w),d0
	move.w	d0,8(a4)
	bra.s	mt_hejaSverige
mt_noloop:
	move.l	4(a4),d0
	add.l	d3,d0
	move.l	d0,$a(a4)
mt_hejaSverige:
	move.w	6(a3,d2.w),$e(a4)

mt_oldinstr:
	move.w	(a4),d0
	and.w	#$fff,d0
	beq	mt_com2
	tst.w	8(a4)
	beq.s	mt_stopsound
	tst.b	$12(a4)
	bne.s	mt_stopsound
	move.b	2(a4),d0
	and.b	#$f,d0
	cmp.b	#5,d0
	beq.s	mt_setport
	cmp.b	#3,d0
	beq.s	mt_setport

	move.w	(a4),$10(a4)
	and.w	#$fff,$10(a4)
	move.w	$1a(a4),$dff096
	clr.b	$19(a4)

	move.l	4(a4),(a5)
	move.w	8(a4),4(a5)
	move.w	$10(a4),6(a5)

	move.w	$1a(a4),d0	;dmaset
	or.w	d0,mt_dmacon
	bra	mt_com2

mt_stopsound:
	move.w	$1a(a4),$dff096
	bra	mt_com2

mt_setport:
	move.w	(a4),d2
	and.w	#$fff,d2
	move.w	d2,$16(a4)
	move.w	$10(a4),d0
	clr.b	$14(a4)
	cmp.w	d0,d2
	beq.s	mt_clrport
	bge	mt_com2
	move.b	#1,$14(a4)
	bra	mt_com2
mt_clrport:
	clr.w	$16(a4)
	rts

mt_port:move.b	3(a4),d0
	beq.s	mt_port2
	move.b	d0,$15(a4)
	clr.b	3(a4)
mt_port2:
	tst.w	$16(a4)
	beq.s	mt_rts
	moveq	#0,d0
	move.b	$15(a4),d0
	tst.b	$14(a4)
	bne.s	mt_sub
	add.w	d0,$10(a4)
	move.w	$16(a4),d0
	cmp.w	$10(a4),d0
	bgt.s	mt_portok
	move.w	$16(a4),$10(a4)
	clr.w	$16(a4)
mt_portok:
	move.w	$10(a4),6(a5)
mt_rts:	rts

mt_sub:	sub.w	d0,$10(a4)
	move.w	$16(a4),d0
	cmp.w	$10(a4),d0
	blt.s	mt_portok
	move.w	$16(a4),$10(a4)
	clr.w	$16(a4)
	move.w	$10(a4),6(a5)
	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_vib:	move.b	$3(a4),d0
	beq.s	mt_vib2
	move.b	d0,$18(a4)

mt_vib2:move.b	$19(a4),d0
	lsr.w	#2,d0
	and.w	#$1f,d0
	moveq	#0,d2
	move.b	mt_sin(pc,d0.w),d2
	move.b	$18(a4),d0
	and.w	#$f,d0
	mulu	d0,d2
	lsr.w	#7,d2
	move.w	$10(a4),d0
	tst.b	$19(a4)
	bmi.s	mt_vibsub
	add.w	d2,d0
	bra.s	mt_vib3
mt_vibsub:
	sub.w	d2,d0
mt_vib3:move.w	d0,6(a5)
	move.b	$18(a4),d0
	lsr.w	#2,d0
	and.w	#$3c,d0
	add.b	d0,$19(a4)
	rts


mt_arplist:
	dc.b 0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1,2,0,1

mt_arp:	moveq	#0,d0
	move.b	mt_counter(pc),d0
	move.b	mt_arplist(pc,d0.w),d0
	beq.s	mt_arp0
	cmp.b	#2,d0
	beq.s	mt_arp2
	moveq	#0,d0
	move.b	3(a4),d0
	lsr.b	#4,d0
	bra.s	mt_arpdo
mt_arp2:moveq	#0,d0
	move.b	3(a4),d0
	and.b	#$f,d0
mt_arpdo:
	asl.w	#1,d0
	move.w	$10(a4),d1
	and.w	#$fff,d1
	lea	mt_periods(pc),a0
	moveq	#$24,d2
mt_arp3:cmp.w	(a0)+,d1
	bge.s	mt_arpfound
	dbf	d2,mt_arp3
mt_arp0:move.w	$10(a4),6(a5)
	rts
mt_arpfound:
	move.w	-2(a0,d0.w),6(a5)
	rts

mt_normper:
	move.w	$10(a4),6(a5)
	rts

mt_com:	move.w	2(a4),d0
	and.w	#$fff,d0
	beq.s	mt_normper
	move.b	2(a4),d0
	and.b	#$f,d0
	tst.b	d0
	beq.s	mt_arp
	cmp.b	#1,d0
	beq.s	mt_portup
	cmp.b	#2,d0
	beq.s	mt_portdown
	cmp.b	#3,d0
	beq	mt_port
	cmp.b	#4,d0
	beq	mt_vib
	cmp.b	#5,d0
	beq.s	mt_volport
	cmp.b	#6,d0
	beq.s	mt_volvib
	move.w	$10(a4),6(a5)
	cmp.b	#$a,d0
	beq.s	mt_volslide
	rts

mt_portup:
	moveq	#0,d0
	move.b	3(a4),d0
	sub.w	d0,$10(a4)
	move.w	$10(a4),d0
	cmp.w	#$71,d0
	bpl.s	mt_portup2
	move.w	#$71,$10(a4)
mt_portup2:
	move.w	$10(a4),6(a5)
	rts

mt_portdown:
	moveq	#0,d0
	move.b	3(a4),d0
	add.w	d0,$10(a4)
	move.w	$10(a4),d0
	cmp.w	#$358,d0
	bmi.s	mt_portdown2
	move.w	#$358,$10(a4)
mt_portdown2:
	move.w	$10(a4),6(a5)
	rts

mt_volvib:
	 bsr	mt_vib2
	 bra.s	mt_volslide
mt_volport:
	 bsr	mt_port2

mt_volslide:
	moveq	#0,d0
	move.b	3(a4),d0
	lsr.b	#4,d0
	beq.s	mt_vol3
	add.b	d0,$13(a4)
	cmp.b	#$40,$13(a4)
	bmi.s	mt_vol2
	move.b	#$40,$13(a4)
mt_vol2:moveq	#0,d0
	move.b	$13(a4),d0
	move.w	d0,8(a5)
	rts

mt_vol3:move.b	3(a4),d0
	and.b	#$f,d0
	sub.b	d0,$13(a4)
	bpl.s	mt_vol4
	clr.b	$13(a4)
mt_vol4:moveq	#0,d0
	move.b	$13(a4),d0
	move.w	d0,8(a5)
	rts

mt_com2:move.b	$2(a4),d0
	and.b	#$f,d0
	cmp.b	#$e,d0
	beq.s	mt_filter
	cmp.b	#$d,d0
	beq.s	mt_pattbreak
	cmp.b	#$b,d0
	beq.s	mt_songjmp
	cmp.b	#$c,d0
	beq.s	mt_setvol
	cmp.b	#$f,d0
	beq.s	mt_setspeed
	rts

mt_filter:
	move.b	3(a4),d0
	and.b	#1,d0
	asl.b	#1,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts

mt_pattbreak:
	move.b	#1,mt_break
	rts

mt_songjmp:
	move.b	#1,mt_break
	move.b	3(a4),d0
	subq.b	#1,d0
	move.b	d0,mt_songpos
	rts

mt_setvol:
	cmp.b	#$40,3(a4)
	bls.s	mt_sv2
	move.b	#$40,3(a4)
mt_sv2:	moveq	#0,d0
	move.b	3(a4),d0
	move.b	d0,$13(a4)
	move.w	d0,8(a5)
	rts

mt_setspeed:
	moveq	#0,d0
	move.b	3(a4),d0
	cmp.b	#$1f,d0
	bls.s	mt_sp2
	moveq	#$1f,d0
mt_sp2:	tst.w	d0
	bne.s	mt_sp3
	moveq	#1,d0
mt_sp3:	move.b	d0,mt_speed
	rts


mt_decrunch:
	move	28(a4),d0
	beq.s	mt_no_rept
	sub	#1,28(a4)
	move.l	#0,(a4)
	rts
mt_no_rept:
	move.l	30(a4),a0
	move.b	(a0),d0
	bge.s	mt_ctrl
	btst	#6,d0
	beq.s	mt_note
	add.l	#1,30(a4)
	andi	#%111111,d0
	move	d0,28(a4)
	move.l	#0,(a4)
	rts
mt_note:
	move	d0,d1
	andi	#$10,d0
	or.b	1(a0),d0
	lsl.l	#8,d0
	move.b	2(a0),d0
	lsl.l	#8,d0
	andi	#$f,d1
	lsl	#4,d1
	move.b	d1,d0
	lsl.l	#8,d0
	move.b	#0,d0
	add.l	#3,30(a4)
	move.l	d0,(a4)
	rts
mt_ctrl:
	btst	#6,d0
	beq.s	mt_normal
	andi	#$3f,d0
	lsl	#8,d0
	move.b	1(a0),d0
	add.l	#2,30(a4)
	ext.l	d0
	move.l	d0,(a4)
	rts
mt_normal:
	lsl.l	#8,d0
	move.b	1(a0),d0
	lsl.l	#8,d0
	move.b	2(a0),d0
	lsl.l	#8,d0
	move.b	3(a0),d0
	move.l	d0,(a4)
	add.l	#4,30(a4)
	rts

mt_vol_down:
	sub.b	#mt_down,34(a4)
	bgt.s	mt_noeq
	move.b	#0,34(a4)
mt_noeq:
	rts

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

mt_speed:	dc.b	6
mt_counter:	dc.b	0
mt_pattpos:	dc.w	0
mt_songpos:	dc.b	0
mt_break:	dc.b	0
mt_dmacon:	dc.w	0
mt_samplestarts:ds.l	$1f
mt_voice1:	dc.w	0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.w	1
		dc.l	0,0,0
mt_voice2:	dc.w	0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.w	2
		dc.l	0,0,0
mt_voice3:	dc.w	0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.w	4
		dc.l	0,0,0
mt_voice4:	dc.w	0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.w	8
		dc.l	0,0,0

