EXECBASE	=4
OPENLIB		=-408
CLOSELIB	=-414
OPEN		=-30
CLOSE		=-36
READ		=-42
WRITE		=-48
ALLOCMEM	=-198
FREEMEM		=-210
EXAMINE		=-102
LOCK		=-84
UNLOCK		=-90

	bra	 MAIN_PARA
	dc.b	'$VER: MultiPlayer (MP) V2.1 D.W & M.O.N Music Player.',$0
;
; MultiPlayer V2.1 David Whittaker & Maniacs Of Noise Player.
; Bug Update...

MAIN_PARA:
	MOVEM.L	D0-D7/A0-A6,-(A7)
	BSR	INITIALISE
	BSR	BODY
	BSR	TERMINATE
	MOVEM.L	(A7)+,D0-D7/A0-A6
	move.l	#0,d0	; no error return code.
	RTS

INITIALISE:
	MOVE.L	A0,SAVECOMM
	BSR	OPENDOS
	CMP.W	#0,(ERRORFLAG)
	BEQ	I1
	RTS
I1:	BSR	OPENSCREEN
	CMP.W	#0,(ERRORFLAG)
	BEQ	I2
	BSR	CLOSEDOS
I2:	RTS

BODY:
	CMP.W	#0,(ERRORFLAG)		; ANY ERRORS ?
	BEQ	B1			; OKAY, PERFORM THE BODY
	RTS				; OK, QUIT TO THE TERMINATE PARA.
B1:	BSR	GETPARAMS		; SEE WHAT PARAMETERS ARE GIVEN
	CMP.W	#0,(ERRORFLAG)		; NO PARAMETERS GIVEN
	BEQ	DISPLAYHELP		; EXIT WITH USAGE DISPLAY
	CMP.W	#1,(ERRORFLAG)		; ONLY FILENAME
	BEQ	B2			; CHECK, ALLOC, LOAD AND PLAY.
	CMP.W	#2,(ERRORFLAG)		; FILENAME AND SONGNO GIVEN
	BEQ	B3			; CHECK, ALLOC, LOAD AND PLAY SONG.
	CMP.W	#3,(ERRORFLAG)		; CHANGE SONG.
	BEQ	B4			; CHECKPLAYER, CHANGE SONG.
	CMP.W	#9,(ERRORFLAG)
	BEQ	B9
	RTS
DISPLAYHELP:
	LEA	HELP,A0
	BSR	PRINT
	RTS
B2:	
	BSR	CHECK		; CHECK FOR ALREADY PLAYING MOD AND FILE.
	CMP.W	#1,(ERRORFLAG)	; MP ALREADY PRESENT, UNLOAD.
	BEQ	B2A		; AND REPEAT LOADING PROCESS.
	CMP.W	#2,(ERRORFLAG)	; UNKNOWN PRG. USING $6C
	BEQ	QUITT
B2B:	BSR	ALLOC
	CMP.W	#1,(ERRORFLAG)
	BEQ	ALLOCATIONPROB
	BSR	LOAD
	CMP.W	#1,(ERRORFLAG)
	BEQ	OUT
	BSR	PLAY	
	RTS
B2A:
	BSR	STOP
	BSR	UNALLOC
	BRA	B2
B3:	
	BSR	CHECK		; CHECK FOR ALREADY PLAYING MOD AND FILE.
	CMP.W	#0,(ERRORFLAG)	; MP ALREADY PRESENT, UNLOAD.
	BEQ	B3A		; AND REPEAT LOADING PROCESS.
	CMP.W	#2,(ERRORFLAG)	; UNKNOWN PRG. USING $6C
	BEQ	QUITT
	BSR	CHANGESONG
	RTS
B3A:
	LEA	NOTHINGPLAYING,A0
	BSR	PRINT
	RTS
B4:	
	BSR	STOP
	CMP.W	#0,(ERRORFLAG)
	BNE	QUITT
	BSR	UNALLOC
	RTS
B9:	
	LEA	BADCOMMAND,A0
	BSR	PRINT
QUITT:	RTS

TERMINATE:
	BSR	CLOSESCREEN
	BSR	CLOSEDOS
	RTS
	
;*******************************************************************
HELP:	DC.B	'MPlayer - V2.1 by D.Gibbs Bug Update (c)1994-5.',$A,$D
	DC.B	'©David Whittaker/Maniacs-Of-Noise Player.',$a,$d,$d
	DC.B	'Usage:',$A,$D
	DC.B	'Load        - MP -L <song> <song-no>',$A,$D
	DC.B	'Change Song - MP -S <song-no>',$A,$D
	DC.B	'Quit        - MP -Q',$A,$D,0
NOTHINGPLAYING:	
	DC.B	'No songs playing.',$A,$D,0
;********************************************************************

OPENDOS:
	MOVE.W	#0,(ERRORFLAG)
	LEA	DOSNAME,A1		; LIBRARY NAME TO OPEN
	MOVEQ	#0,D0			; ANY VERSION
	MOVE.L	EXECBASE,A6		; USE EXEC.LIBRARY
	JSR	OPENLIB(A6)		; OPEN THE LIBRARY
	MOVE.L	D0,DOSBASE		; SAVE DOS BASE
	BEQ	OPENOSERROR		; ERROR
	RTS
OPENOSERROR:
	MOVE.W	#1,(ERRORFLAG)
	RTS

OPENSCREEN:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	#CONSOLENAME,D1		; NAME (*) THE CLI SCREEN
	MOVE.L	#1005,D2		; OPEN OLD
	MOVE.L	DOSBASE,A6		; THE DOSLIBRARY
	JSR	OPEN(A6)		; "OPEN" THE CON SCREEN
	MOVE.L	D0,CONHANDLE		; SAVE CON ADDRESS
	BEQ	OPENSCREENERROR		; ERROR FOUND
	RTS
OPENSCREENERROR:
	MOVE.W	#1,(ERRORFLAG)
	RTS

CLOSESCREEN:
	MOVE.L	CONHANDLE,D1		; GET CON ADDRESS
	MOVE.L	DOSBASE,A6		; USE DOSLIBRARY
	JSR	CLOSE(A6)		; "CLOSE" THE CON SCREEN
	RTS

CLOSEDOS:
	MOVE.L	DOSBASE,A1		; GET DOSBASE
	MOVE.L	EXECBASE,A6		; USE EXEC.LIBRARY
	JSR	CLOSELIB(A6)		; CLOSE DOS LIBRARY
	RTS

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

DOSNAME:	DC.B	'dos.library',0
DOSBASE:	DC.L	0
CONSOLENAME:	DC.B	'*',0
CONHANDLE:	DC.L	0
ERRORFLAG:	DC.W	0

;****************************************************************
	
GETPARAMS:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	SAVECOMM,A0
	CMP.B	#$A,(A0)
	BEQ	OUT
	CMP.B	#'-',(A0)+
	BEQ	COMMAND
	MOVE.W	#9,(ERRORFLAG)
OUT:	RTS
COMMAND:
	BCLR	#5,(A0)
	CMP.B	#'E',(A0)
	BEQ	QUIETMODE
	CMP.B	#'L',(A0)
	BEQ	CLOAD
	CMP.B	#'S',(A0)
	BEQ	CCS
	CMP.B	#'Q',(A0)
	BEQ	UNLOAD_R
	RTS	
QUIETMODE:
	MOVE.B	#1,QM
CLOAD:
	MOVE.L	#0,SONGSTART
	ADD.L	#1,A0
	CMP.B	#32,(A0)+
	BNE	XTRAPARAM
	MOVE.L	#FILENAME,A1
CL1:	CMP.B	#$A,(A0)
	BEQ	CL22
	CMP.B	#32,(A0)
	BEQ	CL1A
	MOVE.B	(A0)+,(A1)+
	BRA	CL1
CL1A:
	MOVE.B	#0,(A1)
	ADD.L	#1,A0
	CMP.B	#$A,1(A0)
	BNE	XPE
	CLR.L	D0
	MOVE.B	(A0),D0
	SUB.L	#48,D0
	CMP.L	#9,D0
	BGT	OOR
	MOVE.L	D0,SONGSTART
CL2:	MOVE.W	#1,(ERRORFLAG)
	RTS
CL22:
	MOVE.B	#0,(A1)
	BRA	CL2
XPE:			; LOAD : XTRA PARAMTER ERROR
	MOVE.L	#0,SONGSTART
	LEA	XPI,A0
	BSR	PRINT
	BRA	CL2
OOR:			; LOAD : OUT-OF-RANGE
	MOVE.L	#0,SONGSTART
	LEA	OORT,A0
	BSR	PRINT
	BRA	CL2

CCS:			; CHANGE THE SONG
	ADD.L	#1,A0
	CMP.B	#32,(A0)
	BNE	XTRAPARAM
	ADD.L	#1,A0
	CMP.B	#$A,1(A0)
	BNE	CXPE
	CLR.L	D0
	MOVE.B	(A0),D0
	SUB.L	#48,D0
	CMP.L	#9,D0
	BGT	COOR
	cmp.l	#0,d0
	blt	COOR
	MOVE.L	D0,SONGSTART
	MOVE.W	#2,(ERRORFLAG)
	RTS	
CXPE:			; CHANGE : EXTRA PARAM ERROR
	MOVE.W	#2,(ERRORFLAG)
	MOVE.L	#0,SONGSTART
	LEA	XPI,A0
	BSR	PRINT
	BRA	CCCS
COOR:			; CHANGE : OUT OF RANGE
	MOVE.W	#2,(ERRORFLAG)
	MOVE.L	#0,SONGSTART
	LEA	OORT,A0
	BSR	PRINT
CCCS:	RTS
UNLOAD_R:
	MOVE.W	#3,(ERRORFLAG)
	RTS

XTRAPARAM:
	LEA	NEED_XTRA_PARAM,A0
	BSR	PRINT
	MOVE.W	#99,(ERRORFLAG)
	RTS
	
	
;*********************************************************************

SONGSTART:		DC.L	0
SAVECOMM:		DC.L	0
BADCOMMAND:		DC.B	'Bad or Unknown Command.',$A,$D,0
NEED_XTRA_PARAM:	DC.B	'Sorry, extra parameter required.',$a,$d,0
XPI:			DC.B	'Extra Paramter Ignored.',$A,$D,0
OORT:			DC.B	'Number out of range, number ignored.',$A,$D,0

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

CHECK:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	$6C,A0
	CMP.L	#$F00000,A0
	BGT	MPR2
	ADD.L	#$4,A0
	CMP.L	#'MP21',(A0)+
	BEQ	MPROUTINE
	LEA	UNKNOWNROUT,A0
	BSR	PRINT
	MOVE.W	#2,(ERRORFLAG)
	RTS
MPROUTINE:
	MOVE.L	(A0),MODULETYPE
	MOVE.W	#1,(ERRORFLAG)
MPR2:
	MOVE.L	#FILENAME,D1
	MOVE.L	#-2,D2
	MOVE.L	DOSBASE,A6
	JSR	LOCK(A6)
	MOVE.L	D0,LOCKHANDLE
	BEQ	FILE_NOT_FOUND
	
	MOVE.L	LOCKHANDLE,D1
	MOVE.L	#FILEINFO,D2
	MOVE.L	DOSBASE,A6
	JSR	EXAMINE(A6)
	BEQ	FILE_EXAMINE_ERROR
	
	MOVE.L	LOCKHANDLE,D1
	MOVE.L	DOSBASE,A6
	JSR	UNLOCK(A6)
		
	LEA	FILEINFO,A0
	MOVE.L	124(A0),FILESIZE
	MOVE.L	FILESIZE,D0
	CMP.L	#$C8000,D0
	BGT	FIXFILESIZE
	RTS
FIXFILESIZE:
	MOVE.L	122(A0),FILESIZE
	RTS
FILE_NOT_FOUND:
	LEA	FILENAME,A0
	BSR	PRINT
	LEA	FNF,A0
LAB1:	BSR	PRINT
	MOVE.W	#2,(ERRORFLAG)
	RTS
FILE_EXAMINE_ERROR:
	LEA	FEE,A0
	BRA	LAB1

***********************************************************

LOCKHANDLE:	DC.L	0
FILESIZE:	DC.L	0
FILEINFO:	DS.B	260
MODULETYPE:	DC.B	'----'
FILENAME:	DS.B	32
UNKNOWNROUT:	DC.B	'Something is using Interrupt 3, program aborted.'
		DC.B	$A,$D,0
FNF:		DC.B	'File not found.',$A,$D,0
FEE:		DC.B	'Unable to examine file, program aborted.',$A,$D,0

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

ALLOC:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	FILESIZE,$150020

	MOVE.L	#INT_END-INT_ST,D0	; SIZE OF INT ROUTINE
	MOVE.L	#1,D1			; ALLOC PUBLIC (FAST OR CHIP)
	MOVE.L	EXECBASE,A6
	JSR	ALLOCMEM(A6)
	MOVE.L	D0,INT_START
	BEQ	ALLOC_PROBLEM1
	
	MOVE.L	#INT_END-INT_ST,INT_SIZE

	MOVE.L	FILESIZE,D0		; SIZE OF MODULE
	MOVE.L	#2,D1			; ALLOC (CHIP)
	MOVE.L	EXECBASE,A6
	JSR	ALLOCMEM(A6)
	MOVE.L	D0,MOD_START
	BEQ	ALLOC_PROBLEM2

	MOVE.L	FILESIZE,MOD_SIZE
	RTS

ALLOC_PROBLEM1:
	MOVE.W	#1,(ERRORFLAG)
	RTS
ALLOC_PROBLEM2:
	LEA	AP2,A0
	BSR	PRINT
	MOVE.L	INT_START,D0
	MOVE.L	INT_SIZE,D1
	MOVE.L	EXECBASE,A6
	JSR	FREEMEM(A6)
	BRA	ALLOC_PROBLEM1
ALLOCATIONPROB:
	LEA	APM,A0
	BSR	PRINT
	RTS

	
;*************************************************************8

INT_START:	DC.L	0
APM:		DC.B	'Not enough memory available for interrupt routine.',$A,$D,0
AP2:		DC.B	'Not enough CHIP memory for music module available.',$A,$D,0
;		DC.B	0

;*************************************************************8

UNALLOC:
	MOVE.L	INT_START,A1
	MOVE.L	INT_SIZE,D0
	MOVE.L	EXECBASE,A6
	JSR	FREEMEM(A6)
	TST.L	D0
	BEQ	UAE1
REP1:
	MOVE.L	MOD_START,A1
	MOVE.L	MOD_SIZE,D0
	MOVE.L	EXECBASE,A6
	JSR	FREEMEM(A6)
	TST.L	D0
	BEQ	UAE2
	RTS
UAE1:
	LEA	UAE1T,A0
	BSR	PRINT
	BRA	REP1
UAE2:
	LEA	UAE2T,A0
	BSR	PRINT
	RTS
;*************************************************************	

UAE1T:	DC.B	'Cannot UnAllocate Interrupt routine.',$A,$D,0
UAE2T:	DC.B	'Cannot UnAllocate Module!!',$A,$D,0

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


LOAD:
	MOVE.W	#0,(ERRORFLAG)

	MOVE.L	#FILENAME,D1
	MOVE.L	#1005,D2
	MOVE.L	DOSBASE,A6
	JSR	OPEN(A6)
	MOVE.L	D0,FILEHANDLE
	BEQ	UNABLE_TO_OPEN_FILE
	
	MOVE.L	FILEHANDLE,D1
	MOVE.L	MOD_START,D2
	MOVE.L	#4,D3
	MOVE.L	DOSBASE,A6
	JSR	READ(A6)
	BEQ	READ_ERROR
	
	MOVE.L	MOD_START,A0
	MOVE.W	MON_ID,D0
	MOVE.L	DW_ID,D1

	CMP.W	(A0),D0
	BEQ	LOAD_MON
	CMP.L	(A0),D1
	BEQ	LOAD_DW

	LEA	UNREC,A0
	BSR	PRINT
	MOVE.W	#1,(ERRORFLAG)
	RTS
LOAD_MON:
	LEA	LOADING_MON,A0
	BSR	PRINT
	MOVE.L	#'MON.',D0
	MOVE.L	D0,MOD_T
	BRA	CONT_LOAD
LOAD_DW:
	LEA	LOADING_DW,A0
	BSR	PRINT
	MOVE.L	#'D.W.',D0
	MOVE.L	D0,MOD_T
	BRA	CONT_LOAD
CONT_LOAD:
	MOVE.L	FILEHANDLE,D1
	MOVE.L	MOD_START,D2
	ADD.L	#4,D2
	MOVE.L	FILESIZE,D3
	SUB.L	#4,D3
	MOVE.L	DOSBASE,A6
	JSR	READ(A6)
	BEQ	READ_ERROR
LOAD_CLOSE:
	MOVE.L	FILEHANDLE,D1
	MOVE.L	DOSBASE,A6
	JSR	CLOSE(A6)
	LEA	LOADED,A0
	BSR	PRINT
	RTS
UNABLE_TO_OPEN_FILE:
	MOVE.W	#1,(ERRORFLAG)
	LEA	UTOF,A0
	BSR	PRINT
	RTS
READ_ERROR:
	MOVE.W	#1,(ERRORFLAG)
	LEA	RE,A0
	BSR	PRINT
	RTS

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

FILEHANDLE:	DC.L	0
UTOF:		DC.B	'Unable to open module file.',$A,$D,0
RE:		DC.B	'Error while reading file.',$A,$D,0
UNREC:		DC.B	'Unrecognised music format, loading aborted.',$A,$D,0
LOADING_MON:	DC.B	'Maniacs-Of-Noise music file detected, loading...',0
LOADING_DW:	DC.B	'David Whittaker music file detected, loading...',0
LOADED:		DC.B	'Loaded.',$A,$D,0
		DC.B	0
DW_ID:		DC.B	$48,$E7,$F1,$FE
MON_ID:		DC.B	$4E,$FA		;$00,$2E

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

PLAY:
	LEA	MOD_T,A0
	CMP.L	#'MON.',(A0)
	BEQ	PLAY_MON
	LEA	MOD_T,A0
	CMP.L	#'D.W.',(A0)
	BEQ	PLAY_DW
	LEA	SYSTEM_FALIURE,A0
	BSR	PRINT
	BSR	UNALLOC
	MOVE.W	#1,(ERRORFLAG)
	RTS
PLAY_IT:
	MOVE.L	$6C,A1
 	MOVE.L	#INTJ,A0
	MOVE.L	A1,2(A0)

	MOVE.L	#INT_ST,A0
	MOVE.L	INT_START,A1
	MOVE.L	#INT_END-INT_ST,D0
PL1:	MOVE.B	(A0)+,(A1)+
	DBRA	D0,PL1

	MOVE.L	INT_START,A1
	MOVE.L	A1,$6C
	RTS
PLAY_MON:
	LEA	INTOS,A0
	MOVE.W	#$4,2(A0)
	CLR.L	D1
	MOVE.L	#0,D0
	MOVE.L	MOD_START,A0
	JSR	0(A0)
	MOVE.L	SONGSTART,D0
	ADD.L	#1,D0
	MOVE.L	#0,D1
	MOVE.L	MOD_START,A0
	JSR	8(A0)
	MOVE.B	#2,$BFE001
	BRA	PLAY_IT
PLAY_DW:
	LEA	INTOS,A0
	MOVE.W	#$E,2(A0)
	MOVE.L	SONGSTART,D0
	MOVE.L	MOD_START,A0
	JSR	0(A0)
	BRA	PLAY_IT

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

SYSTEM_FALIURE:	DC.B	'recoverable system error has occured.',$A,$D,0

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

CHANGESONG:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	$6C,A1
	ADD.L	#$8,A1
	MOVE.L	(A1),MOD_T
	LEA	MOD_T,A0
	CMP.L	#'MON.',(A0)
	BEQ	CHANGE_MON
	LEA	MOD_T,A0
	CMP.L	#'D.W.',(A0)
	BEQ	CHANGE_DW
	LEA	SYSTEM_FALIURE,A0
	BSR	PRINT
	MOVE.W	#1,(ERRORFLAG)
	RTS
CHANGE_MON:
	MOVE.L	$6C,A0
	ADD.L	#$2A,A0
	MOVE.L	(A0),MOD_START
	CLR.L	D1
	MOVE.L	#0,D0
	MOVE.L	MOD_START,A0
	JSR	0(A0)
	MOVE.L	SONGSTART,D0
	ADD.L	#1,D0
	MOVE.L	#0,D1
	MOVE.L	MOD_START,A0
	JSR	8(A0)
	MOVE.B	#2,$BFE001
	RTS	
CHANGE_DW:	
	MOVE.L	$6C,A0
	ADD.L	#$2A,A0
	MOVE.L	(A0),A0
	MOVE.L	SONGSTART,D0
	JSR	0(A0)
	RTS
;*****************************************************

STOP:
	MOVE.W	#0,(ERRORFLAG)
	MOVE.L	$6C,A1
	MOVE.L	A1,INT_START
	MOVE.L	$2A(A1),MOD_START
	MOVE.L	$2E(A1),MOD_SIZE
	MOVE.L	$32(A1),INT_SIZE
	
	MOVE.L	MOD_START,$150000
	MOVE.L	MOD_SIZE,$150004
	MOVE.L	INT_START,$150008
	MOVE.L	INT_SIZE,$15000C
	
	ADD.L	#$8,A1
	CMP.L	#'D.W.',(A1)
	BEQ	OFF_DW
	CMP.L	#'MON.',(A1)
	BEQ	OFF_MON
	LEA	UNKNOWN,A0
	BSR	PRINT
	MOVE.W	#9,(ERRORFLAG)
	RTS
OFF_DW:
	MOVE.L	MOD_START,A0
	JSR	$1C(A0)
	MOVE.L	INT_START,A1
	MOVE.L	$26(A1),A0
	MOVE.L	A0,$6C
	RTS
OFF_MON:
	MOVE.L	MOD_START,A0
	CLR.L	D1
	MOVE.L	#0,D0
	MOVE.L	MOD_START,A0
	JSR	0(A0)
	MOVE.L	#0,D0
	MOVE.L	#0,D1
	MOVE.L	MOD_START,A0
	JSR	8(A0)
	MOVE.L	INT_START,A1
	MOVE.L	$26(A1),A0
	MOVE.L	A0,$6C
	RTS

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

QM:		DC.B	0,0
UNKNOWN:	DC.B	'Unknown Music Module Format',$a,$d
		DC.B	'not a David Whittaker or ',$a,$d
		DC.B	'Maniacs Of Noise music module.',$A,$D,0

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

	even
PRINT:
	CMP.B	#1,QM
	BEQ	QMON
	MOVEM.L	D0-D7/A0-A6,-(A7)	; SAVE REGISTERS
	MOVE.L	A0,A1			; BACK UP PRINT ADDRESS
	MOVE.L	#0,D0			; RESET COUNTER
P1:	CMP.B	#0,(A0)+		; CHECK FOR NULL TERMINATOR
	BEQ	P2			; IF FOUND PRINT
	ADD.L	#1,D0			; ELSE ADD 1 TO COUNTER
	BRA	P1			; LOOP AROUND
P2:	MOVE.L	CONHANDLE,D1		; 
	MOVE.L	A1,D2			; MOVE BACKUP TO START
	MOVE.L	D0,D3			; SIZE OF STRING
	MOVE.L	DOSBASE,A6		; USE DOS.LIBRARY
	JSR	WRITE(A6)		; PRINT
	MOVEM.L	(A7)+,D0-D7/A0-A6	; RETURN REGISTERS
QMON:	RTS				; EXIT TO CALLING ROUTINE

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


INT_ST:
	BRA	INT1
	DC.B	'MP21'		; ROUTINUE NAME (MP10) MP V2.1
MOD_T:	DC.B	'----'		; SONG TYPE (MON./D.W.)
INT1:
	MOVEM.L	D0-D7/A0-A6,-(A7)
	MOVE.L	MOD_START(PC),A6
INTOS:	JSR	0(A6)	
	MOVE.W	#$2000,$DFF09C
	MOVEM.L	(A7)+,D0-D7/A0-A6
INTJ:	JMP	$0
MOD_START:
	DC.L	0
MOD_SIZE:
	DC.L	0
INT_SIZE:
	DC.L	0
INT_END:

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

