*
*	TECHMENU. WRITTEN ON 16-02-91 BY NEIL JOHNSTON.
*	SPECIAL THANKS TO MARK FLEMANS FOR:
*	
*	GIVING ME THE IDEA
*	SHOWING HOW TO READ THE FUNCTION KEYS
*	HOW TO USE (SOME) DOS ROUTINES
*	
*	IT MAY LOOK LIKE A RIP OFF OF MARK`S MENU. BUT IT`S NOT!
*	I`LL ADMIT, SOME PARTS MAY LOOK LIKE MARKS AS I`VE ONLY BEEN
*	CODING FOR ABOUT 6 WEEKS(ISH), AND I HAVE NOT (YET!) GOT A DECENT
*	BOOK TEACHING ME HOW TO USE LIBRARY FUNCTIONS, ETC. HOPE YOU
*	DON`T MIND ME COPYING YOUR IDEAS, ETC, MARK?
*
*	NOTE: SOMETIMES THE LOGO AT THE TOP APPEARS WITH THE COLOURS
*	MESSED UP. DON'T ASK ME WHY!......

	SECTION MENU,CODE_C		CODE 2 CHIPMEM
	OPT	C-			NO CASE SENSITIVITY

**********

	INCDIR	SYS:INCLUDE/
	INCLUDE	HARDWARE/CUSTOM.I
	INCLUDE	EXEC/EXEC_LIB.I

**********

START	MOVE.L	A7,STPOINT		SAVE STACK POINTER
	MOVEM.L	A0-A6/D0-D7,-(A7)	SAVE ALL REGISTERS
	MOVE.L	#$DFF000,A5		I USE A5 AS MY HARDWARE OFFSET REG.
	CALLEXEC FORBID			TURN OFF MULTITASKING
	
	LEA	GFXNAME(PC),A1	
	MOVEQ.L	#0,D0
	CALLEXEC OPENLIBRARY		OPEN GFX LIBRARY
	MOVE.L	D0,GFXBASE		SAVE GFX BASE

	LEA	DOSNAME(PC),A1
	MOVEQ.L	#0,D0			ANY VERSION WILL DO, THANKS!
	CALLEXEC OPENLIBRARY		OPEN GFX LIBRARY
	MOVE.L	D0,DOSBASE

	MOVE.W	DMACONR(A5),DMASAVE	SAVE CLI DMA SETTINGS

WAIT1	BTST	#0,VPOSR(A5)		WAIT FOR VBL
	BNE.S	WAIT1			BEFORE TURNING
WAIT2	CMPI.B	#55,VHPOSR(A5)		SPRITE DMA OFF TO
	BNE.S	WAIT2			PREVENT CRAP APPEARING

SET_UP	MOVE.W	#$0020,DMACON(A5)	SPRITE DMA OFF!
	MOVE.L	#NEWCOP,COP1LC(A5)	STICK MY NEW COPPER IN...
	MOVE.L	COPJMP1(A5),D0		...AND STROBE IT
	

*	NOTE: AT FIRST I USED A `MOVE.W %1000001110000000,DMACON(A5) TO TURN
*	SPRITE DMA OFF! BUT THEN I REALISED (REMEMBERED!) THAT THIS ONLY
*	*SETS* THE STATED BITS, AND LEAVES THE OTHERS ALONE :^D I FELT A
*	BUT SILLY AFTER READING THAT MANY TIMES BEFORE! I ONLY SAY THIS IN
*	CASE ANY OTHER BEGINNERS FALL INTO THIS TRAP! P.S. THANKS TO SIMON
*	KNIPE FOR EXPLAINING THOSE FACES! UP TO NOW, I`D ALWAYS WONDERED
*	WHAT THOSE THINGS NICO FRANCOIS USED TO ALWAYS USE IN HIS DOCS WERE!

	JSR	MT_INIT			SET UP MUSIC
	
***********

BACKG	MOVE.L	#LOGO,D0		SETUP MAIN LOGO
	MOVE.W	D0,PL1L
	SWAP	D0
	MOVE.W	D0,PL1H
	SWAP	D0
	ADD	#3120,D0		NEXT PLANE
	MOVE.W	D0,PL2L
	SWAP	D0
	MOVE.W	D0,PL2H
	SWAP	D0
	ADD	#3120,D0		NEXT PLANE
	MOVE.W	D0,PL3L
	SWAP	D0
	MOVE.W	D0,PL3H
	SWAP	D0
	ADD	#3120,D0		NEXT PLANE
	MOVE.W	D0,PL4L
	SWAP	D0
	MOVE.W	D0,PL4H
	SWAP	D0
	ADD	#3120,D0		NEXT PLANE
	MOVE.W	D0,PL5L
	SWAP	D0
	MOVE.W	D0,PL5H

	MOVE.L	#TEXT,D0		SETUP MAIN MENU TEXT
	MOVE.W	D0,TL1L
	SWAP	D0
	MOVE.W	D0,TL1H

	MOVE.L	#CREDS,D0		SETUP MINI CREDIT BAR
	MOVE.W	D0,CL1L
	SWAP	D0
	MOVE.W	D0,CL1H

	MOVEQ.L	#0,D0

GETCHAR	CMPI.B	#255,$DFF006		WHY DOES EVERYBODY USE COMPLEX
	BNE.S	GETCHAR			AND`S ETC IN THEIR WAIT ROUTINES?
	JSR	MT_MUSIC		THIS WAY WORKS FINE!
	
	MOVE.B	$BFEC01,D0		GET RAW CHAR (THANKS MARK!)
	NOT	D0
	ROR.B	#1,D0
	CMP.B	#$59,D0
	BHI.S	GETCHAR
	CMP.B	#$4F,D0
	BLS.S	GETCHAR
	MOVE.B	D0,FKEY

	MOVE.L	GFXBASE,A0		JUST REPLACES CLI COPPER,
	MOVE.L	$26(A0),COP1LC(A5)	CLOSES GFX LIBRARY
	CLR.L	D0			& TURNS ON MULTITASKING.
	MOVE.L	GFXBASE,A1
	
	MOVE.W	DMASAVE,D7
	BSET	#$F,D7
	MOVE.W	D7,DMACON(A5)		RESET DMA SETTINGS

	CALLEXEC CLOSELIBRARY
	CALLEXEC PERMIT

	JSR	MT_END			MUSIC NO MORE!

**********

	MOVEQ.L	#0,D0
	MOVE.B	FKEY,D0
	SUB.B	#$4F,D0

F1	CMP.B	#1,D0
	BNE.S	F2
	MOVE.L	#COM1,D7		SAVES TO D7 AS D2 IS USED BEFORE
	BRA	EXECUTE			EXECUTE() IS CALLED

F2	CMP.B	#2,D0
	BNE.S	F3
	MOVE.L	#COM2,D7
	BRA	EXECUTE

F3	CMP.B	#3,D0
	BNE.S	F4
	MOVE.L	#COM3,D7
	BRA	EXECUTE

F4	CMP.B	#4,D0
	BNE.S	F5
	MOVE.L	#COM4,D7
	BRA	EXECUTE

F5	CMP.B	#5,D0
	BNE.S	F6
	MOVE.L	#COM5,D7
	BRA	EXECUTE

F6	CMP.B	#6,D0
	BNE.S	F7
	MOVE.L	#COM6,D7
	BRA	EXECUTE

F7	CMP.B	#7,D0
	BNE.S	F8
	MOVE.L	#COM7,D7
	BRA	EXECUTE

F8	CMP.B	#8,D0
	BNE.S	F9
	MOVE.L	#COM8,D7
	BRA	EXECUTE

F9	CMP.B	#9,D0
	BNE.S	F10
	MOVE.L	#COM9,D7
	BRA	EXECUTE

F10	MOVE.L	#COM10,D7


**********

EXECUTE	LEA	CONNAM(PC),A1		CONSOLE SETTINGS
	MOVE.L	#1005,D0		ACCESS MODE
	MOVE.L	A1,D1			CONSOLE NAME --> D1
	MOVE.L	D0,D2			ACCESS MODE --> D2
	MOVE.L	DOSBASE,A6
	JSR	-30(A6)			OPEN NEW WINDOW
	MOVE.L	D0,CONHD		SAVE OUR WINDOW HANDLE
	
	MOVE.L	DOSBASE,A6		JUST TO BE `SAFE`!
	MOVE.L	D7,D1			COMMAND --> D1
	MOVEQ.L	#0,D2			NO INPUT
	MOVE.L	CONHD,D3		CONSOLE HANDLE --> D3
	JSR	-222(A6)		EXECUTE OUR COMMAND

	MOVE.L	CONHD,D1
	MOVE.L	DOSBASE,A6
	JSR	-36(A6)			CLOSE OUR WINDOW

**********

QUIT	MOVE.L	DOSBASE,A1
	CALLEXEC CLOSELIBRARY		CLOSE DOS LIBRARY


	MOVEM.L	(A7)+,A0-A6/D0-D7	RESTORE REGISTERS...
	MOVE.L	STPOINT,A7		...AND OLD STACK
	RTS				GOODBYE CRUEL WORLD (SOB!)

**********

NEWCOP	DC.W	BPLCON0,$0000		STANDARD SORT OF
	DC.W	BPLCON1,$0000
	DC.W	DIWSTRT,$2281		SCREEN SETUP
	DC.W	DIWSTOP,$22C1
	DC.W	DDFSTRT,$0038		
	DC.W	DDFSTOP,$00D0
	DC.W	BPL1MOD,$0000		
	DC.W	BPL2MOD,$0000

	DC.W	$2009,$FFFE,BPLCON0,$5200  OPEN 5BPL, 74 PIXEL HIGH SCREEN


	DC.W	BPLPT+$00		SET UP MAIN LOGO BPLANE POINTERS
PL1H	DC.W	0,BPLPT+$02
PL1L	DC.W	0,BPLPT+$04
PL2H	DC.W	0,BPLPT+$06
PL2L	DC.W	0,BPLPT+$08
PL3H	DC.W	0,BPLPT+$0A
PL3L	DC.W	0,BPLPT+$0C
PL4H	DC.W	0,BPLPT+$0E
PL4L	DC.W	0,BPLPT+$10
PL5H	DC.W	0,BPLPT+$12
PL5L	DC.W	0

cop1:	dc.w	$0180,$0000		MAIN LOGO COLOURS
	dc.w	$0182,$0FFF		(FROM IFFMASTER AGAIN!)
	dc.w	$0184,$0444
	dc.w	$0186,$077B
	dc.w	$0188,$056A
	dc.w	$018A,$044A
	dc.w	$018C,$023A
	dc.w	$018E,$0129
	dc.w	$0190,$0019
	dc.w	$0192,$034A
	dc.w	$0194,$033A
	dc.w	$0196,$023A
	dc.w	$0198,$0229
	dc.w	$019A,$0129
	dc.w	$019C,$0119
	dc.w	$019E,$0019
	dc.w	$01A0,$0620
	dc.w	$01A2,$0720
	dc.w	$01A4,$0730
	dc.w	$01A6,$0830
	dc.w	$01A8,$0840
	dc.w	$01AA,$0950
	dc.w	$01AC,$0A50
	dc.w	$01AE,$0A60
	dc.w	$01B0,$0B70
	dc.w	$01B2,$0B80
	dc.w	$01B4,$0C90
	dc.w	$01B6,$0DA0
	dc.w	$01B8,$0DB0
	dc.w	$01BA,$0EC0
	dc.w	$01BC,$0ED0
	dc.w	$01BE,$0620

	DC.W	$6A09,$FFFE,BPLCON0,0000	END OF LOGO SCREEN

	DC.W	$6B09,$FFFE,$0180,$0111		SIMPLE COPPERBAR
	DC.W	$6C09,$FFFE,$0180,$0333
	DC.W	$6D09,$FFFE,$0180,$0777
	DC.W	$6E09,$FFFE,$0180,$0BBB
	DC.W	$6F09,$FFFE,$0180,$0FFF
	DC.W	$7009,$FFFE,$0180,$0BBB
	DC.W	$7109,$FFFE,$0180,$0777
	DC.W	$7209,$FFFE,$0180,$0333
	DC.W	$7309,$FFFE,$0180,$0111	
	DC.W	$7409,$FFFE,$0180,$0000
	
	DC.W	$7509,$FFFE,BPLCON0,$1200	MINI CREDITS SCREEN

	DC.W	BPLPT+$00		
CL1H	DC.W	0,BPLPT+$02
CL1L	DC.W	0

	DC.W	$7609,$FFFE,$0182,$0FFF		COLOUR EFFECT FOR CREDITS
	DC.W	$7709,$FFFE,$0182,$0BBB
	DC.W	$7809,$FFFE,$0182,$0AAA
	DC.W	$7909,$FFFE,$0182,$0777
	DC.W	$7A09,$FFFE,$0182,$0444
	DC.W	$7B09,$FFFE,$0182,$0111


	DC.W	$7B09,$FFFE,BPLCON0,$0000	END OF CREDIT SCREEN

	DC.W	$7C09,$FFFE,$0180,$0111		ANOTHER COPPERBAR
	DC.W	$7D09,$FFFE,$0180,$0333
	DC.W	$7E09,$FFFE,$0180,$0777
	DC.W	$7F09,$FFFE,$0180,$0BBB
	DC.W	$8009,$FFFE,$0180,$0FFF
	DC.W	$8109,$FFFE,$0180,$0BBB
	DC.W	$8209,$FFFE,$0180,$0777
	DC.W	$8309,$FFFE,$0180,$0333
	DC.W	$8409,$FFFE,$0180,$0111	
	DC.W	$8509,$FFFE,$0180,$0000
	DC.W	$8509,$FFFE,BPLCON0,$1200	OPEN MAIN SELECTION SCREEN

	DC.W	BPLPT+$00		
TL1H	DC.W	0,BPLPT+$02
TL1L	DC.W	0


	DC.W	$8609,$FFFE,$0182,$0000		COLOUR EFFECT FOR HEADER
	DC.W	$8709,$FFFE,$0182,$0333
	DC.W	$8809,$FFFE,$0182,$0000
	DC.W	$8909,$FFFE,$0182,$0666
	DC.W	$8A09,$FFFE,$0182,$0000
	DC.W	$8B09,$FFFE,$0182,$0999
	DC.W	$8C09,$FFFE,$0182,$0000
	DC.W	$8D09,$FFFE,$0182,$0CCC
	DC.W	$8E09,$FFFE,$0182,$0000
	DC.W	$8F09,$FFFE,$0182,$0FFF
	DC.W	$9009,$FFFE,$0182,$0000
	DC.W	$9109,$FFFE,$0182,$0CCC
	DC.W	$9209,$FFFE,$0182,$0000
	DC.W	$9309,$FFFE,$0182,$0999
	DC.W	$9409,$FFFE,$0182,$0000
	DC.W	$9509,$FFFE,$0182,$0666
	DC.W	$9609,$FFFE,$0182,$0000
	DC.W	$9709,$FFFE,$0182,$0333
	DC.W	$9809,$FFFE,$0182,$0000
	DC.W	$9A09,$FFFE,$0182,$0111
	DC.W	$9B09,$FFFE,$0182,$0000
	DC.W	$9C09,$FFFE,$0182,$0FFF

	DC.W	$FFFF,$FFFE			AND WAIT FOR THE IMPOSSIBLE!

**********

GFXNAME		DC.B	'graphics.library',0
		EVEN
DOSNAME		DC.B	'dos.library',0
		EVEN
GFXBASE		DC.L	0
DOSBASE		DC.L	0
STPOINT		DC.L	0
DMASAVE		DC.W	0
INTENSAVE	DC.W	0
INTRQSAVE	DC.W	0
		EVEN


CONHD	DC.L	0
	EVEN
CONNAM	DC.B	"CON:0/10/640/236/TECH in 1991. Please wait. Loading...",0
	EVEN
FKEY	DC.B	0
	EVEN

*	THIS IS THE LIST OF COMMANDS TO BE EXECUTED. PUT WHATEVER NAMES
*	YOU WANT IN HERE!

COM1	DC.B	"1",10,"MENU",0		<-- THIS WILL KEEP LOADING THE MENU!
	EVEN				'0'=END OF STRING. `10`= RETURN
COM2	DC.B	"2",0
	EVEN
COM3	DC.B	"3",0
	EVEN
COM4	DC.B	"4",0
	EVEN
COM5	DC.B	"5",0
	EVEN
COM6	DC.B	"6",0
	EVEN
COM7	DC.B	"7",0
	EVEN
COM8	DC.B	"8",0
	EVEN
COM9	DC.B	"9",0
	EVEN
COM10	DC.B	"10",0
	EVEN
LOGO	INCBIN	source:bitmaps/MENU2.RAW		MAIN 5BPL 78 PIX HIGH LOGO
	EVEN
TEXT	INCBIN	source:bitmaps/TEXT.RAW		MAIN MENU SCREEN
	EVEN
CREDS	INCBIN	source:bitmaps/MENUCREDS.RAW	TINY 6 PIX HIGH CREDIT SCREEN
	EVEN


**************************************
*   NoisetrackerV1.0 replayroutine   *
* Mahoney & Kaktus - HALLONSOFT 1989 *
**************************************


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

	lea	mt_samplestarts(pc),a1
	asl.l	#8,d2
	asl.l	#2,d2
	add.l	#$43c,d2
	add.l	a0,d2
	move.l	d2,a2
	moveq	#$1e,d0
mt_lop3:clr.l	(a2)
	move.l	a2,(a1)+
	moveq	#0,d1
	move.w	42(a0),d1
	asl.l	#1,d1
	add.l	d1,a2
	add.l	#$1e,a0
	dbf	d0,mt_lop3

	or.b	#$2,$bfe001
	move.b	#$6,mt_speed
	clr.w	$dff0a8
	clr.w	$dff0b8
	clr.w	$dff0c8
	clr.w	$dff0d8
	clr.b	mt_songpos
	clr.b	mt_counter
	clr.w	mt_pattpos
	rts

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

mt_music:
	movem.l	d0-d4/a0-a3/a5-a6,-(a7)
	lea	mt_data,a0
	addq.b	#$1,mt_counter
	move.b	mt_counter,D0
	cmp.b	mt_speed,D0
	blt.s	mt_nonew
	clr.b	mt_counter
	bra	mt_getnew

mt_nonew:
	lea	mt_voice1(pc),a6
	lea	$dff0a0,a5
	bsr	mt_checkcom
	lea	mt_voice2(pc),a6
	lea	$dff0b0,a5
	bsr	mt_checkcom
	lea	mt_voice3(pc),a6
	lea	$dff0c0,a5
	bsr	mt_checkcom
	lea	mt_voice4(pc),a6
	lea	$dff0d0,a5
	bsr	mt_checkcom
	bra	mt_endr

mt_arpeggio:
	moveq	#0,d0
	move.b	mt_counter,d0
	divs	#$3,d0
	swap	d0
	cmp.w	#$0,d0
	beq.s	mt_arp2
	cmp.w	#$2,d0
	beq.s	mt_arp1

	moveq	#0,d0
	move.b	$3(a6),d0
	lsr.b	#4,d0
	bra.s	mt_arp3
mt_arp1:moveq	#0,d0
	move.b	$3(a6),d0
	and.b	#$f,d0
	bra.s	mt_arp3
mt_arp2:move.w	$10(a6),d2
	bra.s	mt_arp4
mt_arp3:asl.w	#1,d0
	moveq	#0,d1
	move.w	$10(a6),d1
	lea	mt_periods(pc),a0
	moveq	#$24,d7
mt_arploop:
	move.w	(a0,d0.w),d2
	cmp.w	(a0),d1
	bge.s	mt_arp4
	addq.l	#2,a0
	dbf	d7,mt_arploop
	rts
mt_arp4:move.w	d2,$6(a5)
	rts

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

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

	lea	$dff0a0,a5
	lea	mt_voice1(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0b0,a5
	lea	mt_voice2(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0c0,a5
	lea	mt_voice3(pc),a6
	bsr.s	mt_playvoice
	lea	$dff0d0,a5
	lea	mt_voice4(pc),a6
	bsr.s	mt_playvoice
	bra	mt_setdma

mt_playvoice:
	move.l	(a0,d1.l),(a6)
	addq.l	#4,d1
	moveq	#0,d2
	move.b	$2(a6),d2
	and.b	#$f0,d2
	lsr.b	#4,d2
	move.b	(a6),d0
	and.b	#$f0,d0
	or.b	d0,d2
	tst.b	d2
	beq.s	mt_setregs
	moveq	#0,d3
	lea	mt_samplestarts(pc),a1
	move.l	d2,d4
	subq.l	#$1,d2
	asl.l	#2,d2
	mulu	#$1e,d4
	move.l	(a1,d2.l),$4(a6)
	move.w	(a3,d4.l),$8(a6)
	move.w	$2(a3,d4.l),$12(a6)
	move.w	$4(a3,d4.l),d3
	tst.w	d3
	beq.s	mt_noloop
	move.l	$4(a6),d2
	asl.w	#1,d3
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$4(a3,d4.l),d0
	add.w	$6(a3,d4.l),d0
	move.w	d0,8(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
	bra.s	mt_setregs
mt_noloop:
	move.l	$4(a6),d2
	add.l	d3,d2
	move.l	d2,$a(a6)
	move.w	$6(a3,d4.l),$e(a6)
	move.w	$12(a6),$8(a5)
mt_setregs:
	move.w	(a6),d0
	and.w	#$fff,d0
	beq	mt_checkcom2
	move.b	$2(a6),d0
	and.b	#$F,d0
	cmp.b	#$3,d0
	bne.s	mt_setperiod
	bsr	mt_setmyport
	bra	mt_checkcom2
mt_setperiod:
	move.w	(a6),$10(a6)
	and.w	#$fff,$10(a6)
	move.w	$14(a6),d0
	move.w	d0,$dff096
	clr.b	$1b(a6)

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

mt_setdma:
	move.w	#$12c,d0
mt_wait:dbf	d0,mt_wait
	move.w	mt_dmacon,d0
	or.w	#$8000,d0
	move.w	d0,$dff096
	move.w	#$12c,d0
mt_wai2:dbf	d0,mt_wai2
	lea	$dff000,a5
	lea	mt_voice4(pc),a6
	move.l	$a(a6),$d0(a5)
	move.w	$e(a6),$d4(a5)
	lea	mt_voice3(pc),a6
	move.l	$a(a6),$c0(a5)
	move.w	$e(a6),$c4(a5)
	lea	mt_voice2(pc),a6
	move.l	$a(a6),$b0(a5)
	move.w	$e(a6),$b4(a5)
	lea	mt_voice1(pc),a6
	move.l	$a(a6),$a0(a5)
	move.w	$e(a6),$a4(a5)

	add.w	#$10,mt_pattpos
	cmp.w	#$400,mt_pattpos
	bne.s	mt_endr
mt_nex:	clr.w	mt_pattpos
	clr.b	mt_break
	addq.b	#1,mt_songpos
	and.b	#$7f,mt_songpos
	move.b	mt_songpos,d1
	cmp.b	mt_data+$3b6,d1
	bne.s	mt_endr
	clr.b	mt_songpos
mt_endr:tst.b	mt_break
	bne.s	mt_nex
	movem.l	(a7)+,d0-d4/a0-a3/a5-a6
	rts

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

mt_myport:
	move.b	$3(a6),d0
	beq.s	mt_myslide
	move.b	d0,$17(a6)
	clr.b	$3(a6)
mt_myslide:
	tst.w	$18(a6)
	beq.s	mt_rt
	moveq	#0,d0
	move.b	$17(a6),d0
	tst.b	$16(a6)
	bne.s	mt_mysub
	add.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	bgt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
mt_myok:move.w	$10(a6),$6(a5)
	rts
mt_mysub:
	sub.w	d0,$10(a6)
	move.w	$18(a6),d0
	cmp.w	$10(a6),d0
	blt.s	mt_myok
	move.w	$18(a6),$10(a6)
	clr.w	$18(a6)
	move.w	$10(a6),$6(a5)
	rts

mt_vib:	move.b	$3(a6),d0
	beq.s	mt_vi
	move.b	d0,$1a(a6)

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

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

mt_checkcom:
	move.w	$2(a6),d0
	and.w	#$fff,d0
	beq.s	mt_nop
	move.b	$2(a6),d0
	and.b	#$f,d0
	tst.b	d0
	beq	mt_arpeggio
	cmp.b	#$1,d0
	beq.s	mt_portup
	cmp.b	#$2,d0
	beq	mt_portdown
	cmp.b	#$3,d0
	beq	mt_myport
	cmp.b	#$4,d0
	beq	mt_vib
	move.w	$10(a6),$6(a5)
	cmp.b	#$a,d0
	beq.s	mt_volslide
	rts

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

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

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

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

mt_checkcom2:
	move.b	$2(a6),d0
	and.b	#$f,d0
	cmp.b	#$e,d0
	beq.s	mt_setfilt
	cmp.b	#$d,d0
	beq.s	mt_pattbreak
	cmp.b	#$b,d0
	beq.s	mt_posjmp
	cmp.b	#$c,d0
	beq.s	mt_setvol
	cmp.b	#$f,d0
	beq.s	mt_setspeed
	rts

mt_setfilt:
	rts
mt_pattbreak:
	not.b	mt_break
	rts
mt_posjmp:
	move.b	$3(a6),d0
	subq.b	#$1,d0
	move.b	d0,mt_songpos
	not.b	mt_break
	rts
mt_setvol:
	cmp.b	#$40,$3(a6)
	ble.s	mt_vol4
	move.b	#$40,$3(a6)
mt_vol4:move.b	$3(a6),$8(a5)
	rts
mt_setspeed:
	move.b	$3(a6),d0
	and.w	#$1f,d0
	beq.s	mt_rts2
	clr.b	mt_counter
	move.b	d0,mt_speed
mt_rts2:rts




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

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

mt_speed:	dc.b	$6
mt_songpos:	dc.b	$0
mt_pattpos:	dc.w	$0
mt_counter:	dc.b	$0

mt_break:	dc.b	$0
mt_dmacon:	dc.w	$0
mt_samplestarts:dcb.l	$1f,0
mt_voice1:	dcb.w	10,0
		dc.w	$1
		dcb.w	3,0
mt_voice2:	dcb.w	10,0
		dc.w	$2
		dcb.w	3,0
mt_voice3:	dcb.w	10,0
		dc.w	$4
		dcb.w	3,0
mt_voice4:	dcb.w	10,0
		dc.w	$8
		dcb.w	3,0

mt_data incbin source:modules/mod.popcorn		SHORTEST ST. MOD I HAVE (30K!)
