;  bmod ahi player small
;	by Tuomas Lukinmaa (Tumu/BFB Team)
;
;	Copyright © 1996-1997 Tuomas Lukinmaa
;	All rights reserved.
;
;	Shareware.
;
;	Read bmod.guide for more info.

	include	'libraries/ExecXREF.i'
	include	'libraries/DosXREF.i'
	include	'exec/memory.i'
	include	'dos/dos.i'
	include	'bmod.i'

	STRUCTURE	bmod_LoaderStructure,0
		APTR	ls_Dosbase
		APTR	ls_RDa
		APTR	ls_FIB
		APTR	ls_FileHandle
		APTR	ls_STDOUT
		LONG	ls_PlayerStatus
		LABEL	bmod_LoaderStructure_SIZE

	section Lataaja, code

Loader	push	d2-d7/a2-a6

	lea	LoaderStructure,a5

	move.l	$4.w,a6
	move.w	LIB_VERSION(a6),d0
	cmp.w	#37,d0
	blo	lt_TooOldKickstart

	lea	dosname,a1
	moveq	#36,d0
	call	OpenLibrary
	move.l	d0,ls_Dosbase(a5)
	beq	lt_NoDosLibrary

	move.l	d0,a6

	call	Output
	move.l	d0,ls_STDOUT(a5)

	move.l	#DOS_FILEHANDLE,d1
	moveq	#0,d2
	call	AllocDosObject
	move.l	d0,ls_FIB(a5)
	beq	lt_NoFIB

	lea	rdastring,a0
	move.l	a0,d1
	lea	rdatemp,a0
	move.l	a0,d2
	moveq	#0,d3
	call	ReadArgs
	move.l	d0,ls_RDa(a5)
	beq	lt_NoArguments

	move.l	rdatemp,d1
	move.l	#MODE_OLDFILE,d2
	call	Open
	move.l	d0,ls_FileHandle(a5)
	beq	lt_NoFileHandle

	moveq	#5-1,d5
	lea	tempmem,a2
	lea	modstruc,a3
.ReadLoop
	move.l	ls_FileHandle(a5),d1
	move.l	a2,d2
	moveq	#4*2,d3
	move.l	ls_Dosbase(a5),a6
	call	Read
	tst.l	d0
	beq	lt_OutOfData
	cmp.l	#-1,d0
	beq	lt_OutOfData

	move.l	ls_FileHandle(a5),d1
	moveq	#-8,d2
	move.l	#OFFSET_CURRENT,d3
	call	Seek

	move.l	4(a2),d0
	add.l	#8,d0
	move.l	#MEMF_PUBLIC!MEMF_CLEAR,d1
	move.l	$4,a6
	call	AllocVec
	move.l	d0,(a3)+
	beq	lt_NoModuleMem

	move.l	d0,d2
	move.l	ls_FileHandle(a5),d1
	move.l	4(a2),d3
	add.l	#8,d3
	move.l	ls_Dosbase(a5),a6
	call	Read
	tst.l	d0
	beq	lt_OutOfData
	cmp.l	#-1,d0
	beq	lt_OutOfData

	dbra	d5,.ReadLoop

	move.l	ls_FileHandle(a5),d1
	call	Close
	clr.l	ls_FileHandle(a5)

	move.l	ls_RDa(a5),d1
	call	FreeArgs
	clr.l	ls_RDa(a5)

	lea	player,a0
	move.l	a0,codeptr

	lea	banner,a0
	lea	codeptr,a1
	lea	DoRDF,a2
	lea	buff,a3
	move.l	$4,a6
	call	RawDoFmt

	lea	buff,a0
	bsr	Print

	lea	modstruc,a0
	jsr	Start
	move.l	d0,ls_PlayerStatus(a5)
	bne	CleanUp

	move.l	#SIGBREAKF_CTRL_C,d0
	move.l	$4,a6
	call	Wait

	jsr	End
	bra	CleanUp

lt_OutOfData
lt_NoFileHandle
lt_NoArguments
lt_NoFIB
	move.l	ls_Dosbase(a5),a6
	call	IoErr
	move.l	d0,d1
	moveq	#0,d2
	call	PrintFault
	bra	CleanUp

lt_NoModuleMem
	lea	nomem,a0
PrintErr
	bsr	Print

CleanUp
	moveq	#5-1,d5
	lea	modstruc,a3
	move.l	$4,a6
.FreeVecLoop
	move.l	(a3)+,a1
	call	FreeVec
	dbra	d5,.FreeVecLoop

	move.l	ls_Dosbase(a5),a6
	move.l	ls_FileHandle(a5),d1
	beq	.NoFileHandle
	call	Close
.NoFileHandle
	move.l	ls_RDa(a5),d1
	beq	.NoReadArgs
	call	FreeArgs
.NoReadArgs
	move.l	ls_FIB(a5),d2
	beq	.NoFIB
	move.l	#DOS_FILEHANDLE,d1
	call	FreeDosObject
.NoFIB
	move.l	$4,a6
	move.l	ls_Dosbase(a5),d0
	beq	.NoDosLibrary
	move.l	d0,a1
	call	CloseLibrary
.NoDosLibrary
	move.l	ls_PlayerStatus(a5),d0
Exit	pull	d2-d7/a2-a6
	rts

lt_TooOldKickstart
lt_NoDosLibrary
	move.l	#RETURN_FAIL,d0
	bra	Exit

DoRDF	move.b	d0,(a3)+
	rts

Print	move.l	a0,d1
	move.l	ls_Dosbase(a5),a6
	call	PutStr
	rts

player	include	'bmod.s'

	section	data, data

dosname	dc.b	'dos.library',0
rdastring
	dc.b	'FILENAME/A',0
	EVEN
banner	dc.b	'-BMOD AHI Player [1mBETA[0m by Tuomas Lukinmaa (Tumu/BFB Team)-',10
	dc.b	'    BMOD code: $%lx',10
	dc.b	'   ModuleInfo: $%lx',10
	dc.b	'   SampleInfo: $%lx',10
	dc.b	'  PatternInfo: $%lx',10
	dc.b	' PatternArray: $%lx',10
	dc.b	'  SampleArray: $%lx',10
	dc.b	'-Ctrl-C quits-',10,0
nomem	dc.b	'Out of memory.',10,0

	section reservi, bss
tempmem	ds.l	2
rdatemp	ds.l	1
LoaderStructure
	ds.b	bmod_LoaderStructure_SIZE
codeptr	ds.l	1
modstruc
	ds.b	bmod_ModuleStructure_SIZE
errbuff	ds.b	81
buff	ds.b	255

	END
