	OPT	C-	* opt case off

BEGIN:
	JMP START
;=====================================================================
EXECBASE=4
OPENLIBRARY=-408
CLOSELIBRARY=-414
SUPERSTATE=-150
USERSTATE=-156	
FORBID=-132
PERMIT=-138
ADDINTSERVER=-168
REMINTSERVER=-174
Open=-30
Close=-36
Read=-42

;=====================================================================
BLTCON0=$DFF040		
BLTCON1=$DFF042
BLTAFWM=$DFF044
BLTALWM=$DFF046
BLTCPTH=$DFF048
BLTCPTL=$DFF04A
BLTBPTH=$DFF04C
BLTBPTL=$DFF04E
BLTAPTH=$DFF050
BLTAPTL=$DFF052
BLTDPTH=$DFF054
BLTDPTL=$DFF056
BLTSIZE=$DFF058
BLTCMOD=$DFF060
BLTBMOD=$DFF062
BLTAMOD=$DFF064
BLTDMOD=$DFF066
BLTCDAT=$DFF070
BLTBDAT=$DFF072
BLTADAT=$DFF074
DMACONR=$DFF002
;=================

;=================
START:    
	MOVEM.L D0-D7/A0-A6,-(A7)	;SAUVE REGISTRES
	MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
	JSR FORBID(A6)    		;SAUTE SOUS PROGRAMME: INTERDIT MULTITACHE
	JSR OPENLIB  			;SAUTE SOUS PROGRAMME: OUVERTURE LIBRAIRIES
	
	BSR MT_INIT			;INIT SOUND
	BSR INIT_DRAWSAMPLE

	BSR SETCOPPER			;SAUTE SOUS PROGRAMME: MET EN PLACE LISTE COPPER
	BSR NEWIRQ3			;SAUTE SOUS PROGRAMME: MET EN PLACE ROUTINE D'INTERRRUPTION

WAIT:
	CMP.B #$E0,$DFF006		;ATTENDANT 200 IEME LIGNE RASTER
	BNE.S WAIT			;SINON RETOURNE A WAIT
	
	BSR	DRAWSAMPLE

	BTST	#6,$BFE001		;ATTENDANT PRESSION SUR BOUTON GAUCHE SOURIS
	BNE.S	WAIT			;SINON RETOURNE A WAIT
	 				;SI OUI  FIN
END: 					;FIN:	
	BSR MT_END			;SOUND FIN
	BSR STOPIRQ3        		;SAUTE SOUS PROGRAMME: STOPPE INTERRUPTION
	BSR CLRCOPPER       		;SAUTE SOUS PROGRAMME: RESTAURE ANCIENNE LISTE COPPER
	BSR CLOSELIB        		;SAUTE SOUS PROGRAMME: FERME LIBRAIRIES 
	MOVE.L EXECBASE,A6		;CHARGE ADRESSE EXECBASE DANS A6
	JSR PERMIT(A6)      		;AUTORISE MULTITACHE
	                      
	MOVEM.L (A7)+,D0-D7/A0-A6	;RESTAURE REGISTRES
	RTS
;========================
NEWIRQ3:			;MET EN PLACE NOTRE ROUTINE 
	MOVE.L	EXECBASE,A6		;D'INTERRUPTION
	lea	irqstr,a1
	move.l	#5,d0
	jsr	addintserver(a6)
	move.l	d0,irq
	beq.s	irqerror
	rts
irqerror:
	rts
;==========================
STOPIRQ3:			;RESTAURE ANCIENNE ROUTINE
	movem.l	a0-a6/d0-d7,-(sp)	;D'INTERRUPTION
	tst.l	irq
	beq.s	irqoff1
	move.l	execbase,a6
	lea	irqstr,a1
	move.l	#32,d0
	jsr	remintserver(a6)
irqoff1:movem.l	(sp)+,a0-a6/d0-d7
	rts
irqstr:
	dc.l	0,0
	dc.b	2,-127
	dc.l	0,irqdat,interrupt
irqdat:	dc.l	0,0,0,0
irq:	dc.l	0
;============================
interrupt:			;NOTRE ROUTINE D'INTERRUPTION	
	movem.l	a0-a6/d0-d7,-(sp)
	
	BSR MT_MUSIC
	BSR CHECKSOUND
	
	movem.l	(sp)+,a0-a6/d0-d7
rts
;============================
OPENLIB:  			;OUVERTURE DE LA LIBRAIRIE GRAPHIQUE
	move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
	lea gfxname,a1			;MET NOM DE LA LIBRAIRIE DANS A1
	move.l #$0,d0           	;MET 0 DANS D0
	jsr openlibrary(a6)		;OUVRE LIBRAIRIE
	tst d0				;TESTE D0
	beq.s error			;SI = A 0   VA A ERROR = SORTIE
	move.l d0,gfxbase       	;SI NON, MET ADRESSE D0 DANS GFXBASE
	add.l #$32,d0			;AJOUTE $32 A CETTE ADRESSE
	move.l d0,coppertr      	;MET D0=ADRESSE ACTUELLE LISTE COPPER
	rts				;DANS COPPERTR
	even
gfxname: dc.b 'graphics.library',0 	;NOM DE LA LIBRAIRIE
	even
gfxbase: dc.l 0				;POINTEUR POUR LA GRAPHICS LIBRARY
coppertr: dc.l 0			;POINTEUR POUR ADRESSE LISTE COPPER
;====================
CLOSELIB: 			;FERMETURE LIBRAIRIE
	move.l execbase,a6      	;MET ADRESSE EXECBASE DANS A6
	move.l gfxbase,a1		;MET NOM DE LA LIBRAIRIE DANS A1
	jsr closelibrary(a6)		;FERME LIBRAIRIE
	rts
;====================
ERROR:				;SI ERREUR
	illegal				;SORTIE
	rts
;====================
SETCOPPER:			;MET EN PLACE NOTRE LISTE COPPER
	move.l coppertr,a0		;MET ADRESSE ACTUEL COPPER DANS A0
	move.l (a0),oldcopper		;MET CONTENU DANS OLDCOPPER
	move.l #newcopper,(a0)		;MET NOTRE LISTE COPPER DANS A0
	move.w #$81c0,$dff096		;ACTIVE LISTE COPPER
	rts		
oldcopper: dc.l 0
;====================
CLRCOPPER:			;RESTAURE ANCIENNE LISTE COPPER
	move.l coppertr,a0		;MET ANCIENNE ADRESSE DANS A0
	move.l oldcopper,(a0)		;MET CONTENU DANS A0
	move.w #$80a0,$dff096		;REACTIVE ANCIENNE COPPER
	rts
;====================
WAITBLIT:	
	BTST	#14,$DFF002
	BNE	WAITBLIT
	RTS
;====================
;------------------------------------------------------------------------------
;--- DRAW SAMPLE --------------------------------------------------------------
;------------------------------------------------------------------------------
; WRITTEN IN 1991/92 BY MC68000/TECH ------------------------------------------
;------------------------------------------------------------------------------

VIEWLENGTH=128			;NO. OF SAMPLES/VOICE
XADD=2
SCREENBREITE=40			;BYTES
SHIFTER=2			;SHIFTER FOR YSIZE (LSR.W) 
X1=0
Y1=0
X2=0
Y2=80
X3=0
Y3=160
X4=0
Y4=240				;COORDS

; GENERATE MULTIPLICATION TABEL

INIT_DRAWSAMPLE:
	LEA	MULTAB(PC),A0
	MOVEQ	#0,D0
	MOVE.W	#255,D7
WLOOP:
	MOVE.W	D0,(A0)+
	ADD.W	#SCREENBREITE,D0
	DBF	D7,WLOOP			;CREATE MULTAB
	RTS

DRAWSAMPLE:
	MOVEQ	#-1,D0
WB:
	CMP.B	$DFF006,D0
	BNE.B	WB

; TRIPPLE BUFFERING

	LEA	SCREEN(PC),A0
	MOVEM.L	(A0),D0-D1
	EXG	D0,D1
	MOVEM.L	D0-D1,(A0)

; SHOW 1.SCREEN 

	LEA	PLANECOPPER,A0
	MOVE.W	D1,6(A0)
	SWAP	D1
	MOVE.W	D1,2(A0)

; CLEAR 2.SCREEN

	BSR WAITBLIT
	MOVE.L	D0,$DFF054
	MOVE.L	#$01000000,$DFF040
	CLR.W	$DFF066
	MOVE.W	#256*64+(SCREENBREITE/2),$DFF058
	
; MAKE COORDSLIST

	LEA	COORDS(PC),A1
	LEA	MULTAB(PC),A0
	LEA	MT_CHAN1TEMP(PC),A2		;ADRESSE ST-STRUCTUR
	LEA	SS_SAMPLE1(PC),A4		;ADRESSE SHOWSAMPLE
	MOVE.W	#Y1,D5				;Y ADDER
	MOVE.W	#X1,D3				;X START
	BSR.W	DRAWIT

	LEA	44(A2),A2			;ADRESSE ST-STRUCTUR
	LEA	30(A4),A4			;ADRESSE SHOWSAMPLE
	MOVE.W	#Y2,D5
	MOVE.W	#X2,D3				;X START
	BSR.W	DRAWIT

	LEA	44(A2),A2			;ADRESSE ST-STRUCTUR
	LEA	30(A4),A4			;ADRESSE SHOWSAMPLE
	MOVE.W	#Y3,D5
	MOVE.W	#X3,D3				;X START
	BSR.W	DRAWIT

	LEA	44(A2),A2			;ADRESSE ST-STRUCTUR
	LEA	30(A4),A4			;ADRESSE SHOWSAMPLE
	MOVE.W	#Y4,D5
	MOVE.W	#X4,D3				;X START
	BSR.W	DRAWIT


	MOVEQ	#SCREENBREITE,D0
	MOVEQ	#-1,D1
	BSR WAITBLIT
	MOVE.W	D1,$DFF044
	MOVE.W	D1,$DFF072
	MOVE.W	#$8000,$DFF074
	MOVE.W	D0,$DFF060
	MOVE.W	D0,$DFF066

	LEA	COORDS(PC),A5
	LEA	MULTAB(PC),A4
	MOVE.L	SCREEN(PC),A0
	MOVEQ	#3,D7
VOICELOOP:
	MOVE.W	#VIEWLENGTH-2,D6
	MOVEM.W	(A5)+,D0-D1
LINELOOP:
	MOVEM.W	(A5)+,D2-D3
	MOVEM.W	D2-D3,-(A7)			;END XY SICHERN

		CMP.W	D1,D3
		BGE.S	LINE3
		EXG	D0,D2
		EXG	D1,D3
LINE3:		SUB.W	D1,D3
		ADD.W	D1,D1
		MOVE.W	(A4,D1.W),D1
		LEA	(A0,D1.W),A2
		MOVEQ	#0,D1
		SUB.W	D0,D2
		BGE.S	LINE4
		ADDQ.W	#2,D1
		NEG.W	D2
LINE4:		MOVEQ	#$F,D4
		AND.W	D0,D4
		LSR.W	#3,D0
		ADD.W	D0,A2
		ROR.W	#4,D4			
		OR.W	#$BCA,D4
		SWAP	D4
		CMP.W	D2,D3
		BGE.S	LINE5
		ADDQ.W	#1,D1
		EXG	D2,D3
LINE5:		ADD.W	D2,D2
		MOVE.W	D2,D0
		SUB.W	D3,D0
		ADDX.W	D1,D1
		MOVE.B	LINE2(PC,D1.W),D4
		SWAP	D2
		MOVE.W	D0,D2
		SUB.W	D3,D2
		MOVEQ	#6,D1
		LSL.W	D1,D3
		ADD.W	#$42,D3
		LEA	$DFF052,A1
		BSR WAITBLIT
		MOVE.L	D4,$DFF040
		MOVE.L	D2,$DFF062
		MOVE.L	A2,$DFF048
		MOVE.W	D0,(A1)+
		MOVE.L	A2,(A1)+	
		MOVE.W	D3,(A1)

	MOVEM.W	(A7)+,D0-D1			;END XY -> START XY
	DBF	D6,LINELOOP
	DBF	D7,VOICELOOP
	RTS

LINE2:		DC.B	1,1+$40,17,17+$40,9,9+$40,21,21+$40


DRAWIT:
	MOVEQ	#0,D0
	TST.W	10(A4)				;NEUER AUSSCHLAG ???
	BEQ.B	NONEWAUS

	MOVE.L	14(A4),(A4)			;SAMPLE ADRESS
	CLR.W	4(A4)				;SHOWADDER
	MOVE.W	18(A4),6(A4)			;PERIOD
	MOVE.W	20(A4),8(A4)			;SAMPLELENGHT
	CLR.W	10(A4)				;CLR ANSCHLAG
NONEWAUS:
	MOVE.W	4(A4),D0			;SHOWADDER
	ADD.W	6(A4),D0			;ADD PERIOD
	MOVE.W	D0,4(A4)			;NEW SHOWADDER SICHERN
	CMP.W	8(A4),D0			;SHOWADDER > SAMPLELENGHT
	BLO.B	NOLENGHT

	CMP.B	#2,29(A4)			;CHECK REPLENGHT
	BLO.B	NOLOOP				;<=2 (=KEIN LOOP) ???
	MOVE.L	24(A4),(A4)			;SET LOOPSTART	
	MOVE.W	28(A4),D1			;LOOPLENGHT
	SUB.W	#VIEWLENGTH,D1
	MOVE.W	D1,8(A4)			;=NEW SAMPLELENGHT
	MOVE.L	(A4),A3
	CLR.W	4(A4)				;SHOW ADDER = 0
	BRA.B	NOLENGHT	
NOLOOP:
	LEA	LEERSAMPLE(PC),A3
	MOVE.L	A3,(A4)				;SAMPLEADRESS = LEERSAMPLE
	CLR.L	4(A4)				;SHOWADDER & VIEWADDER = 0
	CLR.W	8(A4)				;SAMPLELENGHT = 0
	BRA.B	NEWLENGHT
NOLENGHT:
	MOVE.L	(A4),A3				;SAMPLEADRESS
	ADD.L	D0,A3				;ADD SHOWADDER
NEWLENGHT:
	MOVEQ	#64,D4				;MAX VOLUME
	SUB.B	19(A2),D4			;ACT.VOL. - MAX VOL.
	ADD.W	D4,D4

	IFNE VIEWLENGTH<=128
	MOVEQ	#VIEWLENGTH-1,D7		;ANZAHL SAMPLES
	ELSE
	MOVE.W	#VIEWLENGTH-1,D7
	ENDC
	
	MOVE.W	#128,D6				;SAMPLE + SCREENADDER 
DRAWLOOP:
	MOVEQ	#0,D1				
	MOVE.B	(A3)+,D1			;SAMPLE
	EXT.W	D1				;SAMPLE BYTE AUF WORDSIZE
	BEQ.W	ADDREADY			;= 0 ???
	BPL.B	ISPOS				;IST POSITIV

	ADD.W	D4,D1				;ADD VOLUME
	BLE.B	ADDREADY
	MOVEQ	#0,D1
	BRA.B	ADDREADY
ISPOS:
	SUB.W	D4,D1				;SUB VOLUME
	BGE.B	ADDREADY
	MOVEQ	#0,D1

ADDREADY:
	ADD.W	D6,D1

	IFNE SHIFTER>0
	LSR.W	#SHIFTER,D1
	ENDC

	MOVE.W	D3,D0				;X
	ADDQ.W	#XADD,D3			;X + 1
	ADD.W	D5,D1				;Y ADDER

	EXG	D0,D1
	MOVEM.W	D0-D1,(A1)
	ADDQ.L	#4,A1
NODRAW:
	DBF	D7,DRAWLOOP
	RTS


CHECKSOUND:
	MOVE.B	MT_COUNTER(PC),D0
	BNE.B	NOCHANGE			;MT_COUNTER = 0 -> NEW NOTE

	LEA	MT_CHAN1TEMP(PC),A0		;ADRESSE ST-STRUCTUR
	LEA	SS_SAMPLE1(PC),A1		;ADRESSE SHOWSAMPLE
	LEA	MT_PERIODTABLE(PC),A2
	LEA	SAMPLE_RATE(PC),A3
	MOVEQ	#44,D0
	MOVEQ	#30,D1
	MOVEQ	#35*2,D4
	MOVE.W	#VIEWLENGTH,D5
	MOVEQ	#3,D7

CHECKIT:
	TST.W	(A0)
	BEQ.B	NOMODIFY
	MOVE.W	(A0),10(A1)			;SAVE ANSCHLAG
	MOVE.L	4(A0),14(A1)			;SAMPLEADRESS
	MOVE.W	16(A0),D3			;PERIOD
	MOVEQ	#0,D2
CHECKLOOP:
	CMP.W	(A2,D2.W),D3
	BGE.B	LEAVECHECKLOOP
	ADDQ.W	#2,D2
	CMP.W	D4,D2
	BNE.B	CHECKLOOP
LEAVECHECKLOOP:
	MOVE.W	(A3,D2.W),18(A1)		;SAMPLE RATE
	MOVE.W	8(A0),D3			;SAMPLELENGHT
	SUB.W	D5,D3				;- VIEWSIZE
	BPL.B	NOTOLITTLE
	MOVE.W	D5,D3
NOTOLITTLE:
	MOVE.W	D3,20(A1)			;SAMPLELENGHT
	MOVE.L	10(A0),24(A1)			;LOOPSTART
	MOVE.W	14(A0),D3
	SUB.W	D5,D3
	BMI.B	NOLOOPX
	MOVE.W	14(A0),D3
NOLOOPX:
	MOVE.W	D3,28(A1)			;LOOPLENGHT
NOMODIFY:
	ADD.L	D0,A0				;ADRESSE ST-STRUCTUR
	ADD.L	D1,A1				;ADRESSE SHOWSAMPLE
	DBF	D7,CHECKIT
NOCHANGE:
	RTS


SAMPLE_RATE:	DC.W	83,88,94,99,106,112,119,126,133,141,150,158,167,177
		DC.W	188,199,211,224,237,251,266,282,298,317,335,354,377
		DC.W	398,421,447,474,501,530,563,597,634

LEERSAMPLE:	DCB.B	VIEWLENGTH
		EVEN

SS_SAMPLE1:	DCB.B	30*4
MULTAB:		DCB.W	256
SCREEN:		DC.L	SCREEN1,SCREEN2

COORDS:		DCB.W	VIEWLENGTH*2*4

***********************************************************
*                 PROTRACKER V1.1b REPLAYER               *
***********************************************************
*  ORGINAL BY :                     ZAP/AMIGA FREELANCERS *
*  SPEEDED UP & VOLUME CONTROL BY : MC68000/TECH          *
***********************************************************
*  -- MODIFY 'mt_maxvol'(.b -- 0-64) TO CHANGE VOLUME --  *
***********************************************************

MT_FINETUNE=0			;1=MT_FINETUNE ON
MT_LEVEL6=1			;1=LEVEL 6 INTERUPT (CIA) ON

MT_DMAWAITER=3			;NO.OF RASTERS WAITING FOR DMA
				;... ONLY IF NO LEVEL6 USE !!!

; INIT_PLAYING ----------------------------------------------------------------

mt_init	lea	mt_periodmultab(pc),a5
	lea	mt_data,a0
	move.l	a0,mt_songdataptr-mt_periodmultab(a5)
	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.b	mtloop
	dbf	d0,mtloop2
	addq.b	#1,d2
			
	lea	mt_samplestarts(pc),a1
	moveq	#10,d0
	asl.l	d0,d2
	add.l	#1084,d2
	add.l	a0,d2
	move.l	d2,a2
	moveq	#30,d0
mt_loop3	
	clr.l	(a2)
	move.l	a2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	add.l	d1,d1
	add.l	d1,a2
	lea	30(a0),a0
	dbf	d0,mt_loop3

	or.b	#2,$bfe001
	move.b	#6,mt_speed-mt_periodmultab(a5)
	clr.b	mt_counter-mt_periodmultab(a5)
	clr.b	mt_songpos-mt_periodmultab(a5)
	clr.w	mt_patternpos-mt_periodmultab(a5)
	move.l	$78.w,mt_oldirq-mt_periodmultab(a5)
	lea	$dff096,a0
	clr.w	$a8-$96(a0)
	clr.w	$b8-$96(a0)
	clr.w	$c8-$96(a0)
	clr.w	$d8-$96(a0)
	moveq	#$f,d0
	move.w	d0,(a0)

	lea	mt_samplemultab(pc),a0
	moveq	#31,d7
	moveq	#0,d0
	moveq	#30,d1
mt_mulloop1
	move.w	d0,(a0)+
	add.w	d1,d0
	dbf	d7,mt_mulloop1

	moveq	#15,d7
	moveq	#0,d0
	moveq	#72,d1
mt_mulloop2
	move.w	d0,(a5)+
	add.w	d1,d0
	dbf	d7,mt_mulloop2
	rts

; END_PLAYING -----------------------------------------------------------------

mt_end	move.l	mt_oldirq(pc),$78.w
	lea	$dff096,a0
	clr.w	$a8-$96(a0)
	clr.w	$b8-$96(a0)
	clr.w	$c8-$96(a0)
	clr.w	$d8-$96(a0)
	moveq	#$f,d0
	move.w	d0,(a0)
	rts

; SOUND_PLAYER ---------------------------------------------------------------

; kills d0-d7/a0-a6 !!!!

mt_music
	moveq	#$f,d5				;ander com_low
	moveq	#-16,d6				;ander com	
	lea	mt_periodmultab(pc),a2
	addq.b	#1,mt_counter-mt_periodmultab(a2)
	move.b	mt_counter-mt_periodmultab(a2),d0
	cmp.b	mt_speed-mt_periodmultab(a2),d0
	blo.b	mt_nonewallchannels
	clr.b	mt_counter-mt_periodmultab(a2)
	tst.b	mt_pattdeltime2-mt_periodmultab(a2)
	beq.b	mt_getnewnote
	bsr.b	mt_nonewallchannels
	bra.w	mt_dskip

mt_nonewallchannels
	lea	$dff0a0,a5
	lea	mt_chan1temp(pc),a6
	bsr.w	mt_checkefx
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.w	mt_checkefx
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.w	mt_checkefx
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.w	mt_checkefx
	bra.w	mt_nonewposyet

mt_getnewnote
	move.l	mt_songdataptr(pc),a0
	lea	12(a0),a3
	lea	952(a0),a4	;pattpo
	lea	1084(a0),a0	;patterndata
	moveq	#0,d0
	move.l	d0,d1
	move.b	mt_songpos(pc),d0
	move.b	(a4,d0.w),d1
	moveq	#10,d2
	lsl.l	d2,d1
	add.w	mt_patternpos(pc),d1
	clr.w	mt_dmacontemp-mt_periodmultab(a2)

	lea	$dff0a0,a5
	lea	mt_chan1temp(pc),a6
	bsr.b	mt_playvoice
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.b	mt_playvoice
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.b	mt_playvoice
	lea	$10(a5),a5
	lea	44(a6),a6
	bsr.b	mt_playvoice
	bra.w	mt_setdma

mt_samplemultab	dcb.w	32

mt_playvoice
	tst.l	(a6)
	bne.b	mt_plvskip
	bsr.w	mt_pernop
mt_plvskip
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.l	d2,d3
	move.b	2(a6),d2
	and.b	d6,d2
	lsr.b	#4,d2
	move.b	(a6),d0
	and.b	d6,d0
	or.b	d0,d2
	beq.w	mt_setregs
	lea	mt_samplestarts(pc),a1
	move.w	d2,d4
	subq.w	#1,d2
	lsl.w	#2,d2
	add.w	d4,d4
	move.w	mt_samplemultab(pc,d4.w),d4
	move.l	(a1,d2.w),4(a6)
	move.w	(a3,d4.w),8(a6)
	move.w	(a3,d4.w),40(a6)

	ifne mt_finetune=1
	move.b	2(a3,d4.w),18(a6)
	endc

	move.b	3(a3,d4.w),d0

	cmp.b	mt_maxvol(pc),d0
	bls.b	mt_nv
	move.b	mt_maxvol(pc),d0
mt_nv
	move.b	d0,19(a6)

	move.w	4(a3,d4.w),d3 		; get repeat
	beq.b	mt_noloop
	move.l	4(a6),d2		; get start
	add.w	d3,d3
	add.l	d3,d2			; add repeat
	move.l	d2,10(a6)
	move.l	d2,36(a6)
	move.w	4(a3,d4.w),d0		; get repeat
	add.w	6(a3,d4.w),d0		; add replen
	move.w	d0,8(a6)
	move.w	6(a3,d4.w),14(a6)	; save replen
	move.b	19(a6),9(a5)		; init volume
	bra.b	mt_setregs
mt_noloop
	move.l	4(a6),d2
	add.l	d3,d2
	move.l	d2,10(a6)
	move.l	d2,36(a6)
	move.w	6(a3,d4.w),14(a6)	; save replen
	move.b	19(a6),9(a5)
mt_setregs
	move.w	(a6),d0
	and.w	#$0fff,d0
	beq.w	mt_checkmoreefx		; if no note

 	ifne mt_finetune=1
	move.w	2(a6),d0
	and.w	#$0ff0,d0
	cmp.w	#$0e50,d0
	beq.b	mt_dosetfinetune
	endc

	moveq	#0,d0
	move.b	2(a6),d0
	and.b	d5,d0
	lsl.b	#2,d0
	move.l	mt_jumptab3(pc,d0.w),a4
 	jmp	(a4)

mt_jumptab3	
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_chktoneporta,mt_setperiod,mt_chktoneporta
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_moreplusperiod
		dc.l	mt_setperiod	
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod
		dc.l	mt_setperiod


mt_moreplusperiod
	bsr.w	mt_checkmoreefx
	bra.b	mt_setperiod

mt_dosetfinetune
	bsr.w	mt_setfinetune
	bra.b	mt_setperiod

mt_chktoneporta
	bsr.w	mt_settoneporta
	bra.w	mt_checkmoreefx

mt_setperiod
	move.w	(a6),d2
	and.w	#$0fff,d2

	ifne mt_finetune=1

	lea	mt_periodtable(pc),a4
	moveq	#0,d0
	moveq	#36,d7
mt_ftuloop
	cmp.w	(a4)+,d2
	bhs.b	mt_ftufound
	dbf	d7,mt_ftuloop
mt_ftufound
	moveq	#0,d2
	move.b	18(a6),d2
	add.w	d2,d2
	add.w	(a2,d2.w),d0
	move.w	-2(a4),16(a6)		; set period + finetune
	else	
	move.w	d2,16(a6)		; set normal period
	endc
	move.w	2(a6),d0
	and.w	#$0ff0,d0
	cmp.w	#$0ed0,d0 		; notedelay
	beq.w	mt_checkmoreefx

	move.w	20(a6),$dff096
	btst	#2,30(a6)
	bne.b	mt_vibnoc
	clr.b	27(a6)
mt_vibnoc
	btst	#6,30(a6)
	bne.b	mt_trenoc
	clr.b	29(a6)
mt_trenoc
	move.l	4(a6),(a5)		; init start
	move.w	8(a6),4(a5)		; init length
	move.w	16(a6),d0
	move.w	d0,6(a5)		; init period
	move.w	20(a6),d0
	or.w	d0,mt_dmacontemp-mt_periodmultab(a2)
	bra.w	mt_checkmoreefx
 
mt_setdma
	ifne mt_level6=0
	bsr.w	mt_dmawait
	move.w	mt_dmacontemp(pc),d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	bsr.w	mt_dmawait
	lea	$dff0a0,a5
	lea	mt_chan1temp(pc),a6
	move.l	10(a6),(a5)
	move.w	14(a6),4(a5)
	move.l	54(a6),$10(a5)
	move.w	58(a6),$14(a5)
	move.l	98(a6),$20(a5)
	move.w	102(a6),$24(a5)
	move.l	142(a6),$30(a5)
	move.w	146(a6),$34(a5)
	else

	lea	$bfd000,a3
	move.b	#$7f,$d00(a3)
	move.w	#$2000,$dff09c
	move.w	#$a000,$dff09a
	lea	mt_irq1(pc),a4
	move.l	a4,$78.w
	moveq	#0,d0
	move.b	d0,$e00(a3)
	move.b	#$a8,$400(a3)
	move.b	d0,$500(a3)
	move.b	#$11,$e00(a3)
	move.b	#$81,$d00(a3)
	or.w	#$8000,mt_dmacontemp-mt_periodmultab(a2)
	bra.w	mt_dskip


mt_irq1
	tst.b	$bfdd00
	move.w	mt_dmacontemp(pc),$dff096
	move.w	#$2000,$dff09c
	move.l	#mt_irq2,$78.w
	rte

mt_irq2
	tst.b	$bfdd00
	movem.l	a5-a6,-(a7)

	lea	$dff0a0,a5
	lea	mt_chan1temp(pc),a6
	move.l	10(a6),(a5)
	move.w	14(a6),4(a5)
	move.l	54(a6),$10(a5)
	move.w	58(a6),$14(a5)
	move.l	98(a6),$20(a5)
	move.w	102(a6),$24(a5)
	move.l	142(a6),$30(a5)
	move.w	146(a6),$34(a5)

	clr.b	$bfde00
	move.b	#$7f,$bfdd00
	move.w	#$2000,$dff09c
	movem.l	(a7)+,a5-a6
	rte
	endc

mt_dskip
	add.w	#16,mt_patternpos-mt_periodmultab(a2)
	move.b	mt_pattdeltime(pc),d0
	beq.b	mt_dskc
	move.b	d0,mt_pattdeltime2-mt_periodmultab(a2)
	clr.b	mt_pattdeltime-mt_periodmultab(a2)
mt_dskc	tst.b	mt_pattdeltime2-mt_periodmultab(a2)
	beq.b	mt_dska
	subq.b	#1,mt_pattdeltime2-mt_periodmultab(a2)
	beq.b	mt_dska
	sub.w	#16,mt_patternpos-mt_periodmultab(a2)
mt_dska	tst.b	mt_pbreakflag-mt_periodmultab(a2)
	beq.b	mt_nnpysk
	sf	mt_pbreakflag-mt_periodmultab(a2)
	moveq	#0,d0
	move.b	mt_pbreakpos(pc),d0
	clr.b	mt_pbreakpos-mt_periodmultab(a2)
	lsl.w	#4,d0
	move.w	d0,mt_patternpos-mt_periodmultab(a2)
mt_nnpysk
	cmp.w	#1024,mt_patternpos-mt_periodmultab(a2)
	blo.b	mt_nonewposyet
mt_nextposition	
	moveq	#0,d0
	move.b	mt_pbreakpos(pc),d0
	lsl.w	#4,d0
	move.w	d0,mt_patternpos-mt_periodmultab(a2)
	clr.b	mt_pbreakpos-mt_periodmultab(a2)
	clr.b	mt_posjumpflag-mt_periodmultab(a2)
	addq.b	#1,mt_songpos-mt_periodmultab(a2)
	and.b	#$7f,mt_songpos-mt_periodmultab(a2)
	move.b	mt_songpos(pc),d1
	move.l	mt_songdataptr(pc),a0
	cmp.b	950(a0),d1
	blo.b	mt_nonewposyet
	clr.b	mt_songpos-mt_periodmultab(a2)
mt_nonewposyet	
	tst.b	mt_posjumpflag-mt_periodmultab(a2)
	bne.b	mt_nextposition
	rts

mt_checkefx
	bsr.w	mt_updatefunk
	move.w	2(a6),d0
	and.w	#$0fff,d0
	beq.b	mt_pernop
	moveq	#0,d0
	move.b	2(a6),d0
	and.b	d5,d0
	move.w	d0,d2
	lsl.b	#2,d2	
	move.l	mt_jumptab(pc,d2.w),a4
	jmp	(a4)

mt_jumptab	dc.l	mt_arpeggio,mt_portaup,mt_portadown,mt_toneportamento
		dc.l	mt_vibrato,mt_toneplusvolslide,mt_vibratoplusvolslide
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_setback
		dc.l	mt_e_commands,mt_setback

mt_setback	
	move.w	16(a6),6(a5)
	subq.b	#7,d0
	beq.w	mt_tremolo
	subq.b	#3,d0
	beq.w	mt_volumeslide
mt_return2
	rts


mt_pernop
	move.w	16(a6),6(a5)
	rts

mt_arpeggio
	moveq	#0,d0
	move.b	mt_counter(pc),d0
	moveq	#3,d2
	divs	d2,d0
	swap	d0
	tst.w	d0
	beq.b	mt_arpeggio2
	subq.w	#2,d0
	beq.b	mt_arpeggio1
	moveq	#0,d0
	move.b	3(a6),d0
	lsr.b	#4,d0
	bra.b	mt_arpeggio3

mt_arpeggio1
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	d5,d0
	bra.b	mt_arpeggio3

mt_arpeggio2
	move.w	16(a6),d2
	bra.b	mt_arpeggio4

mt_arpeggio3
	add.w	d0,d0
	ifne mt_finetune=1
	moveq	#0,d1
	move.b	18(a6),d1
	add.w	d1,d1
	move.w	(a2,d1.w),d1
	lea	mt_periodtable(pc),a0
	add.l	d1,a0
	else	
	lea	mt_periodtable(pc),a0
	endc
	move.w	16(a6),d1
	moveq	#36,d7
mt_arploop
	move.w	(a0,d0.w),d2
	cmp.w	(a0),d1
	bhs.b	mt_arpeggio4
	addq.l	#2,a0
	dbf	d7,mt_arploop
	rts

mt_arpeggio4
	move.w	d2,6(a5)
	rts

mt_fineportaup
	move.b	mt_counter(pc),d2
	bne.b	mt_return2
	move.b	d1,mt_lowmask-mt_periodmultab(a2)
mt_portaup
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	mt_lowmask(pc),d0
	move.b	#$ff,mt_lowmask-mt_periodmultab(a2)
	sub.w	d0,16(a6)
	move.w	16(a6),d0
	and.w	#$0fff,d0
	cmp.w	#113,d0
	bpl.b	mt_portauskip
	and.w	#$f000,16(a6)
	or.w	#113,16(a6)
mt_portauskip
	move.w	16(a6),d0
	and.w	#$0fff,d0
	move.w	d0,6(a5)
	rts	
 
mt_fineportadown
	tst.b	mt_counter-mt_periodmultab(a2)
	bne.w	mt_return2
	move.b	d5,mt_lowmask-mt_periodmultab(a2)
mt_portadown
	clr.w	d0
	move.b	3(a6),d0
	and.b	mt_lowmask(pc),d0
	move.b	#$ff,mt_lowmask-mt_periodmultab(a2)
	add.w	d0,16(a6)
	move.w	16(a6),d0
	and.w	#$0fff,d0
	cmp.w	#856,d0
	bmi.b	mt_portadskip
	and.w	#$f000,16(a6)
	or.w	#856,16(a6)
mt_portadskip
	move.w	16(a6),d0
	and.w	#$0fff,d0
	move.w	d0,6(a5)
	rts

mt_settoneporta
	move.w	(a6),d2
	and.w	#$0fff,d2

	ifne mt_finetune=1
	moveq	#0,d0
	move.b	18(a6),d0
	add.w	d0,d0
	move.w	(a2,d0.w),d0
	lea	mt_periodtable(pc),a4
	add.l	d0,a4
	else
	lea	mt_periodtable(pc),a4
	endc
	moveq	#0,d0
mt_stploop
	cmp.w	(a4,d0.w),d2
	bhs.b	mt_stpfound
	addq.w	#2,d0
	cmp.w	#37*2,d0
	blo.b	mt_stploop
	moveq	#35*2,d0
mt_stpfound
	move.b	18(a6),d2
	and.b	#8,d2
	beq.b	mt_stpgoss
	tst.w	d0
	beq.b	mt_stpgoss
	subq.w	#2,d0
mt_stpgoss
	move.w	(a4,d0.w),d2
	move.w	d2,24(a6)
	move.w	16(a6),d0
	clr.b	22(a6)
	cmp.w	d0,d2
	beq.b	mt_cleartoneporta
	bge.w	mt_return2
	move.b	#1,22(a6)
	rts

mt_cleartoneporta
	clr.w	24(a6)
	rts

mt_toneportamento
	move.b	3(a6),d0
	beq.b	mt_toneportnochange
	move.b	d0,23(a6)
	clr.b	3(a6)
mt_toneportnochange
	tst.w	24(a6)
	beq.w	mt_return2
	moveq	#0,d0
	move.b	23(a6),d0
	tst.b	22(a6)
	bne.b	mt_toneportaup
mt_toneportadown
	add.w	d0,16(a6)
	move.w	24(a6),d0
	cmp.w	16(a6),d0
	bgt.b	mt_toneportasetper
	move.w	24(a6),16(a6)
	clr.w	24(a6)
	bra.b	mt_toneportasetper

mt_toneportaup
	sub.w	d0,16(a6)
	move.w	24(a6),d0
	cmp.w	16(a6),d0
	blt.b	mt_toneportasetper
	move.w	24(a6),16(a6)
	clr.w	24(a6)

mt_toneportasetper
	move.w	16(a6),d2
	move.b	31(a6),d0
	and.b	d5,d0
	beq.b	mt_glissskip
	ifne mt_finetune=1
	moveq	#0,d0
	move.b	18(a6),d0
	add.w	d0,d0
	move.w	(a2,d0.w),d0
	lea	mt_periodtable(pc),a0
	add.l	d0,a0
	else
	lea	mt_periodtable(pc),a0
	endc

	moveq	#36,d7
mt_glissloop
	cmp.w	(a0)+,d2
	bhs.b	mt_glissfound
	dbf	d7,mt_glissloop
	subq.l	#4,a0
mt_glissfound
	move.w	-2(a0),d2
mt_glissskip
	move.w	d2,6(a5) 		; set period
	rts

mt_vibrato
	move.b	3(a6),d0
	beq.b	mt_vibrato2
	move.b	26(a6),d2
	and.b	d5,d0
	beq.b	mt_vibskip
	and.b	d6,d2
	or.b	d0,d2
mt_vibskip
	move.b	3(a6),d0
	and.b	d6,d0
	beq.b	mt_vibskip2
	and.b	d5,d2
	or.b	d0,d2
mt_vibskip2
	move.b	d2,26(a6)
mt_vibrato2
	move.b	27(a6),d0
	lea	mt_vibratotable(pc),a4
	lsr.w	#2,d0
	and.w	#$001f,d0
	moveq	#0,d2
	move.b	30(a6),d2
	and.b	#$03,d2
	beq.b	mt_vib_sine
	lsl.b	#3,d0
	cmp.b	#1,d2
	beq.b	mt_vib_rampdown
	moveq	#-1,d2
	bra.b	mt_vib_set
mt_vib_rampdown
	tst.b	27(a6)
	bpl.b	mt_vib_rampdown2
	moveq	#-1,d2
	sub.b	d0,d2
	bra.b	mt_vib_set
mt_vib_rampdown2
	move.b	d0,d2
	bra.b	mt_vib_set
mt_vib_sine
	move.b	(a4,d0.w),d2
mt_vib_set
	move.b	26(a6),d0
	and.w	d5,d0
	mulu	d0,d2
	lsr.w	#7,d2
	move.w	16(a6),d0
	tst.b	27(a6)
	bmi.b	mt_vibratoneg
	add.w	d2,d0
	bra.b	mt_vibrato3
mt_vibratoneg
	sub.w	d2,d0
mt_vibrato3
	move.w	d0,6(a5)
	move.b	26(a6),d0
	lsr.w	#2,d0
	and.w	#$003c,d0
	add.b	d0,27(a6)
	rts

mt_toneplusvolslide
	bsr.w	mt_toneportnochange
	bra.w	mt_volumeslide

mt_vibratoplusvolslide
	bsr.b	mt_vibrato2
	bra.w	mt_volumeslide

mt_tremolo
	move.b	3(a6),d0
	beq.b	mt_tremolo2
	move.b	28(a6),d2
	and.b	d5,d0
	beq.b	mt_treskip
	and.b	d6,d2
	or.b	d0,d2
mt_treskip
	move.b	3(a6),d0
	and.b	d6,d0
	beq.b	mt_treskip2
	and.b	d5,d2
	or.b	d0,d2
mt_treskip2
	move.b	d2,28(a6)
mt_tremolo2
	move.b	29(a6),d0
	lea	mt_vibratotable(pc),a4
	lsr.w	#2,d0
	moveq	#$1f,d2
	and.w	d2,d0
	move.b	30(a6),d2
	lsr.b	#4,d2
	and.b	#$03,d2
	beq.b	mt_tre_sine
	lsl.b	#3,d0
	cmp.b	#1,d2
	beq.b	mt_tre_rampdown
	moveq	#-1,d2
	bra.b	mt_tre_set
mt_tre_rampdown
	tst.b	27(a6)
	bpl.b	mt_tre_rampdown2
	moveq	#-1,d2
	sub.b	d0,d2
	bra.b	mt_tre_set
mt_tre_rampdown2
	move.b	d0,d2
	bra.b	mt_tre_set
mt_tre_sine
	move.b	(a4,d0.w),d2
mt_tre_set
	move.b	28(a6),d0
	and.w	d5,d0
	mulu	d0,d2
	lsr.w	#6,d2
	moveq	#0,d0
	move.b	19(a6),d0
	tst.b	29(a6)
	bmi.b	mt_tremoloneg
	add.w	d2,d0
	bra.b	mt_tremolo3
mt_tremoloneg
	sub.w	d2,d0
mt_tremolo3
	bpl.b	mt_tremoloskip
	moveq	#0,d0
mt_tremoloskip
	cmp.b	mt_maxvol(pc),d0
	bls.b	mt_tremolook
	move.b	mt_maxvol(pc),d0
mt_tremolook
	move.b	d0,9(a5)
	move.b	28(a6),d0
	lsr.w	#2,d0
	and.w	#$003c,d0
	add.b	d0,29(a6)
	rts

mt_sampleoffset
	moveq	#0,d0
	move.b	3(a6),d0
	beq.b	mt_sononew
	move.b	d0,32(a6)
mt_sononew
	move.b	32(a6),d0
	lsl.w	#7,d0
	cmp.w	8(a6),d0
	bge.b	mt_sofskip
	sub.w	d0,8(a6)
	add.w	d0,d0
	add.l	d0,4(a6)
	rts
mt_sofskip
	move.w	#1,8(a6)
	rts

mt_volumeslide
	move.b	3(a6),d0
	and.b	d6,d0
	lsr.b	#4,d0
	beq.b	mt_volslidedown
mt_volslideup
	add.b	d0,19(a6)
	move.b	mt_maxvol(pc),d2
	cmp.b	19(a6),d2
	bge.b	mt_vsuskip
	move.b	d2,19(a6)
mt_vsuskip
	move.b	19(a6),9(a5)
	rts

mt_volslidedown
	move.b	3(a6),d0
	and.b	d5,d0
mt_volslidedown2
	sub.b	d0,19(a6)
	bpl.b	mt_vsdskip
	clr.b	19(a6)
mt_vsdskip
	move.b	19(a6),9(a5)
	rts

mt_positionjump
	move.b	3(a6),d0
	subq.b	#1,d0
	move.b	d0,mt_songpos-mt_periodmultab(a2)
mt_pj2	clr.b	mt_pbreakpos-mt_periodmultab(a2)
	st 	mt_posjumpflag-mt_periodmultab(a2)
	rts

mt_volumechange
	move.b	3(a6),d0
	cmp.b	mt_maxvol(pc),d0
	ble.b	mt_volumeok
	move.b	mt_maxvol(pc),d0
mt_volumeok
	move.b	d0,19(a6)
	move.b	d0,9(a5)
	rts

mt_patternbreak
	move.b	3(a6),d0
	move.b	d0,d2
	lsr.b	#4,d0
	move.b	d0,d1
	add.b	d0,d0		;*2
	lsl.b	#3,d1		;*8
	add.b	d1,d0		;+ -> *10
	and.b	d5,d2
	add.b	d2,d0
	cmp.b	#63,d0
	bhi.b	mt_pj2
	move.b	d0,mt_pbreakpos-mt_periodmultab(a2)
	st	mt_posjumpflag-mt_periodmultab(a2)
	rts

mt_setspeed
	move.b	3(a6),d0
	beq.w	mt_return2
	clr.b	mt_counter-mt_periodmultab(a2)
	move.b	d0,mt_speed-mt_periodmultab(a2)
	rts

mt_checkmoreefx
	bsr.w	mt_updatefunk
	moveq	#0,d0
	move.b	2(a6),d0
	and.b	d5,d0
	lsl.b	#2,d0
	move.l	mt_jumptab4(pc,d0.w),a4
	jmp	(a4)

mt_jumptab4	
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_pernop
		dc.l	mt_sampleoffset,mt_pernop,mt_positionjump
		dc.l	mt_volumechange,mt_patternbreak,mt_e_commands
		dc.l	mt_setspeed,mt_pernop

mt_e_commands
	moveq	#0,d0
	move.b	3(a6),d0
	and.b	d6,d0
	lsr.b	#4,d0
	lsl.b	#2,d0
	move.l	mt_jumptab2(pc,d0.w),a4
	jmp	(a4)


mt_jumptab2	
	dc.l	mt_filteronoff,mt_fineportaup,mt_fineportadown
	dc.l	mt_setglisscontrol,mt_setvibratocontrol
	ifne mt_finetune=1
	dc.l	mt_setfinetune
	else
	dc.l	mt_return2
	endc		
	dc.l	mt_jumploop,mt_settremolocontrol
	dc.l	mt_return2,mt_retrignote,mt_volumefineup
	dc.l	mt_volumefinedown,mt_notecut,mt_notedelay
	dc.l	mt_patterndelay,mt_funkit

mt_filteronoff
	move.b	3(a6),d0
	and.b	#1,d0
	add.w	d0,d0
	and.b	#$fd,$bfe001
	or.b	d0,$bfe001
	rts	

mt_setglisscontrol
	move.b	3(a6),d0
	and.b	d5,d0
	and.b	d6,31(a6)
	or.b	d0,31(a6)
	rts

mt_setvibratocontrol
	move.b	3(a6),d0
	and.b	d5,d0
	and.b	d6,30(a6)
	or.b	d0,30(a6)
	rts

mt_setfinetune
	move.b	3(a6),d0
	and.b	d5,d0
	move.b	d0,18(a6)
	rts

mt_jumploop
	move.b	mt_counter(pc),d1
	bne.w	mt_return2
	move.b	3(a6),d0
	and.b	d5,d0
	beq.b	mt_setloop
	tst.b	34(a6)
	beq.b	mt_jumpcnt
	subq.b	#1,34(a6)
	beq.w	mt_return2
mt_jmploop	
	move.b	33(a6),mt_pbreakpos-mt_periodmultab(a2)
	st	mt_pbreakflag-mt_periodmultab(a2)
	rts

mt_jumpcnt
	move.b	d0,34(a6)
	bra.b	mt_jmploop

mt_setloop
	move.w	mt_patternpos(pc),d0
	lsr.w	#4,d0
	move.b	d0,33(a6)
	rts

mt_settremolocontrol
	move.b	3(a6),d0
	and.b	d5,d0
	lsl.b	#4,d0
	and.b	d5,30(a6)
	or.b	d0,30(a6)
	rts

mt_retrignote
	move.b	3(a6),d0
	and.b	d5,d0
	beq.b	mt_rtnend
	moveq	#0,d2
	move.b	mt_counter(pc),d2
	bne.b	mt_rtnskp
	move.w	(a6),d2
	and.w	#$0fff,d2
	bne.b	mt_rtnend
	moveq	#0,d2
	move.b	mt_counter(pc),d2
mt_rtnskp
	divu	d0,d2
	swap	d2
	tst.w	d2
	bne.b	mt_rtnend
mt_doretrig
	move.w	20(a6),$dff096		; channel dma off
	move.l	4(a6),(a5)		; set sampledata pointer
	move.w	8(a6),4(a5)		; set length
	bsr.w	mt_dmawait
	move.w	20(a6),d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	bsr.w	mt_dmawait
	move.l	10(a6),(a5)
	move.l	14(a6),4(a5)
mt_rtnend
	rts

mt_volumefineup
	move.b	mt_counter(pc),d1
	bne.w	mt_return2
	move.b	3(a6),d0
	and.b	d5,d0
	bra.w	mt_volslideup

mt_volumefinedown
	move.b	mt_counter(pc),d1
	bne.w	mt_return2
	move.b	3(a6),d0
	and.b	d5,d0
	bra.w	mt_volslidedown2

mt_notecut
	cmp.b	mt_counter(pc),d0
	bne.w	mt_return2
	clr.b	19(a6)
	clr.w	8(a5)
	rts

mt_notedelay
	move.b	3(a6),d0
	and.b	d5,d0
	cmp.b	mt_counter(pc),d0
	bne.w	mt_return2
	move.w	(a6),d0
	beq.w	mt_return2
	bra.w	mt_doretrig

mt_patterndelay
	move.b	mt_counter(pc),d1
	bne.w	mt_return2
	move.b	mt_pattdeltime2(pc),d1
	bne.w	mt_return2
	move.b	3(a6),d0
	and.b	d5,d0
	addq.b	#1,d0
	move.b	d0,mt_pattdeltime-mt_periodmultab(a2)
	rts

mt_funkit
	move.b	mt_counter(pc),d1
	bne.w	mt_return2
	move.b	3(a6),d0
	and.b	d5,d0
	lsl.b	#4,d0
	and.b	d5,31(a6)
	or.b	d0,31(a6)
	tst.b	d0
	beq.w	mt_return2
mt_updatefunk
	moveq	#0,d0
	move.b	31(a6),d0
	lsr.b	#4,d0
	beq.b	mt_funkend
	lea	mt_funktable(pc),a4
	move.b	(a4,d0.w),d0
	add.b	d0,35(a6)
	btst	#7,35(a6)
	beq.b	mt_funkend
	clr.b	35(a6)

	move.l	10(a6),d0
	moveq	#0,d2
	move.w	14(a6),d2
	add.w	d2,d2
	add.l	d2,d0
	move.l	36(a6),a4
	addq.l	#1,a4
	cmp.l	d0,a4
	blo.b	mt_funkok
	move.l	10(a6),a4
mt_funkok
	move.l	a4,36(a6)
	moveq	#-1,d0
	sub.b	(a4),d0
	move.b	d0,(a4)
mt_funkend
	rts

mt_dmawait
	ifne mt_dmawaiter>0
	moveq	#mt_dmawaiter-1,d4
mt_waitdma2
	move.b	$dff006,d5
mt_waitdma3
	cmp.b	$dff006,d5
	beq.b	mt_waitdma3
	dbf	d4,mt_waitdma2		;wait some rasters
	endc
	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	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	;0
		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	;1
		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	;2
		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	;3
		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	;4
		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	;5
		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	;6
		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	;7
		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	;-8
		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;-7
		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	;-6
		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	;-5
		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	;-4
		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	;-3
		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	;-2
		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	;-1
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	dcb.l	32
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
mt_maxvol	dc.b	64			;maximum volume
mt_patternpos	dc.w 	0
mt_dmacontemp	dc.w 	0
mt_oldirq	dc.l	0
mt_periodmultab	dcb.w	16

;====================
	EVEN				;NOTRE LISTE COPPER
	
	SECTION COPPER,CODE_C
	
NEWCOPPER:   
	DC.W	$008E,$2A81,$0090,$2AD1	;DIMENSIONS DE L'ECRAN
	DC.W	$0092,$0038,$0094,$00D0

	;POINTEURS ADRESSE DES PLANS DE L'IMAGE

PLANECOPPER:
	DC.W $00E0
HI1:	DC.W 0				;PLAN 1		
	DC.W $00E2
LO1:	DC.W 0 

	;REGISTRE POUR CHOISIR RESOLUTION	

	DC.W	$0100,$1200		;5 PLANS+MODE COULEURS

	;DECALAGE ECRAN - INUTILISE ICI

	DC.W	$0102,$0000

	;PRIORITE DES PLANS ET SPRITES - INUTILISE ICI

	DC.W 	$0104,$0000

	;MODULOS DES PLANS

	DC.W	$0108,0	;MODULOS PLANS PAIRS
	DC.W 	$010A,0	;MODULOS PLANS IMPAIRS

	;POINTEURS DES SPRITES - MIS A 0 SI PAS DE SPRITES

	DC.W	$0120,$0000,$0122,$0000
	DC.W	$0124,$0000,$0126,$0000
	DC.W	$0128,$0000,$012A,$0000	;PAS DE SPRITES
	DC.W	$012C,$0000,$012E,$0000
	DC.W	$0130,$0000,$0132,$0000
	DC.W	$0134,$0000,$0136,$0000
	DC.W	$0138,$0000,$013A,$0000
	DC.W	$013C,$0000,$013E,$0000

	;REGISTRES DES COULEURS

	DC.W	$0180,$0000	;COULEUR 00
	DC.W	$0182,$0ffc	;COULEUR 01
	DC.W	$0184,$0ff9	;COULEUR 02
	DC.W	$0186,$0fe6	;COULEUR 03
	DC.W	$0188,$0fd3	;COULEUR 04
	DC.W	$018A,$0fb0	;COULEUR 05
	DC.W	$018C,$0e90	;COULEUR 06
	DC.W	$018E,$0c80	;COULEUR 07
	DC.W	$0190,$0b70	;COULEUR 08
	DC.W	$0192,$0a60	;COULEUR 09
	DC.W	$0194,$0850	;COULEUR 10
	DC.W	$0196,$0740	;COULEUR 11
	DC.W	$0198,$0630	;COULEUR 12
	DC.W	$019A,$0520	;COULEUR 13
	DC.W	$019C,$0420	;COULEUR 14
	DC.W	$019E,$0210	;COULEUR 15
	DC.W	$01A0,$0950	;COULEUR 16	;LES COULEURS DE 16 A 31 SONT
	DC.W	$01A2,$0432	;COULEUR 17	;AUSSI CELLES DES SPRITES
	DC.W	$01A4,$0222	;COULEUR 18
	DC.W	$01A6,$0333	;COULEUR 19	;LES COULEURS 16 A 31 NE SONT
	DC.W	$01A8,$0444	;COULEUR 20	;PAS UTILISEES DANS LE MODE
	DC.W	$01AA,$0555	;COULEUR 21	;HOLD AND MODIFY (HAM)
	DC.W	$01AC,$0666	;COULEUR 22
	DC.W	$01AE,$0777	;COULEUR 23
	DC.W	$01B0,$0888	;COULEUR 24
	DC.W	$01B2,$0999	;COULEUR 25
	DC.W	$01B4,$0aaa	;COULEUR 26
	DC.W	$01B6,$0bbb	;COULEUR 27
	DC.W	$01B8,$0ccc	;COULEUR 28
	DC.W	$01BA,$0ddd	;COULEUR 29
	DC.W	$01BC,$0eee	;COULEUR 30
	DC.W	$01BE,$0fff	;COULEUR 31

	;INSTRUCTIONS POUR AVOIR UN ECRAN PAL (256 LIGNES DE HAUT)

	DC.W $FFDF,$FFFE

	DC.L $FFFFFFFE

	EVEN

	section	ZONE_CHIP,code_C
	
screen1		dcb.b	screenbreite*256
screen2		dcb.b	screenbreite*256
		
mt_data		incbin	mod.TESTMODUL

	end

