execbase 	=4
openlib		=-408
closelib	=-414
openscreen 	=-198
closescreen	=-66
openwindow	=-204
closewindow	=-72
waitport	=-384
getmsg		=-372
findtask	=-294
openfile	=-30
closefile	=-36
AddIntServer	=-168
RemIntServer	=-174

	section	Majic12_scroll,code_c
	bsr	opendos			

	move.w	#$01a0,$dff096
	move.w	#$4000,$dff09a	

InitRand:
	moveq	#0,d0
	move.w	$dff006,d0
	move.l	d0,seed

	lea	line,a0
	move.w	#217,d7	
makelines:
	move.w	#218,d0
	bsr	rangerand
	lsl	#1,d0
	cmp.w	#0,(a0,d0.w)	
	bne	makelines
	move.w	d7,(a0,d0.w)
	dbra	d7,makelines
	
	
	lea	$dff000,a5
	bsr	bpl
	bsr	bpl2
	bsr	bpl3
	clr.w	$144(a5)
	bsr	startcopper
	bsr	mt_init
	
wait:	move.l	$4(a5),d0
	asr.l	#8,d0
	and.l	#$1ff,d0
	cmp.w	#50,d0
	bne     wait

	bsr	changetxt
	bsr	scroll
	bsr	clearend
	bsr	mt_music

	btst	#6,$bfe001
	bne	wait

wait2:	move.l	$4(a5),d0
	asr.l	#8,d0
	and.l	#$1ff,d0
	cmp.w	#50,d0
	bne     wait2
	
	lea	loadtxt,a3
	bsr	scroll
	bsr	clearend
	bsr	mt_music
	
	lea	bb,a0
	add.w	#1,(a0)
	cmp.w	#250,(a0)
	bne	wait2	
	move.w	#0,(a0)

	move.w	#$c000,$dff09a
	bsr	setvbint
	bsr	load_file
	bsr	resetvbint
	move.w	#$4000,$dff09a	

	lea	txtnr,a0
	add.w	#1,(a0)
	add.w	#1,2(a0)

wait3:	move.l	$4(a5),d0
	asr.l	#8,d0
	and.l	#$1ff,d0
	cmp.w	#50,d0
	bne     wait3

	bsr	mt_music
	bsr	wipe

	lea	wipefinnish,a0
	add.w	#1,(a0)
	cmp.w	#50,(a0)
	bne	wait3
	

	move.l	#0,(a0)
	lea	lineoff,a3
	move.w	#0,(a3)	
	
	

	btst	#6,$bfe001
	bne	wait

	bsr	mt_end
	move.l	$04,a6
	move.l	156(a6),a1
	move.l	38(a1),$dff080
	move.w	#$80a0,$dff096
	move.w	#$c000,$dff09a
	rts

bb:	dc.w	0
***********************************
setvbint:
	moveq	#5,d0
	lea	vbintserver,a1
	move.l	4.w,a6
	jsr	AddIntServer(a6)
	rts

resetvbint:
	moveq	#5,d0
	lea	vbintserver,a1
	move.l	4.w,a6
	jsr	RemIntServer(a6)
	rts

vbint:	movem.l	d0-d7/a0-a6,-(sp)
	bsr	mt_music
	movem.l	(sp)+,d0-d7/a0-a6
	rts

vbintserver:
	dc.l 0,0
	dc.b 2,127 ; type, priority
	dc.l vbintname
	dc.l 0,vbint

vbintname:
	dc.b "Coding by Heavy Mental / Majic 12",0
	even

*******************************
bpl:	lea.l	screen(pc),a1
	lea.l	bplcop(pc),a2
	move.l	a1,d1
	addq.l  #2,a2
	moveq   #4,d0
bplloop:
	swap    d1
	move.w  d1,(a2)
	addq.l	#4,a2
	swap	d1
	move.w	d1,(a2)
	addq.l  #4,a2
	add.l	#1232,d1
	dbra    d0,bplloop
	rts

bpl2:	lea.l	logo,a1
	lea.l	bplcop2,a2
	move.l	a1,d1
	addq.l  #2,a2
	moveq   #4,d0
bplloop2:
	swap    d1
	move.w  d1,(a2)
	addq.l	#4,a2
	swap	d1
	move.w	d1,(a2)
	addq.l  #4,a2
	add.l	#1440,d1
	dbra    d0,bplloop2
	rts

bpl3:	lea.l	picture1,a1
	lea.l	bplcop3,a2
	move.l	a1,d1
	addq.l  #2,a2
	moveq   #3,d0
bplloop3:
	swap    d1
	move.w  d1,(a2)
	addq.l	#4,a2
	swap	d1
	move.w	d1,(a2)
	addq.l  #4,a2
	add.l	#8680,d1
	dbra    d0,bplloop3
	rts

rangerand:
	move.l	d2,-(sp)
	move.l	d0,d1
	move.l	d0,d2
	subq.l	#1,d1
	move.l	seed,d0
lb1:	add.l	d0,d0
	bhi.s	lb2
	eori.l	#$1d872b41,d0
lb2:	lsr.w	#1,d1
	bne.s	lb1
	move.l	d0,seed
	mulu	d2,d0
	clr.w	d0
	swap	d0
	move.l	(sp)+,d2
	rts

	
startcopper:	
	lea.l	copper,a1
	move.l	a1,$80(a5)
	move.w	#$8180,$96(a5)
	rts

scroll:	lea	scrollcnt,a0
	lea	prop,a1
	move.w	(a1),d0
	move.w	(a0),d1
	lsr.w	#1,d0
	cmp.w	d0,d1
	blo	no_new_char
	clr.w	(a0)
	bsr	putchar	
no_new_char:
	add.w	#1,(a0)
	bsr	scroll_left
	rts

scroll_left:
	lea	screen+1232*5,a0
.blitwait:
	btst	#14,$2(a5)
	bne	.blitwait
	move.w	#0,$64(a5)	;A-modulo
	move.w	#0,$66(a5)	;D-modulo
	move.w	#$29f0,$40(a5)
	move.w	#2,$42(a5)
	move.l	#-1,$44(a5)	;A-mask
	move.l	a0,$50(a5)	;source
	move.l	a0,$54(a5)	;destination
	move.w	#[28*64*5+22],$58(a5)
	rts


putchar:lea	screen+84,a0
	lea	font,a1
	lea	convtab,a2
	;lea	loadtxt,a3
	lea	prop,a4
	moveq	#0,d1
	move.w	(a3),d0
	move.b	2(a3,d0),d1
	cmp.b	#"*",d1
	bne	.notend
	clr.w	(a3)
	move.w	(a3),d0
	move.b	2(a3,d0),d1
.notend:add.w	#1,(a3)
	add.w	d1,d1
	add.w	d1,d1
	add.w	(a2,d1.w),a1
	move.w	2(a2,d1.w),(a4)
	move.w	#4,d7
.blitwait:
	btst	#14,$2(a5)
	bne	.blitwait
	move.w	#156,$64(a5)	;A-modulo
	move.w	#40,$66(a5)	;D-modulo
	move.w	#$09f0,$40(a5)
	move.w	#0,$42(a5)
	move.l	#-1,$44(a5)	;A-mask
blit:	move.l	a1,$50(a5)	;source
	move.l	a0,$54(a5)	;destination
	move.w	#$06c2,$58(a5)
	add.l	#1232,a0
	add.l	#4320,a1
.blitwait:
	btst	#14,$2(a5)
	bne	.blitwait
	dbra	d7,blit	
	rts

clearend:
	btst	#14,2(a5)
	bne	clearend
	lea	screen,a0
	move.w	#139,d7
.loop:	and.b	#%11000000,(a0)
	lea	44(a0),a0
	dbra	d7,.loop
	rts



*********************************
*      Open/Close libraries     *
*      Allocate/Free memory     *
*********************************
opendos:
	move.l	execbase,a6		;
	lea	dos_name(pc),a1		;
	jsr	openlib(a6)		;open dos.library
	lea	dos_base(pc),a0		;
	move.l	d0,(a0)			;
	rts				;

closedos:
	move.l	execbase,a6		;
	move.l	dos_base(pc),a1		;close dos.library
	jsr	closelib(a6)		;
	rts


Load_File:
	lea	txtnr,a0
	cmp.w	#0,2(a0)	
	bne	notf1
	lea	filename1(pc),a0		
	bra	load
notf1:
	cmp.w	#1,2(a0)	
	bne	notf2
	lea	filename2(pc),a0		
	bra	load
notf2:
	cmp.w	#2,2(a0)	
	bne	notf3
	lea	filename3(pc),a0		
	bra	load
notf3
	cmp.w	#3,2(a0)	
	bne	notf4
	lea	filename4(pc),a0		
	bra	load
notf4
	cmp.w	#4,2(a0)	
	bne	notf5
	lea	filename5(pc),a0		
	bra	load
notf5
	cmp.w	#5,2(a0)	
	bne	notf6
	lea	filename6(pc),a0		
	bra	load
notf6
	cmp.w	#6,2(a0)	
	bne	notf7
	lea	filename7(pc),a0		
	bra	load
notf7
	cmp.w	#7,2(a0)	
	bne	notf8
	lea	filename8(pc),a0		
	bra	load
notf8
	cmp.w	#8,2(a0)	
	bne	notf9
	lea	filename9(pc),a0		
	bra	load
notf9
	cmp.w	#9,2(a0)	
	bne	notf10
	lea	filename10(pc),a0		
	bra	load
notf10

	lea	filename2(pc),a0		

load:
	move.l	dos_base(pc),a6		;
	move.l	a0,d1			;
	move.l	#1005,d2		;open file
	jsr	-30(a6)			;
	move.l	d0,filehandle

	move.l	d0,d1	  	
	lea.l	picture2,a1
	move.l	a1,d2
	move.l	#34720,d3	
	jsr	-42(a6)			;
	move.l	filehandle(pc),d1	;
	jsr	-36(a6)			;close file
	rts				;

nofile:	rts
nomem:	rts
notopen:rts


changetxt:
	lea	txtnr,a0
	cmp.w	#0,(a0)
	bne	notone
	lea	text1,a3
	rts
notone:
	cmp.w	#1,(a0)
	bne	nottwo
	lea	text2,a3
	rts
nottwo:
	cmp.w	#2,(a0)
	bne	notthree
	lea	text3,a3
	rts
notthree:
	cmp.w	#3,(a0)
	bne	notfour
	lea	text4,a3
	rts
notfour:
	cmp.w	#4,(a0)
	bne	notfive
	lea	text5,a3
	rts
notfive:
	cmp.w	#5,(a0)
	bne	notsix
	lea	text6,a3
	rts
notsix:
	cmp.w	#6,(a0)
	bne	notseven
	lea	text7,a3
	rts
notseven:
	cmp.w	#7,(a0)
	bne	noteight
	lea	text8,a3
	rts
noteight:
	cmp.w	#8,(a0)
	bne	notnine
	lea	text9,a3
	rts
notnine:
	cmp.w	#9,(a0)
	bne	notten
	lea	text10,a3
	rts
notten:
	cmp.w	#10,(a0)
	bne	notelleven
	lea	text11,a3
	rts
notelleven:


txtnr:	dc.l	0


wipe:	;move.w	#217,d6

wipeloop:
	lea	picture1,a0
	lea	picture2,a1
	lea	line,a2
	lea	lineoff,a3

	move.w	(a3),d0
	add.w	#2,(a3)

	move.w	(a2,d0.w),d0
	mulu	#40,d0
	add.w	d0,a0
	add.w	d0,a1

	move.w	#3,d7
blit3:	btst	#14,$2(a5)
	bne	blit3
	move.w	#0,$64(a5)	;A-modulo
	move.w	#0,$66(a5)	;D-modulo
	move.w	#$09f0,$40(a5)
	move.w	#0,$42(a5)
	move.l	#-1,$44(a5)	;A-mask
blit2:	btst	#14,$2(a5)
	bne	blit2
	move.l	a1,$50(a5)	;source
	move.l	a0,$54(a5)	;destination
	move.w	#$0054,$58(a5)
	lea	8680(a0),a0
	lea	8680(a1),a1
	dbra	d7,blit2

	;dbra	d6,wipeloop
	rts

wipefinnish:	dc.l	0

delay:	move.l	$4(a5),d2
	asr.l	#8,d2
	and.l	#$1ff,d2
	cmp.w	#50,d2
	bne     delay
dd:	move.l	$4(a5),d2
	asr.l	#8,d2
	and.l	#$1ff,d2
	cmp.w	#51,d2
	bne     dd
	dbra	d0,delay
	rts






copper:
	dc.w	$0100,$5200
	dc.w	$0102,$0000
	dc.w	$0104,$0000
	dc.w	$008e,$2c81
	dc.w	$0090,$f4c1
	dc.w	$0090,$38c1
	dc.w	$0108,$0000
	dc.w	$010a,$0000
	dc.w	$0092,$0038
	dc.w	$0094,$00d0

	dc.w	$0180,$0000
	dc.w	$0182,$0FFF
	dc.w	$0184,$0F66
	dc.w	$0186,$0FCC
	dc.w	$0188,$0FAA
	dc.w	$018A,$0F88
	dc.w	$018C,$0F44
	dc.w	$018E,$0D00
	dc.w	$0190,$0FFF
	dc.w	$0192,$0ECC
	dc.w	$0194,$0C99
	dc.w	$0196,$0B77
	dc.w	$0198,$0955
	dc.w	$019A,$0833
	dc.w	$019C,$0226
	dc.w	$019E,$0511
	dc.w	$01A0,$0800
	dc.w	$01A2,$0B00
	dc.w	$01A4,$0AAD
	dc.w	$01A6,$077F
	dc.w	$01A8,$055F
	dc.w	$01AA,$022F
	dc.w	$01AC,$0000
	dc.w	$01AE,$0448
	dc.w	$01B0,$0FFF
	dc.w	$01B2,$0DDF
	dc.w	$01B4,$0BBE
	dc.w	$01B6,$099C
	dc.w	$01B8,$088B
	dc.w	$01BA,$077A
	dc.w	$01BC,$066A
	dc.w	$01BE,$0559

bplcop2:
	dc.w	$00e0,$0000
	dc.w	$00e2,$0000
	dc.w	$00e4,$0000
	dc.w	$00e6,$0000
	dc.w	$00e8,$0000
	dc.w	$00ea,$0000
	dc.w	$00ec,$0000
	dc.w	$00ee,$0000
	dc.w	$00f0,$0000
	dc.w	$00f2,$0000

	dc.w	$4e0f,$fffe
	dc.w	$0100,$0200


	dc.w	$500f,$fffe
	dc.w	$0180,$000f
	dc.w	$510f,$fffe
	dc.w	$0180,$0000
	dc.w	$0100,$4200

bplcop3:
	dc.w	$00e0,$0000
	dc.w	$00e2,$0000
	dc.w	$00e4,$0000
	dc.w	$00e6,$0000
	dc.w	$00e8,$0000
	dc.w	$00ea,$0000
	dc.w	$00ec,$0000
	dc.w	$00ee,$0000

	dc.w	$0180,$0000
	dc.w	$0182,$0111
	dc.w	$0184,$0222
	dc.w	$0186,$0333
	dc.w	$0188,$0444
	dc.w	$018A,$0555
	dc.w	$018C,$0666
	dc.w	$018E,$0777
	dc.w	$0190,$0888
	dc.w	$0192,$0999
	dc.w	$0194,$0AAA
	dc.w	$0196,$0BBB
	dc.w	$0198,$0CCC
	dc.w	$019A,$0DDD
	dc.w	$019C,$0EEE
	dc.w	$019E,$0FFF

	dc.w	$ffdf,$fffe

	dc.w	$0d0f,$fffe
	dc.w	$0100,$0200
	dc.w	$0108,0004
	dc.w	$010a,0004
	dc.w	$0180,$000f
	dc.w	$0e0f,$fffe
	dc.w	$0180,$0000
	
	dc.w	$110f,$fffe
	dc.w	$0100,$5200
bplcop:
	dc.w	$00e0,$0000
	dc.w	$00e2,$0000
	dc.w	$00e4,$0000
	dc.w	$00e6,$0000
	dc.w	$00e8,$0000
	dc.w	$00ea,$0000
	dc.w	$00ec,$0000
	dc.w	$00ee,$0000
	dc.w	$00f0,$0000
	dc.w	$00f2,$0000

colormap:
	dc.w	$0180,$0000
	dc.w	$0182,$0000 ;eca
	dc.w	$0184,$0e00
	dc.w	$0186,$0a00
	dc.w	$0188,$0d80
	dc.w	$018a,$0fe0
	dc.w	$018c,$08f0
	dc.w	$018e,$0080
	dc.w	$0190,$0222
	dc.w	$0192,$0444
	dc.w	$0194,$0666
	dc.w	$0196,$0777
	dc.w	$0198,$0999
	dc.w	$019a,$0bbb
	dc.w	$019c,$0ddd
	dc.w	$019e,$0fff
	dc.w	$01a0,$0025
	dc.w	$01a2,$0036
	dc.w	$01a4,$0148
	dc.w	$01a6,$0269
	dc.w	$01a8,$027b
	dc.w	$01aa,$039c
	dc.w	$01ac,$05ad
	dc.w	$01ae,$06cf
	dc.w	$01b0,$00d7
	dc.w	$01b2,$00c5
	dc.w	$01b4,$00a4
	dc.w	$01b6,$0093
	dc.w	$01b8,$0082
	dc.w	$01ba,$0071
	dc.w	$01bc,$0060
	dc.w	$01be,$0050

	dc.w	$2c01,$fffe
	dc.w	$0100,$0200
	dc.w	$ffff,$fffe


DMAWait = 300 ; Set this as low as possible without losing low notes.

n_note		EQU	0  ; W
n_cmd		EQU	2  ; W
n_cmdlo		EQU	3  ; B
n_start		EQU	4  ; L
n_length	EQU	8  ; W
n_loopstart	EQU	10 ; L
n_replen	EQU	14 ; W
n_period	EQU	16 ; W
n_finetune	EQU	18 ; B
n_volume	EQU	19 ; B
n_dmabit	EQU	20 ; W
n_toneportdirec	EQU	22 ; B
n_toneportspeed	EQU	23 ; B
n_wantedperiod	EQU	24 ; W
n_vibratocmd	EQU	26 ; B
n_vibratopos	EQU	27 ; B
n_tremolocmd	EQU	28 ; B
n_tremolopos	EQU	29 ; B
n_wavecontrol	EQU	30 ; B
n_glissfunk	EQU	31 ; B
n_sampleoffset	EQU	32 ; B
n_pattpos	EQU	33 ; B
n_loopcount	EQU	34 ; B
n_funkoffset	EQU	35 ; B
n_wavestart	EQU	36 ; L
n_reallength	EQU	40 ; W

mt_init	LEA	mt_data,A0
	MOVE.L	A0,mt_SongDataPtr
	MOVE.L	A0,A1
	LEA	952(A1),A1
	MOVEQ	#127,D0
	MOVEQ	#0,D1
mtloop	MOVE.L	D1,D2
	SUBQ.W	#1,D0
mtloop2	MOVE.B	(A1)+,D1
	CMP.B	D2,D1
	BGT.S	mtloop
	DBRA	D0,mtloop2
	ADDQ.B	#1,D2
			
	LEA	mt_SampleStarts,A1
	ASL.L	#8,D2
	ASL.L	#2,D2
	ADD.L	#1084,D2
	ADD.L	A0,D2
	MOVE.L	D2,A2
	MOVEQ	#30,D0
mtloop3	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	#30,A0
	DBRA	D0,mtloop3

	OR.B	#2,$BFE001
	MOVE.B	#6,mt_speed
	CLR.B	mt_counter
	CLR.B	mt_SongPos
	CLR.W	mt_PatternPos
mt_end	CLR.W	$DFF0A8
	CLR.W	$DFF0B8
	CLR.W	$DFF0C8
	CLR.W	$DFF0D8
	MOVE.W	#$F,$DFF096
	RTS

mt_music
	MOVEM.L	D0-D4/A0-A6,-(SP)
	ADDQ.B	#1,mt_counter
	MOVE.B	mt_counter(PC),D0
	CMP.B	mt_speed(PC),D0
	BLO.S	mt_NoNewNote
	CLR.B	mt_counter
	TST.B	mt_PattDelTime2
	BEQ.S	mt_GetNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_dskip

mt_NoNewNote
	BSR.S	mt_NoNewAllChannels
	BRA	mt_NoNewPosYet

mt_NoNewAllChannels
	LEA	$DFF0A0,A5
	LEA	mt_chan1temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0B0,A5
	LEA	mt_chan2temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0C0,A5
	LEA	mt_chan3temp(PC),A6
	BSR	mt_CheckEfx
	LEA	$DFF0D0,A5
	LEA	mt_chan4temp(PC),A6
	BRA	mt_CheckEfx

mt_GetNewNote
	MOVE.L	mt_SongDataPtr(PC),A0
	LEA	12(A0),A3
	LEA	952(A0),A2	;pattpo
	LEA	1084(A0),A0	;patterndata
	MOVEQ	#0,D0
	MOVEQ	#0,D1
	MOVE.B	mt_SongPos(PC),D0
	MOVE.B	(A2,D0.W),D1
	ASL.L	#8,D1
	ASL.L	#2,D1
	ADD.W	mt_PatternPos(PC),D1
	CLR.W	mt_DMACONtemp

	LEA	$DFF0A0,A5
	LEA	mt_chan1temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0B0,A5
	LEA	mt_chan2temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0C0,A5
	LEA	mt_chan3temp(PC),A6
	BSR.S	mt_PlayVoice
	LEA	$DFF0D0,A5
	LEA	mt_chan4temp(PC),A6
	BSR.S	mt_PlayVoice
	BRA	mt_SetDMA

mt_PlayVoice
	TST.L	(A6)
	BNE.S	mt_plvskip
	BSR	mt_PerNop
mt_plvskip
	MOVE.L	(A0,D1.L),(A6)
	ADDQ.L	#4,D1
	MOVEQ	#0,D2
	MOVE.B	n_cmd(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	mt_SetRegs
	MOVEQ	#0,D3
	LEA	mt_SampleStarts(PC),A1
	MOVE	D2,D4
	SUBQ.L	#1,D2
	ASL.L	#2,D2
	MULU	#30,D4
	MOVE.L	(A1,D2.L),n_start(A6)
	MOVE.W	(A3,D4.L),n_length(A6)
	MOVE.W	(A3,D4.L),n_reallength(A6)
	MOVE.B	2(A3,D4.L),n_finetune(A6)
	MOVE.B	3(A3,D4.L),n_volume(A6)
	MOVE.W	4(A3,D4.L),D3 ; Get repeat
	TST.W	D3
	BEQ.S	mt_NoLoop
	MOVE.L	n_start(A6),D2	; Get start
	ASL.W	#1,D3
	ADD.L	D3,D2		; Add repeat
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	4(A3,D4.L),D0	; Get repeat
	ADD.W	6(A3,D4.L),D0	; Add replen
	MOVE.W	D0,n_length(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)	; Set volume
	BRA.S	mt_SetRegs

mt_NoLoop
	MOVE.L	n_start(A6),D2
	ADD.L	D3,D2
	MOVE.L	D2,n_loopstart(A6)
	MOVE.L	D2,n_wavestart(A6)
	MOVE.W	6(A3,D4.L),n_replen(A6)	; Save replen
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)	; Set volume
mt_SetRegs
	MOVE.W	(A6),D0
	AND.W	#$0FFF,D0
	BEQ	mt_CheckMoreEfx	; If no note
	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0E50,D0
	BEQ.S	mt_DoSetFineTune
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#3,D0	; TonePortamento
	BEQ.S	mt_ChkTonePorta
	CMP.B	#5,D0
	BEQ.S	mt_ChkTonePorta
	CMP.B	#9,D0	; Sample Offset
	BNE.S	mt_SetPeriod
	BSR	mt_CheckMoreEfx
	BRA.S	mt_SetPeriod

mt_DoSetFineTune
	BSR	mt_SetFineTune
	BRA.S	mt_SetPeriod

mt_ChkTonePorta
	BSR	mt_SetTonePorta
	BRA	mt_CheckMoreEfx

mt_SetPeriod
	MOVEM.L	D0-D1/A0-A1,-(SP)
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	LEA	mt_PeriodTable(PC),A1
	MOVEQ	#0,D0
	MOVEQ	#36,D7
mt_ftuloop
	CMP.W	(A1,D0.W),D1
	BHS.S	mt_ftufound
	ADDQ.L	#2,D0
	DBRA	D7,mt_ftuloop
mt_ftufound
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	ADD.L	D1,A1
	MOVE.W	(A1,D0.W),n_period(A6)
	MOVEM.L	(SP)+,D0-D1/A0-A1

	MOVE.W	2(A6),D0
	AND.W	#$0FF0,D0
	CMP.W	#$0ED0,D0 ; Notedelay
	BEQ	mt_CheckMoreEfx

	MOVE.W	n_dmabit(A6),$DFF096
	BTST	#2,n_wavecontrol(A6)
	BNE.S	mt_vibnoc
	CLR.B	n_vibratopos(A6)
mt_vibnoc
	BTST	#6,n_wavecontrol(A6)
	BNE.S	mt_trenoc
	CLR.B	n_tremolopos(A6)
mt_trenoc
	MOVE.L	n_start(A6),(A5)	; Set start
	MOVE.W	n_length(A6),4(A5)	; Set length
	MOVE.W	n_period(A6),D0
	MOVE.W	D0,6(A5)		; Set period
	MOVE.W	n_dmabit(A6),D0
	OR.W	D0,mt_DMACONtemp
	BRA	mt_CheckMoreEfx
 
mt_SetDMA
	MOVE.W	#300,D0
mt_WaitDMA
	DBRA	D0,mt_WaitDMA
	MOVE.W	mt_DMACONtemp(PC),D0
	OR.W	#$8000,D0
	MOVE.W	D0,$DFF096
	MOVE.W	#300,D0
mt_WaitDMA2
	DBRA	D0,mt_WaitDMA2

	LEA	$DFF000,A5
	LEA	mt_chan4temp(PC),A6
	MOVE.L	n_loopstart(A6),$D0(A5)
	MOVE.W	n_replen(A6),$D4(A5)
	LEA	mt_chan3temp(PC),A6
	MOVE.L	n_loopstart(A6),$C0(A5)
	MOVE.W	n_replen(A6),$C4(A5)
	LEA	mt_chan2temp(PC),A6
	MOVE.L	n_loopstart(A6),$B0(A5)
	MOVE.W	n_replen(A6),$B4(A5)
	LEA	mt_chan1temp(PC),A6
	MOVE.L	n_loopstart(A6),$A0(A5)
	MOVE.W	n_replen(A6),$A4(A5)

mt_dskip
	ADD.W	#16,mt_PatternPos
	MOVE.B	mt_PattDelTime,D0
	BEQ.S	mt_dskc
	MOVE.B	D0,mt_PattDelTime2
	CLR.B	mt_PattDelTime
mt_dskc	TST.B	mt_PattDelTime2
	BEQ.S	mt_dska
	SUBQ.B	#1,mt_PattDelTime2
	BEQ.S	mt_dska
	SUB.W	#16,mt_PatternPos
mt_dska	TST.B	mt_PBreakFlag
	BEQ.S	mt_nnpysk
	SF	mt_PBreakFlag
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	CLR.B	mt_PBreakPos
	LSL.W	#4,D0
	MOVE.W	D0,mt_PatternPos
mt_nnpysk
	CMP.W	#1024,mt_PatternPos
	BLO.S	mt_NoNewPosYet
mt_NextPosition	
	MOVEQ	#0,D0
	MOVE.B	mt_PBreakPos(PC),D0
	LSL.W	#4,D0
	MOVE.W	D0,mt_PatternPos
	CLR.B	mt_PBreakPos
	CLR.B	mt_PosJumpFlag
	ADDQ.B	#1,mt_SongPos
	AND.B	#$7F,mt_SongPos
	MOVE.B	mt_SongPos(PC),D1
	MOVE.L	mt_SongDataPtr(PC),A0
	CMP.B	950(A0),D1
	BLO.S	mt_NoNewPosYet
	CLR.B	mt_SongPos
mt_NoNewPosYet	
	TST.B	mt_PosJumpFlag
	BNE.S	mt_NextPosition
	MOVEM.L	(SP)+,D0-D4/A0-A6
	RTS

mt_CheckEfx
	BSR	mt_UpdateFunk
	MOVE.W	n_cmd(A6),D0
	AND.W	#$0FFF,D0
	BEQ.S	mt_PerNop
	MOVE.B	n_cmd(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_Arpeggio
	CMP.B	#1,D0
	BEQ	mt_PortaUp
	CMP.B	#2,D0
	BEQ	mt_PortaDown
	CMP.B	#3,D0
	BEQ	mt_TonePortamento
	CMP.B	#4,D0
	BEQ	mt_Vibrato
	CMP.B	#5,D0
	BEQ	mt_TonePlusVolSlide
	CMP.B	#6,D0
	BEQ	mt_VibratoPlusVolSlide
	CMP.B	#$E,D0
	BEQ	mt_E_Commands
SetBack	MOVE.W	n_period(A6),6(A5)
	CMP.B	#7,D0
	BEQ	mt_Tremolo
	CMP.B	#$A,D0
	BEQ	mt_VolumeSlide
mt_Return2
	RTS

mt_PerNop
	MOVE.W	n_period(A6),6(A5)
	RTS

mt_Arpeggio
	MOVEQ	#0,D0
	MOVE.B	mt_counter(PC),D0
	DIVS	#3,D0
	SWAP	D0
	CMP.W	#0,D0
	BEQ.S	mt_Arpeggio2
	CMP.W	#2,D0
	BEQ.S	mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio1
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#15,D0
	BRA.S	mt_Arpeggio3

mt_Arpeggio2
	MOVE.W	n_period(A6),D2
	BRA.S	mt_Arpeggio4

mt_Arpeggio3
	ASL.W	#1,D0
	MOVEQ	#0,D1
	MOVE.B	n_finetune(A6),D1
	MULU	#36*2,D1
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D1,A0
	MOVEQ	#0,D1
	MOVE.W	n_period(A6),D1
	MOVEQ	#36,D7
mt_arploop
	MOVE.W	(A0,D0.W),D2
	CMP.W	(A0),D1
	BHS.S	mt_Arpeggio4
	ADDQ.L	#2,A0
	DBRA	D7,mt_arploop
	RTS

mt_Arpeggio4
	MOVE.W	D2,6(A5)
	RTS

mt_FinePortaUp
	TST.B	mt_counter
	BNE.S	mt_Return2
	MOVE.B	#$0F,mt_LowMask
mt_PortaUp
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	SUB.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#113,D0
	BPL.S	mt_PortaUskip
	AND.W	#$F000,n_period(A6)
	OR.W	#113,n_period(A6)
mt_PortaUskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,6(A5)
	RTS	
 
mt_FinePortaDown
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	#$0F,mt_LowMask
mt_PortaDown
	CLR.W	D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	mt_LowMask(PC),D0
	MOVE.B	#$FF,mt_LowMask
	ADD.W	D0,n_period(A6)
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	CMP.W	#856,D0
	BMI.S	mt_PortaDskip
	AND.W	#$F000,n_period(A6)
	OR.W	#856,n_period(A6)
mt_PortaDskip
	MOVE.W	n_period(A6),D0
	AND.W	#$0FFF,D0
	MOVE.W	D0,6(A5)
	RTS

mt_SetTonePorta
	MOVE.L	A0,-(SP)
	MOVE.W	(A6),D2
	AND.W	#$0FFF,D2
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#36*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.L	D0,A0
	MOVEQ	#0,D0
mt_StpLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_StpFound
	ADDQ.W	#2,D0
	CMP.W	#36*2,D0
	BLO.S	mt_StpLoop
	MOVEQ	#35*2,D0
mt_StpFound
	MOVE.B	n_finetune(A6),D2
	AND.B	#8,D2
	BEQ.S	mt_StpGoss
	TST.W	D0
	BEQ.S	mt_StpGoss
	SUBQ.W	#2,D0
mt_StpGoss
	MOVE.W	(A0,D0.W),D2
	MOVE.L	(SP)+,A0
	MOVE.W	D2,n_wantedperiod(A6)
	MOVE.W	n_period(A6),D0
	CLR.B	n_toneportdirec(A6)
	CMP.W	D0,D2
	BEQ.S	mt_ClearTonePorta
	BGE	mt_Return2
	MOVE.B	#1,n_toneportdirec(A6)
	RTS

mt_ClearTonePorta
	CLR.W	n_wantedperiod(A6)
	RTS

mt_TonePortamento
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_TonePortNoChange
	MOVE.B	D0,n_toneportspeed(A6)
	CLR.B	n_cmdlo(A6)
mt_TonePortNoChange
	TST.W	n_wantedperiod(A6)
	BEQ	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_toneportspeed(A6),D0
	TST.B	n_toneportdirec(A6)
	BNE.S	mt_TonePortaUp
mt_TonePortaDown
	ADD.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BGT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)
	BRA.S	mt_TonePortaSetPer

mt_TonePortaUp
	SUB.W	D0,n_period(A6)
	MOVE.W	n_wantedperiod(A6),D0
	CMP.W	n_period(A6),D0
	BLT.S	mt_TonePortaSetPer
	MOVE.W	n_wantedperiod(A6),n_period(A6)
	CLR.W	n_wantedperiod(A6)

mt_TonePortaSetPer
	MOVE.W	n_period(A6),D2
	MOVE.B	n_glissfunk(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_GlissSkip
	MOVEQ	#0,D0
	MOVE.B	n_finetune(A6),D0
	MULU	#36*2,D0
	LEA	mt_PeriodTable(PC),A0
	ADD.W	D0,A0
	MOVEQ	#0,D0
mt_GlissLoop
	CMP.W	(A0,D0.W),D2
	BHS.S	mt_GlissFound			
	ADDQ.W	#2,D0
	CMP.W	#36*2,D0
	BLO.S	mt_GlissLoop
	MOVEQ	#35*2,D0
mt_GlissFound
	MOVE.W	(A0,D0.W),D2
mt_GlissSkip
	MOVE.W	D2,6(A5) ; Set period
	RTS

mt_Vibrato
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Vibrato2
	MOVE.B	n_vibratocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_vibskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_vibskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_vibskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_vibskip2
	MOVE.B	D2,n_vibratocmd(A6)
mt_Vibrato2
	MOVE.B	n_vibratopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	AND.B	#$03,D2
	BEQ.S	mt_vib_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_vib_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_vib_set
mt_vib_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_vib_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_vib_set
mt_vib_sine
	MOVE.B	0(A4,D0.W),D2
mt_vib_set
	MOVE.B	n_vibratocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#7,D2
	MOVE.W	n_period(A6),D0
	TST.B	n_vibratopos(A6)
	BMI.S	mt_VibratoNeg
	ADD.W	D2,D0
	BRA.S	mt_Vibrato3
mt_VibratoNeg
	SUB.W	D2,D0
mt_Vibrato3
	MOVE.W	D0,6(A5)
	MOVE.B	n_vibratocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_vibratopos(A6)
	RTS

mt_TonePlusVolSlide
	BSR	mt_TonePortNoChange
	BRA	mt_VolumeSlide

mt_VibratoPlusVolSlide
	BSR.S	mt_Vibrato2
	BRA	mt_VolumeSlide

mt_Tremolo
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_Tremolo2
	MOVE.B	n_tremolocmd(A6),D2
	AND.B	#$0F,D0
	BEQ.S	mt_treskip
	AND.B	#$F0,D2
	OR.B	D0,D2
mt_treskip
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	BEQ.S	mt_treskip2
	AND.B	#$0F,D2
	OR.B	D0,D2
mt_treskip2
	MOVE.B	D2,n_tremolocmd(A6)
mt_Tremolo2
	MOVE.B	n_tremolopos(A6),D0
	LEA	mt_VibratoTable(PC),A4
	LSR.W	#2,D0
	AND.W	#$001F,D0
	MOVEQ	#0,D2
	MOVE.B	n_wavecontrol(A6),D2
	LSR.B	#4,D2
	AND.B	#$03,D2
	BEQ.S	mt_tre_sine
	LSL.B	#3,D0
	CMP.B	#1,D2
	BEQ.S	mt_tre_rampdown
	MOVE.B	#255,D2
	BRA.S	mt_tre_set
mt_tre_rampdown
	TST.B	n_vibratopos(A6)
	BPL.S	mt_tre_rampdown2
	MOVE.B	#255,D2
	SUB.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_rampdown2
	MOVE.B	D0,D2
	BRA.S	mt_tre_set
mt_tre_sine
	MOVE.B	0(A4,D0.W),D2
mt_tre_set
	MOVE.B	n_tremolocmd(A6),D0
	AND.W	#15,D0
	MULU	D0,D2
	LSR.W	#6,D2
	MOVEQ	#0,D0
	MOVE.B	n_volume(A6),D0
	TST.B	n_tremolopos(A6)
	BMI.S	mt_TremoloNeg
	ADD.W	D2,D0
	BRA.S	mt_Tremolo3
mt_TremoloNeg
	SUB.W	D2,D0
mt_Tremolo3
	BPL.S	mt_TremoloSkip
	CLR.W	D0
mt_TremoloSkip
	CMP.W	#$40,D0
	BLS.S	mt_TremoloOk
	MOVE.W	#$40,D0
mt_TremoloOk
	MOVE.W	D0,8(A5)
	MOVE.B	n_tremolocmd(A6),D0
	LSR.W	#2,D0
	AND.W	#$003C,D0
	ADD.B	D0,n_tremolopos(A6)
	RTS

mt_SampleOffset
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	BEQ.S	mt_sononew
	MOVE.B	D0,n_sampleoffset(A6)
mt_sononew
	MOVE.B	n_sampleoffset(A6),D0
	LSL.W	#7,D0
	CMP.W	n_length(A6),D0
	BGE.S	mt_sofskip
	SUB.W	D0,n_length(A6)
	LSL.W	#1,D0
	ADD.L	D0,n_start(A6)
	RTS
mt_sofskip
	MOVE.W	#$0001,n_length(A6)
	RTS

mt_VolumeSlide
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	LSR.B	#4,D0
	TST.B	D0
	BEQ.S	mt_VolSlideDown
mt_VolSlideUp
	ADD.B	D0,n_volume(A6)
	CMP.B	#$40,n_volume(A6)
	BMI.S	mt_vsuskip
	MOVE.B	#$40,n_volume(A6)
mt_vsuskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)
	RTS

mt_VolSlideDown
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
mt_VolSlideDown2
	SUB.B	D0,n_volume(A6)
	BPL.S	mt_vsdskip
	CLR.B	n_volume(A6)
mt_vsdskip
	MOVE.B	n_volume(A6),D0
	MOVE.W	D0,8(A5)
	RTS

mt_PositionJump
	MOVE.B	n_cmdlo(A6),D0
	SUBQ.B	#1,D0
	MOVE.B	D0,mt_SongPos
mt_pj2	CLR.B	mt_PBreakPos
	ST 	mt_PosJumpFlag
	RTS

mt_VolumeChange
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	CMP.B	#$40,D0
	BLS.S	mt_VolumeOk
	MOVEQ	#$40,D0
mt_VolumeOk
	MOVE.B	D0,n_volume(A6)
	MOVE.W	D0,8(A5)
	RTS

mt_PatternBreak
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	MOVE.L	D0,D2
	LSR.B	#4,D0
	MULU	#10,D0
	AND.B	#$0F,D2
	ADD.B	D2,D0
	CMP.B	#63,D0
	BHI.S	mt_pj2
	MOVE.B	D0,mt_PBreakPos
	ST	mt_PosJumpFlag
	RTS

mt_SetSpeed
	MOVE.B	3(A6),D0
	BEQ	mt_Return2
	CLR.B	mt_counter
	MOVE.B	D0,mt_speed
	RTS

mt_CheckMoreEfx
	BSR	mt_UpdateFunk
	MOVE.B	2(A6),D0
	AND.B	#$0F,D0
	CMP.B	#$9,D0
	BEQ	mt_SampleOffset
	CMP.B	#$B,D0
	BEQ	mt_PositionJump
	CMP.B	#$D,D0
	BEQ.S	mt_PatternBreak
	CMP.B	#$E,D0
	BEQ.S	mt_E_Commands
	CMP.B	#$F,D0
	BEQ.S	mt_SetSpeed
	CMP.B	#$C,D0
	BEQ	mt_VolumeChange
	BRA	mt_PerNop

mt_E_Commands
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F0,D0
	LSR.B	#4,D0
	BEQ.S	mt_FilterOnOff
	CMP.B	#1,D0
	BEQ	mt_FinePortaUp
	CMP.B	#2,D0
	BEQ	mt_FinePortaDown
	CMP.B	#3,D0
	BEQ.S	mt_SetGlissControl
	CMP.B	#4,D0
	BEQ	mt_SetVibratoControl
	CMP.B	#5,D0
	BEQ	mt_SetFineTune
	CMP.B	#6,D0
	BEQ	mt_JumpLoop
	CMP.B	#7,D0
	BEQ	mt_SetTremoloControl
	CMP.B	#9,D0
	BEQ	mt_RetrigNote
	CMP.B	#$A,D0
	BEQ	mt_VolumeFineUp
	CMP.B	#$B,D0
	BEQ	mt_VolumeFineDown
	CMP.B	#$C,D0
	BEQ	mt_NoteCut
	CMP.B	#$D,D0
	BEQ	mt_NoteDelay
	CMP.B	#$E,D0
	BEQ	mt_PatternDelay
	CMP.B	#$F,D0
	BEQ	mt_FunkIt
	RTS

mt_FilterOnOff
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#1,D0
	ASL.B	#1,D0
	AND.B	#$FD,$BFE001
	OR.B	D0,$BFE001
	RTS	

mt_SetGlissControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	RTS

mt_SetVibratoControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	AND.B	#$F0,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_SetFineTune
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	MOVE.B	D0,n_finetune(A6)
	RTS

mt_JumpLoop
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_SetLoop
	TST.B	n_loopcount(A6)
	BEQ.S	mt_jumpcnt
	SUBQ.B	#1,n_loopcount(A6)
	BEQ	mt_Return2
mt_jmploop	MOVE.B	n_pattpos(A6),mt_PBreakPos
	ST	mt_PBreakFlag
	RTS

mt_jumpcnt
	MOVE.B	D0,n_loopcount(A6)
	BRA.S	mt_jmploop

mt_SetLoop
	MOVE.W	mt_PatternPos(PC),D0
	LSR.W	#4,D0
	MOVE.B	D0,n_pattpos(A6)
	RTS

mt_SetTremoloControl
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_wavecontrol(A6)
	OR.B	D0,n_wavecontrol(A6)
	RTS

mt_RetrigNote
	MOVE.L	D1,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BEQ.S	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
	BNE.S	mt_rtnskp
	MOVE.W	(A6),D1
	AND.W	#$0FFF,D1
	BNE.S	mt_rtnend
	MOVEQ	#0,D1
	MOVE.B	mt_counter(PC),D1
mt_rtnskp
	DIVU	D0,D1
	SWAP	D1
	TST.W	D1
	BNE.S	mt_rtnend
mt_DoRetrig
	MOVE.W	n_dmabit(A6),$DFF096	; Channel DMA off
	MOVE.L	n_start(A6),(A5)	; Set sampledata pointer
	MOVE.W	n_length(A6),4(A5)	; Set length
	MOVE.W	#300,D0
mt_rtnloop1
	DBRA	D0,mt_rtnloop1
	MOVE.W	n_dmabit(A6),D0
	BSET	#15,D0
	MOVE.W	D0,$DFF096
	MOVE.W	#300,D0
mt_rtnloop2
	DBRA	D0,mt_rtnloop2
	MOVE.L	n_loopstart(A6),(A5)
	MOVE.L	n_replen(A6),4(A5)
mt_rtnend
	MOVE.L	(SP)+,D1
	RTS

mt_VolumeFineUp
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$F,D0
	BRA	mt_VolSlideUp

mt_VolumeFineDown
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	BRA	mt_VolSlideDown2

mt_NoteCut
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_counter(PC),D0
	BNE	mt_Return2
	CLR.B	n_volume(A6)
	MOVE.W	#0,8(A5)
	RTS

mt_NoteDelay
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	CMP.B	mt_Counter,D0
	BNE	mt_Return2
	MOVE.W	(A6),D0
	BEQ	mt_Return2
	MOVE.L	D1,-(SP)
	BRA	mt_DoRetrig

mt_PatternDelay
	TST.B	mt_counter
	BNE	mt_Return2
	MOVEQ	#0,D0
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	TST.B	mt_PattDelTime2
	BNE	mt_Return2
	ADDQ.B	#1,D0
	MOVE.B	D0,mt_PattDelTime
	RTS

mt_FunkIt
	TST.B	mt_counter
	BNE	mt_Return2
	MOVE.B	n_cmdlo(A6),D0
	AND.B	#$0F,D0
	LSL.B	#4,D0
	AND.B	#$0F,n_glissfunk(A6)
	OR.B	D0,n_glissfunk(A6)
	TST.B	D0
	BEQ	mt_Return2
mt_UpdateFunk
	MOVEM.L	D1/A0,-(SP)
	MOVEQ	#0,D0
	MOVE.B	n_glissfunk(A6),D0
	LSR.B	#4,D0
	BEQ.S	mt_funkend
	LEA	mt_FunkTable(PC),A0
	MOVE.B	(A0,D0.W),D0
	ADD.B	D0,n_funkoffset(A6)
	BTST	#7,n_funkoffset(A6)
	BEQ.S	mt_funkend
	CLR.B	n_funkoffset(A6)

	MOVE.L	n_loopstart(A6),D0
	MOVEQ	#0,D1
	MOVE.W	n_replen(A6),D1
	ADD.L	D1,D0
	ADD.L	D1,D0
	MOVE.L	n_wavestart(A6),A0
	ADDQ.L	#1,A0
	CMP.L	D0,A0
	BLO.S	mt_funkok
	MOVE.L	n_loopstart(A6),A0
mt_funkok
	MOVE.L	A0,n_wavestart(A6)
	MOVEQ	#-1,D0
	SUB.B	(A0),D0
	MOVE.B	D0,(A0)
mt_funkend
	MOVEM.L	(SP)+,D1/A0
	RTS


mt_FunkTable dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128

mt_VibratoTable	
	dc.b   0, 24, 49, 74, 97,120,141,161
	dc.b 180,197,212,224,235,244,250,253
	dc.b 255,253,250,244,235,224,212,197
	dc.b 180,161,141,120, 97, 74, 49, 24

mt_PeriodTable
; Tuning 0, Normal
	dc.w	856,808,762,720,678,640,604,570,538,508,480,453
	dc.w	428,404,381,360,339,320,302,285,269,254,240,226
	dc.w	214,202,190,180,170,160,151,143,135,127,120,113
; Tuning 1
	dc.w	850,802,757,715,674,637,601,567,535,505,477,450
	dc.w	425,401,379,357,337,318,300,284,268,253,239,225
	dc.w	213,201,189,179,169,159,150,142,134,126,119,113
; Tuning 2
	dc.w	844,796,752,709,670,632,597,563,532,502,474,447
	dc.w	422,398,376,355,335,316,298,282,266,251,237,224
	dc.w	211,199,188,177,167,158,149,141,133,125,118,112
; Tuning 3
	dc.w	838,791,746,704,665,628,592,559,528,498,470,444
	dc.w	419,395,373,352,332,314,296,280,264,249,235,222
	dc.w	209,198,187,176,166,157,148,140,132,125,118,111
; Tuning 4
	dc.w	832,785,741,699,660,623,588,555,524,495,467,441
	dc.w	416,392,370,350,330,312,294,278,262,247,233,220
	dc.w	208,196,185,175,165,156,147,139,131,124,117,110
; Tuning 5
	dc.w	826,779,736,694,655,619,584,551,520,491,463,437
	dc.w	413,390,368,347,328,309,292,276,260,245,232,219
	dc.w	206,195,184,174,164,155,146,138,130,123,116,109
; Tuning 6
	dc.w	820,774,730,689,651,614,580,547,516,487,460,434
	dc.w	410,387,365,345,325,307,290,274,258,244,230,217
	dc.w	205,193,183,172,163,154,145,137,129,122,115,109
; Tuning 7
	dc.w	814,768,725,684,646,610,575,543,513,484,457,431
	dc.w	407,384,363,342,323,305,288,272,256,242,228,216
	dc.w	204,192,181,171,161,152,144,136,128,121,114,108
; Tuning -8
	dc.w	907,856,808,762,720,678,640,604,570,538,508,480
	dc.w	453,428,404,381,360,339,320,302,285,269,254,240
	dc.w	226,214,202,190,180,170,160,151,143,135,127,120
; Tuning -7
	dc.w	900,850,802,757,715,675,636,601,567,535,505,477
	dc.w	450,425,401,379,357,337,318,300,284,268,253,238
	dc.w	225,212,200,189,179,169,159,150,142,134,126,119
; Tuning -6
	dc.w	894,844,796,752,709,670,632,597,563,532,502,474
	dc.w	447,422,398,376,355,335,316,298,282,266,251,237
	dc.w	223,211,199,188,177,167,158,149,141,133,125,118
; Tuning -5
	dc.w	887,838,791,746,704,665,628,592,559,528,498,470
	dc.w	444,419,395,373,352,332,314,296,280,264,249,235
	dc.w	222,209,198,187,176,166,157,148,140,132,125,118
; Tuning -4
	dc.w	881,832,785,741,699,660,623,588,555,524,494,467
	dc.w	441,416,392,370,350,330,312,294,278,262,247,233
	dc.w	220,208,196,185,175,165,156,147,139,131,123,117
; Tuning -3
	dc.w	875,826,779,736,694,655,619,584,551,520,491,463
	dc.w	437,413,390,368,347,328,309,292,276,260,245,232
	dc.w	219,206,195,184,174,164,155,146,138,130,123,116
; Tuning -2
	dc.w	868,820,774,730,689,651,614,580,547,516,487,460
	dc.w	434,410,387,365,345,325,307,290,274,258,244,230
	dc.w	217,205,193,183,172,163,154,145,137,129,122,115
; Tuning -1
	dc.w	862,814,768,725,684,646,610,575,543,513,484,457
	dc.w	431,407,384,363,342,323,305,288,272,256,242,228
	dc.w	216,203,192,181,171,161,152,144,136,128,121,114

mt_chan1temp	dc.l	0,0,0,0,0,$00010000,0,  0,0,0,0
mt_chan2temp	dc.l	0,0,0,0,0,$00020000,0,  0,0,0,0
mt_chan3temp	dc.l	0,0,0,0,0,$00040000,0,  0,0,0,0
mt_chan4temp	dc.l	0,0,0,0,0,$00080000,0,  0,0,0,0

mt_SampleStarts	dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
		dc.l	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

mt_SongDataPtr	dc.l 0

mt_speed	dc.b 6
mt_counter	dc.b 0
mt_SongPos	dc.b 0
mt_PBreakPos	dc.b 0
mt_PosJumpFlag	dc.b 0
mt_PBreakFlag	dc.b 0
mt_LowMask	dc.b 0
mt_PattDelTime	dc.b 0
mt_PattDelTime2	dc.b 0,0

mt_PatternPos	dc.w 0
mt_DMACONtemp	dc.w 0


cnt:	dc.w	0
convtab:dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	0,0
	dc.w	116,33 ;" "
	dc.w	108,10 ;!
	dc.w	00,0 
	dc.w	00,0
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 ;( 
	dc.w	00,0 ;) 
	dc.w	00,0  
	dc.w	00,0 ;+
	dc.w	00,0 ;, 
	dc.w	00,0 ;- 
	dc.w	104,11 ;. 
	dc.w	00,0 ;/
	dc.w	156,33 ;0
	dc.w	120,16 ;1
	dc.w	124,33 ;2
	dc.w	128,33 ;3
	dc.w	132,33 ;4
	dc.w	136,33 ;5
	dc.w	140,33 ;6
	dc.w	144,33 ;7
	dc.w	148,33 ;8
	dc.w	152,33 ;9
	dc.w	0,0 ;: 
	dc.w	0,0 
	dc.w	0,0 
	dc.w	0,0
	dc.w	0,0
	dc.w	112,33 ;?
	dc.w	00,0 
	dc.w	00,33 ;A
	dc.w	04,33 ;B
	dc.w	08,33 ;C
	dc.w	12,33 ;D
	dc.w	16,33 ;E
	dc.w	20,33 ;F
	dc.w	24,33 ;G
	dc.w	28,33 ;H
	dc.w	32,10 ;I
	dc.w	36,17 ;J
	dc.w	40,33 ;K
	dc.w	44,33 ;L
	dc.w	48,33 ;M
	dc.w	52,33 ;N
	dc.w	56,33 ;O
	dc.w	60,33 ;P
	dc.w	64,33 ;Q
	dc.w	68,33 ;R
	dc.w	72,33 ;S
	dc.w	76,33 ;T
	dc.w	80,33 ;U
	dc.w	84,33 ;V
	dc.w	88,33 ;W
	dc.w	92,33 ;X
	dc.w	96,33 ;Y
	dc.w	100,33 ;Z
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 
	dc.w	00,0 


text1:	dc.w	0
	dc.b	'MAJIC 12 PRESENTS PARTYSLIDES FROM THE GATHERING 93   '
	dc.b	'PRESS LEFT BUTTON TO SEE NEXT PICTURE.           '
	dc.b	'*'
	even

text2:	dc.w	0
	dc.b	'TUESDAY...  THIS IS THE DAY BEFORE IT STARTS. PEOPLE '
	dc.b	'SLOWLY ARRIVES. DURING THE NIGHT AND THE MORNING '
	dc.b	'MOST PEOPLE ARRIVES.     ' 
	dc.b	'*'
	even

text3:	dc.w	0
	dc.b	'THIS IS THE LEFT SPEAKERS. IT CONSISTS OF 3 SERVIN VEGA '
	dc.b	'SPEAKERS AND 8 OTHERS. IT IS SAID TO BE 4000 WATTS!!  '
	dc.b	'*'
	even

text4:	dc.w	0
	dc.b	'THIS IS FULCRUM OF AMEGA INDUSTRIES. HE IS FOR THE MOMENT '
	dc.b	'WORKING ON A GAME FOR BLACK LEDGEND SOFTWARE. WATCH OUT FOR '
	dc.b	'IT !!!!!!!!!!      '
	dc.b	'*'
	even

text5:	dc.w	0
	dc.b	'TEXT 5 '
	dc.b	'*'
	even

text6:	dc.w	0
	dc.b	'VENGER OF AMEGA INDUSTRIES JUST FINISHED DRINKING HIS '
	dc.b	'MILK AND IS NOW READY TO CHECK OUT THE GATHERING 93     '
	dc.b	'*'
	even

text7:	dc.w	0
	dc.b	'TEXT 7 '
	dc.b	'*'
	even

text8:	dc.w	0
	dc.b	'TEXT 8 '
	dc.b	'*'
	even
	
text9:	dc.w	0
	dc.b	'TEXT 9 '
	dc.b	'*'
	even

text10:	dc.w	0
	dc.b	'TEXT 10 '
	dc.b	'*'
	even

text11:	dc.w	0
	dc.b	'TEXT 11 '
	dc.b	'*'
	even


loadtxt:dc.w	0
	dc.b	'  *'
	even


dos_name:	dc.b	"dos.library",0
filename1:	dc.b	'df0:Pic01',0	
filename2:	dc.b	'df0:Pic02',0	
filename3:	dc.b	'df0:Pic03',0	
filename4:	dc.b	'df0:Pic04',0	
filename5:	dc.b	'df0:Pic05',0	
filename6:	dc.b	'df0:Pic06',0	
filename7:	dc.b	'df0:Pic07',0	
filename8:	dc.b	'df0:Pic08',0	
filename9:	dc.b	'df0:Pic09',0	
filename10:	dc.b	'df0:Pic10',0	
filename11:	dc.b	'df0:Pic11',0	


	even
dos_base:	dc.l	0
filebuffer:	dc.l	0
filelength:	dc.l	0
filehandle:	dc.l	0
filelock:	dc.l	0
scrollcnt:	dc.w	0
lineoff:	dc.w	0
prop:		dc.w	0

line:		blk.w	220,0
seed:		dc.l	0
screen:		blk.b	1232*5,0
font:		blk.b	4320*5,$fe
logo:		blk.b	1440*5 ;320*36
picture1:	blk.b	8680*4,0 ;320*217
picture2:	blk.b	8680*4,0
mt_data:	blk.b	160256,0	

	section FileInfoBlock,code_p
fileinfo:	blk.l	260,0



	>extern"dh0:grafix/raw/Majic_font",font
	>extern"dh0:grafix/raw2/PartySlide.logo",logo
	;>extern"dh0:grafix/raw2/bestefar",picture1
	>extern"dh0:codingtools/sources4/mod.test",mt_data
