
CRUNCHMARG=$180
SONGPLACE=$50000	;HAVE TO HAVE LEDIGT SONGPLACE-CRUNCHMARG
DEVICE=1

BRA.L	S

TRACKDISK:	DC.B  'trackdisk.device',$00,$00
TRACKSHIT:	BLK.B $50,0
TRACKTAL:	DC.L  0,0,0,0
TRACKTAL2:	DC.L  0,TRACKTAL2+$C,0,TRACKTAL2+$4

TRACKINIT:MOVE.L$04.W,A6
	SUBA.L	A1,A1
	JSR	-294(A6)	;FINDTASK
	MOVE.L	D0,TRACKTAL2
	LEA	TRACKTAL(PC),A1
	MOVE.L	$04.W,A6
	JSR	-354(A6)	;ADDPORT
		MOVEQ	#DEVICE,D0
		MOVEQ	#$0,D1
		LEA	TRACKDISK(PC),A0
		LEA	TRACKSHIT(PC),A1
		JSR	-444(A6)	;OPENDEVICE
	LEA	TRACKSHIT(PC),A1
	MOVE.L	#TRACKTAL,14(A1)
	RTS

TRACKEND:
	LEA	TRACKTAL(PC),A1
	MOVE.L	$04.W,A6
	JSR	-360(A6)
	LEA	TRACKSHIT(PC),A1
	MOVE.L	$04.W,A6
	JSR	-450(A6)
	RTS


S:	BSR.S	TRACKINIT

	LEA	TRACKSHIT(PC),A1
	MOVE.W	#$2,28(A1)
	MOVE.L	#SONGPLACE-CRUNCHMARG,40(A1)	;DEST
	MOVE.L	#$99800,44(A1)	;DISKPOS
	MOVE.L	#$C00,36(A1)	;LENGTH
	MOVE.L	$04.W,A6
	JSR	-456(A6)
		MOVE.W	#$9,28(A1)
		CLR.L	36(A1)
		MOVE.L	$04.W,A6
		JSR	-456(A6)
	MOVE.L	#SONGPLACE-CRUNCHMARG,FILESTART
	MOVE.L	#SONGPLACE,DECRUNCHAREA
	BSR.L	DECRUNCH

	CLR.L	CRUNCHLIST	;TOM CRUNCH
	CLR.L	CRUNCHLIST+4
	CLR.L	CRUNCHLIST+8
	CLR.L	CRUNCHLIST+$C

	MOVE.L	#SONGPLACE+$1000,SONG			;SONGSTART
	BSR.L	INIT

	MOVE.L	SONG(PC),A0
	ADD.L	#20,A0		;A0=SAMPLE1 NAME
	LEA	MT_SAMPLE1(PC),A1	;A1=SAMPLESTARTS
	LEA	CRUNCHLIST(PC),A2
	MOVEQ	#$E,D7

LOADLOP:MOVE.B	(A0),TRFILE
	MOVE.B	#$0,(A2)
	MOVE.L	(A1)+,D2
	CMP.B	#$0,(A0)
	BEQ.S	NOSAM
	CMP.B	#$46,(A0)
	BCC.S	NOSAM
	CMP.B	#$FF,(A0)
	BEQ.S	NOSAM
	MOVE.B	(A0),D0
	BRA.L	CHECKNOCRUNCH
LOADCON:SUB.L	#CRUNCHMARG,D2
	MOVE.L	D2,TRDEST
		MOVEM.L	A0-A6/D0-D7,-(A7)
		BSR.L	TRLOAD
		MOVEM.L	(A7)+,A0-A6/D0-D7
		MOVE.B	#$1,(A2)	;CRLIST
NOSAM:	ADD.L	#$1E,A0
	ADD.L	#$1,A2
	DBF	D7,LOADLOP

	MOVEM.L	A0-A6/D0-D7,-(A7)
		LEA	TRACKSHIT(PC),A1
		MOVE.W	#$9,28(A1)
		CLR.L	36(A1)
		MOVE.L	$04.W,A6
		JSR	-456(A6)
	MOVEM.L	(A7)+,A0-A6/D0-D7


	LEA	CRUNCHLIST(PC),A2
	LEA	MT_SAMPLE1(PC),A0
	MOVEQ	#$E,D7

LOADLUP:TST.B	(A2)+
	BEQ.S	NOCRUNCH
	MOVE.L	(A0),D2
	MOVE.L	D2,DECRUNCHAREA
	SUB.L	#CRUNCHMARG,D2
	MOVE.L	D2,FILESTART
		MOVEM.L	A0-A6/D0-D7,-(A7)
		BSR.L	DECRUNCH
		MOVEM.L	(A7)+,A0-A6/D0-D7
NOCRUNCH:
	ADD.L	#$4,A0
	DBF	D7,LOADLUP


	BSR.L	INIT
EVER:	CMP.B	#$E0,$DFF006
	BNE.S	EVER
EVER2:	CMP.B	#$F0,$DFF006
	BNE.S	EVER2
	BSR.L	PLAY
	BTST	#$6,$BFE001
	BNE.S	EVER
	MOVE.W	#$000F,$DFF096
	BSR.L	TRACKEND
	RTS

CHECKNOCRUNCH:
	CMP.B	#$01,d0
	BEQ.S	NOTCR
	CMP.B	#$13,d0
	BEQ.S	NOTCR
	CMP.B	#$1B,d0
	BEQ.S	NOTCR
	CMP.B	#$25,d0
	BEQ.S	NOTCR
	CMP.B	#$28,d0
	BEQ.S	NOTCR
	CMP.B	#$32,d0
	BEQ.S	NOTCR
	CMP.B	#$36,d0
	BEQ.S	NOTCR
	CMP.B	#$41,d0
	BEQ.S	NOTCR
h_0:	CMP.B	#$45,d0
	BNE.L	Loadcon

notcr:	MOVE.L	D2,TRDEST
		MOVEM.L	A0-A6/D0-D7,-(A7)
		BSR.S	TRLOAD
		MOVEM.L	(A7)+,A0-A6/D0-D7
	CLR.B	(A2)		;CRLIST
	BRA.L	NOSAM

CRUNCHLIST:
BLK.B	$10,0

;팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎팎

TRDEST:	DC.L	$50000
TRFILE:	DC.B	$00,$00

TRLOAD:	MOVEQ	#$0,D0
	MOVE.B	TRFILE(PC),D0
	SUB.B	#$1,D0
	ASL.W	#$2,D0
	ADD.L	#TRLIST,D0
	MOVE.L	D0,A0
	MOVE.L	(A0),D1		;DISKSTART
	MOVE.L	4(A0),D2
	SUB.L	(A0),D2		;LENGTH

	LEA	TRACKSHIT(PC),A1
	MOVE.W	#$2,28(A1)
	MOVE.L	TRDEST(PC),40(A1)	;DEST
	MOVE.L	D1,44(A1)	;DISKPOS
	MOVE.L	D2,36(A1)	;LENGTH
	MOVE.L	$04.W,A6
	JSR	-456(A6)
	RTS

TRLIST:
DC.L $2C00,$5400,$7400,$AA00,$AE00,$B400,$C600,$D000,$D400,$E400,$F600
DC.L $11A00,$13200,$14800,$17000,$1A600,$1B800,$1CE00,$1E000,$24600
DC.L $27C00,$2AC00,$2DA00,$30400,$31800,$33C00,$37C00,$3CE00,$41600
DC.L $44800,$47C00,$4A600,$4BE00,$4D800,$4EE00,$52A00,$55200,$57A00
DC.L $59000,$59C00,$61A00,$65200,$67800,$67C00,$68400,$6C200,$6D600
DC.L $6DC00,$6FA00,$71E00,$76000,$78800,$7A400,$7A800,$7B800,$7D200
DC.L $7E000,$7EA00,$7FC00,$80C00,$81800,$82A00,$85200,$89200,$8C200
DC.L $90E00,$93200,$94A00,$97000,$99800

;************************************************

FILESTART:	DC.L	$50000
DECRUNCHAREA:	DC.L	$51000

GETNEXTLWD:	MOVE.L	-(A0),D0
		EOR.L	D0,D5
		MOVE.W	#$10,CCR
		ROXR.L	D6,D0	;1
		RTS

DECRUNCH:	MOVEQ	#$1,D6
		MOVEQ	#$2,D7
		MOVE.L	FILESTART(PC),A0
		MOVE.L	DECRUNCHAREA(PC),A1

		MOVE.L	(A0)+,D0	;GET CRUNCHED SIZE
		MOVE.L	(A0)+,D1	;NORMAL SIZE
		MOVE.L	(A0)+,D5	;CHECKSUM
		MOVE.L	A1,A2
		ADD.L	D0,A0		;A0=CRUNCHEDFILE-END
		ADD.L	D1,A2		;A2=UTCRUNCHAD FIL-END
		MOVE.L	-(A0),D0
		EOR.L	D0,D5		;CHECKSUM

NOTFINISHED:	LSR.L	D6,D0		;1
		BNE.S	NOTEMPTY1
		BSR.S	GETNEXTLWD
NOTEMPTY1:	BCS.S	BIGONE
		MOVEQ	#8,D1
		MOVE.L	D6,D3	;1
		LSR.L	#1,D0
		BNE.S	NOTEMPTY2
		BSR.S	GETNEXTLWD
NOTEMPTY2:	BCS.S	DODUPL
		MOVEQ	#3,D1
		CLR.W	D4

DOJMP:		BSR.S	RDD1BITS
		MOVE.W	D2,D3
		ADD.W	D4,D3

GETD3CHR:	MOVEQ	#7,D1
GET8BITS:	LSR.L	D6,D0	;1
		BNE.S	NOTEMPTY3
		BSR.S	GETNEXTLWD
NOTEMPTY3:	ROXL.L	D6,D2	;1
		DBF	D1,GET8BITS
		MOVE.B	D2,-(A2)
		DBF	D3,GETD3CHR
		BRA.S	NEXTCMD

BIGJMP:		MOVEQ	#8,D1
		MOVE.L	D1,D4	;8
		BRA.S	DOJMP

BIGONE:		MOVE.L	D7,D1	;2
		BSR.S	RDD1BITS
		CMP.B	D7,D2	;2
		BLT.S	MIDJUMPS
		CMP.B	#3,D2
		BEQ.S	BIGJMP

		MOVEQ	#8,D1
		BSR.S	RDD1BITS
		MOVE.W	D2,D3
		MOVE.W	#12,D1
		BRA.S	DODUPL

MIDJUMPS:	MOVE.W	#9,D1
		ADD.W	D2,D1
		ADDQ	#2,D2
		MOVE.W	D2,D3

DODUPL:		BSR.S	RDD1BITS

COPYD3BYTES:	SUBQ	#$1,A2
		MOVE.B	(A2,D2.W),(A2)
		DBF	D3,COPYD3BYTES

NEXTCMD:				MOVE.L	A2,$DFF180
		CMP.L	A2,A1
		BLT.L	NOTFINISHED
		TST.L	D5
		BNE.S	DAMAGE
		RTS

DAMAGE:		MOVE.L	#$2FFF,D0
DAMLOOP:	MOVE.W	D0,$DFF180		;RASTER FLICKER
		SUBI.L	#$1,D0			;WHEN ERROR
		BNE.S	DAMLOOP
		RTS

RDD1BITS:	SUB.W	D6,D1	;1
		CLR.W	D2

GETBITS:	LSR.L	D6,D0	;1
		BNE.S	NOTEMPTY
		MOVE.L	-(A0),D0
		EOR.L	D0,D5
		MOVE.W	#$10,CCR
		ROXR.L	D6,D0	;1

NOTEMPTY:	ROXL.L	D6,D2	;1
		DBF	D1,GETBITS
		RTS

;*MUSIC******************************************

SONG:	DC.L	$40000

INIT:	MOVE.L	SONG(PC),a0
	add.l	#$01d8,a0	;A0=SONGDATA
	move.l	#$0080,d0
	moveq	#$0,d1
mt_init1:			;GET HIGHEST PATTERN
	move.l	d1,d2
	subq.w	#1,d0
mt_init2:
	move.b	(a0)+,d1
	cmp.b	d2,d1
	bgt.s	mt_init1
	dbf	d0,mt_init2
	addq.b	#1,d2		;D2=HIGHEST USED PATT

mt_init3:
	MOVE.L	SONG(PC),a0
	lea	mt_sample1(pc),a1
	asl.l	#$08,d2			;MULU PATTNR*$400
	asl.l	#$02,d2
	add.l	#$0258,d2		;ADD 600
	add.l	a0,d2			;ADD STARTOFSONG
	moveq	#$0e,d0		;D2=SONGEND

	ADD.L	#CRUNCHMARG,D2	;CRUNCHMARGINAL

mt_init4:
	move.l	d2,(a1)+
	moveq	#$00,d1
	move.w	42(a0),d1	;SAMPLELENGTH SAM1 (WORDS)
	asl.l	#1,d1		;MULU #2
	add.l	d1,d2		;ADD LENGTH TO D2
	ADD.L	#CRUNCHMARG,D2
	add.l	#$1e,a0		;NEXT SAMPLE
	dbf	d0,mt_init4

	lea	mt_sample1(pc),a0	;M-T FIRST LWD IN SAMPLE
	moveq	#$00,d0
mt_clear:
	move.l	(a0,d0),a1
	clr.l	(a1)
	addq.l	#4,d0
	cmp.l	#$3c,d0
	bne.s	mt_clear

	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.l	mt_partnrplay
	clr.l	mt_partnote
	clr.l	mt_partpoint

	MOVE.L	SONG(PC),A0
	move.b	$1d6(A0),mt_maxpart+1		;SONGLENGTH
	MOVE.B	#$6,MT_COOL+5			;SPEED = $6
	rts

PLAY:
	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(pc),a6
	tst.b	3(a6)
	beq.s	mt_arp1
	lea	$dff0a0,a5		
	bsr.s	mt_arprout
mt_arp1:lea	mt_aud2temp(pc),a6
	tst.b	3(a6)
	beq.s	mt_arp2
	lea	$dff0b0,a5
	bsr.s	mt_arprout
mt_arp2:lea	mt_aud3temp(pc),a6
	tst.b	3(a6)
	beq.s	mt_arp3
	lea	$dff0c0,a5
	bsr.s	mt_arprout
mt_arp3:lea	mt_aud4temp(pc),a6
	tst.b	3(a6)
	beq.s	mt_arp4
	lea	$dff0d0,a5
	bra.s	mt_arprout
mt_arp4:rts

mt_arprout:
	move.b	2(a6),d0
	and.b	#$0f,d0
	tst.b	d0
	beq.s	mt_arpegrt
	cmp.b	#1,d0
	beq.s	mt_portup
	cmp.b	#2,d0
	beq.s	mt_portdwn
	rts

mt_portup:
	moveq	#$00,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:
	moveq	#$00,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_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:
	moveq	#$00,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_cont
mt_loop3:
	moveq	#$00,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:
	asl.w	#1,d0
	moveq	#$00,d1
	move.w	16(a6),d1
	lea	mt_arpeggio(pc),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:
	MOVE.L	SONG,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
	moveq	#$00,d1
	move.b	(a2,d0),d1
	asl.l	#$08,d1
	asl.l	#$02,d1
	add.l	mt_partnote,d1
	move.l	d1,mt_partpoint
	clr.w	mt_dmacon

	lea	$dff0a0,a5
	lea	mt_aud1temp(pc),a6
	bsr	mt_playit
	lea	$dff0b0,a5
	lea	mt_aud2temp(pc),a6
	bsr	mt_playit
	lea	$dff0c0,a5
	lea	mt_aud3temp(pc),a6
	bsr	mt_playit
	lea	$dff0d0,a5
	lea	mt_aud4temp(pc),a6
	bsr	mt_playit
	move.w	#$01f4,d0
mt_rls:	dbf	d0,mt_rls

	move.w	#$8000,d0
	or.w	mt_dmacon,d0
	move.w	d0,$dff096

	lea	mt_aud4temp(pc),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice3
	move.l	10(a6),$dff0d0
	move.w	#1,$dff0d4
mt_voice3:
	lea	mt_aud3temp(pc),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice2
	move.l	10(a6),$dff0c0
	move.w	#1,$dff0c4
mt_voice2:
	lea	mt_aud2temp(pc),a6
	cmp.w	#1,14(a6)
	bne.s	mt_voice1
	move.l	10(a6),$dff0b0
	move.w	#1,$dff0b4
mt_voice1:
	lea	mt_aud1temp(pc),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
mt_higher:
	clr.l	mt_partnote
	addq.l	#1,mt_partnrplay
	moveq	#$00,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:tst.w	mt_status
	beq.s	mt_stop2
	clr.w	mt_status
	bra.s	mt_higher
mt_stop2:
	rts

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

	moveq	#$00,d3
	lea	mt_samples(pc),a1
	move.l	d2,d4
	asl.l	#2,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:
	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	#11,d0
	beq.s	mt_posjmp
	cmp.b	#12,d0
	beq.s	mt_setvol
	cmp.b	#13,d0
	beq.s	mt_break
	cmp.b	#14,d0
	beq.s	mt_setfil
	cmp.b	#15,d0
	beq.s	mt_setspeed
	rts

mt_posjmp:
	not.w	mt_status
	moveq	#$00,d0
	move.b	3(a6),d0
	subq.b	#$01,d0
	move.l	d0,mt_partnrplay
	rts

mt_setvol:
	move.b	3(a6),8(a5)
	rts

mt_break:
	not.w	mt_status
	rts

mt_setfil:
	moveq	#$0,d0
	move.b	3(a6),d0
	and.b	#$01,d0
	rol.b	#$01,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts

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

mt_aud1temp:
	blk.w	10,0
	dc.w	$0001
	blk.w	2,0
mt_aud2temp:
	blk.w	10,0
	dc.w	$0002
	blk.w	2,0
mt_aud4temp:
	blk.w	10,0
	dc.w	$0008
	blk.w	2,0
mt_aud3temp:
	blk.w	10,0
	dc.w	$0004
	blk.w	2,0
mt_partnrplay:	dc.l	0
mt_partnote:	dc.l	0
mt_counter:	dc.l	0
mt_partpoint:	dc.l	0
mt_samples:dc.l	0
mt_sample1:blk.l 15,0
mt_maxpart:dc.w	$0000
mt_status: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

