 		incdir "includes:"


	INCLUDE exec/execbase.I
	IFND    EXEC_TYPES_I
	INCLUDE exec/types.i
	ENDC

	IFND EXEC_NODES_I		
	include "exec/nodes.i"		
	ENDC
	IFND EXEC_MEMORY_I
	include "exec/memory.i"
	ENDC

	IFND LIBRARIES_DOS_I
	include "libraries/dos.i"
	ENDC
	IFND LIBRARIES_DOSEXTENS_I
	include "libraries/dosextens.i"
	ENDC
	
	IFND LIBRARIES_DOS_LIB_I
	include	"libraries/dos_lib.i"
	ENDC
	
	IFND EXEC_EXEC_LIB_I
	include "exec/exec_lib.i"
	ENDC

	incdir	"asm:datamaster.library/"
	include	"datamaster.i"

	incdir	"asm:datamaster.library/"
	include	"datamaster_lib.i"


CALLBASE:	MACRO
	jsr	_LVO\1(a6)
		ENDM

NORMAL:		MACRO
	dc.b $9b,"0;31;40m"
	ENDM
		
NOIRGRAS:	MACRO
	dc.b $9b,"1;31;40m"
	ENDM
BLANCGRAS:	MACRO
	dc.b $9b,"1;32;40m"
	ENDM

NOIRSOUL:	MACRO
	dc.b $9b,"4;31;40m"
	ENDM
BLANCSOUL:	MACRO
	dc.b $9b,"4;32;40m"
	ENDM

NOIRITAL:	MACRO
	dc.b $9b,"3;31;40m"
	ENDM


;TESTING=1


	section	DMControl,code


run:	bsr.w	OPENLIBS
	beq.w	_nolibs

	move.l	_DMbase,a5
	move.l	dmb_dosbase(a5),_dosbase

	CALLDOS Output
	move.l	d0,output

	IFND	TESTING
	bsr	Do_Readargs

	move.l	_S,d0
	cmp.l	#5000,d0
	beq.s	.nochg
	move.l	_S,a0
	move.l	(a0),_S
.nochg:
	move.l	_TI,d0		;Recognizer Info (opt:all)
	bne.w	do_TI

	move.l	_FI,d0		;File Info
	bne.w	do_FI

	move.l	_SD,d0		;Scan Dir (opt=*/name)
	bne.w	do_SD

	move.l	_AD,d0		;Add Dir (opt=*/name)
	bne.w	do_AD

	move.l	_RT,d0		;Remtype (opt=all)
	bne.w	do_RT

	move.l	_AT,d0		;Addtype=>possible multiple
	bne.w	do_AT

	move.l	_AF,d0		;Add RecoFile =>1 only
	bne.w	do_AF

	move.l	_TFS,d0		;Testfile (uses also XPK & SIZE as parameters)
	bne.w	do_TF

	move.l	_L,d0		;LIST (last coz' can be an OPTION in fact
	bne.s	do_L


	ENDC
;	bra	do_SD

OUT:	bsr	Do_FreeArgs
	bsr	CLOSELIBS
_nolibs:moveq	#0,d0
	rts

PREOUT:	move.l	_L,d0
	bne.s	do_L
	bra	OUT

version_string:
	dc.b	"$VER: Datamaster Control v1.1 (16 July 1996) by The Cyborg/NGC",0
	even
;--------------------------------------------------------------------------
;				Sub branches
;--------------------------------------------------------------------------

;List
;********
do_L:
	CALLDM dmLockPrefs
	lea	rlist,a0
	CALLDM dmQueryRecoNames

	lea	ftypes,a0
	lea	PC_Array,a1
	moveq	#0,d0
	move.w	rlist+rl_Numrecos,d0
	move.l	d0,(a1)+
	bsr	WRITEC

	lea	rlist+rl_recolist,a4
.loop:	move.l	(a4)+,d0
	bne.s	.ok
	CALLDM dmUnLockPrefs
	BRA	OUT
.ok:	move.l	d0,a0
	bsr	_Write
	lea	return,a0
	bsr	_Write
	bra.s	.loop
	

;Reco info
;**********
do_TI:	CALLDM dmLockPrefs
	move.l	_TI,a0
	lea	alltxt,a1
	CALLDM	dmCmpStringNC
	tst.l	d0
	beq.s	.all

	move.l	_TI,a0
	sub.l	a1,a1
	CALLDM	dmGetRecoAddr
	tst.l	d0
	beq	do_NOTFOUNDulock

.another:
	move.l	d0,a0
	bsr	PrintUnit

	move.l	_TI,a0
	move.l	d0,a1
	CALLDM	dmGetRecoAddr
	tst.l	d0
	bne.s	.another

	CALLDM dmUnLockPrefs
	bra	OUT

.all:	lea	rlist,a0
	CALLDM dmQueryRecoList

	lea	reconbs,a0
	lea	PC_Array,a1
	moveq	#0,d0
	move.w	rlist+rl_Numrecos,d0
	move.l	d0,(a1)+
	bsr	WRITEC

	lea	rlist+rl_recolist,a4
.loop:	move.l	(a4)+,d0
	bne.s	.ok
	CALLDM dmUnLockPrefs
	BRA	OUT
.ok:	move.l	d0,a0
	bsr	PrintUnit
	bra.s	.loop

;File info
;**********
do_FI:	move.l	_FI,a0
	CALLDM	dmReadRecoFile
	tst.l	d0
	beq	do_NOTFOUND
	move.l	d0,-(sp)
	lea	FileOutput,a0
	lea	PC_Array,a1
	move.l	_FI,(a1)
	bsr	WRITEC
	move.l	(sp)+,a0
	bsr	PrintUnit

	CALLDM	dmFreeRecoFile
	bra	OUT


;scandir
;**********
do_SD:
	move.l	_SD,a0
	move.b	(a0),d0
	cmp.b	#"*",d0
	bne.s	.ok
	sub.l	a0,a0
.ok:	CALLDM	dmScanRecoDir
	bra	PREOUT

;AddDir
;**********
do_AD:
	move.l	_AD,a0
	move.b	(a0),d0
	cmp.b	#"*",d0
	bne.s	.ok
	sub.l	a0,a0
.ok:	CALLDM	dmAddRecoDir
	bra	PREOUT


;REMTYPE
;**********
do_RT:	move.l	_RT,a0
	CALLDM	dmRemRecoName
	bra	PREOUT

;AddRecoFile
;**********
do_AF:	move.l	_AF,a0
	CALLDM	dmAddRecoFile
	bra	PREOUT


;AddRecoName:
;**********
do_AT:	move.l	_AT,a0
	CALLDM	dmAddRecoName
	bra	PREOUT

;TestFile
;**********
do_TF:	move.l	_TFS,a0
.loo:	move.l	(a0)+,d0
	beq.w	OUT
	move.l	d0,_TF
	move.l	a0,-(sp)
	bsr.s	.do
	move.l	(sp)+,a0
	bra.s	.loo

.do:	move.l	_TF,a0							;name
	move.l	#recoF_checkpatt,d1
	move.l	_XPK,d0
	beq.s	.norm
.xpk:	add.l	#recoF_xpkload,d1					;flags
.norm:	move.l	_NC,d0
	bne.s	.norm2
	add.l	#recoF_checkdata,d1					;DATAcheck
.norm2:	move.l	_S,d0							;size
	CALLDM	dmTestFile
	tst.l	d0
	beq.s	.retzero
	move.l	d0,.handle
	move.l	d0,a0
	move.l	dmh_String(a0),d0
.ok:	move.l	_SN,d1
	beq.s	.long
	move.l	_TF,d1
	move.l	d0,-(sp)
	move.l	dmb_dosbase(a5),a6
	CALLBASE Filepart	
	lea	PC_Array,a1
	move.l	d0,(a1)+
	move.l	(sp)+,d0
	bra.s	.short
.long:	lea	PC_Array,a1
	move.l	_TF,(a1)+
.short:	move.l	d0,(a1)
	lea	Ftypetxt,a0
	bsr	WRITEC

	move.l	.handle,d0
	cmp.l	#ferrtxt,d0
	bne.s	.freehandle
	rts
.freehandle:
	move.l	d0,a0
	JMPDM	dmFreeDMHandle
	
	
.retzero:
	move.l	#ferrtxt,d0
	move.l	d0,.handle
	bra.s	.ok		
.handle:dc.l	0
	
do_NOTFOUNDulock:
	CALLDM dmUnLockPrefs
do_NOTFOUND:
	lea	Notfoundtxt,a0
	bsr	_WRITE
	bra	OUT

PrintUnit:			;a0=Unitadr (segment)	;SAVES ALL REGS
	movem.l	a0-a6/d0-d7,-(sp)
	bsr.s	.do
	movem.l	(sp)+,a0-a6/d0-d7
	rts
.do:	move.l	a0,a4		;BUFF
	lea	PC_Array,a3

	move.l	a4,a0
	move.l	#DMR_Name,d0
	CALLDM	dmGetDMR_Tag
	move.l	d0,(a3)+	;name

	move.l	a4,a0
	move.l	#DMR_Version,d0
	CALLDM	dmGetDMR_Tag
	move.l	d0,d1
	swap	d0
	and.l	#$ffff,d0
	move.l	d0,(a3)+	;ver
	and.l	#$ffff,d1
	move.l	d1,(a3)+	;rev

	move.l	a4,a0
	move.l	#DMR_Pri,d0
	CALLDM	dmGEtDMR_Tag
	move.l	d0,(a3)+	;pri

	move.l	a4,a0
	move.l	#DMR_Reconumber,d0
	CALLDM	dmGetDMR_Tag
	move.l	d0,(a3)+	;reconb

	move.l	a4,a0
	move.l	#DMR_Descr,d0
	CALLDM	dmGetDMR_Tag
	move.l	d0,(a3)+	;descr

	move.l	a4,a0
	move.l	#DMR_Flags,d0
	CALLDM	dmGetDMR_Tag
	move.l	#RecoB_Internal,d1
	lea	Internaltxt,a0
	bsr	.insert
	move.l	#RecoB_checkpatt,d1
	lea	checkpatttxt,a0
	bsr	.insert
	move.l	#RecoB_checkdata,d1
	lea	checkdatatxt,a0
	bsr	.insert
	move.l	#RecoB_Disabled,d1
	lea	disabledtxt,a0
	bsr	.insert
	move.l	#RecoB_GetName,d1
	lea	getnametxt,a0
	bsr	.insert
	move.l	#RecoB_NoCopy,d1
	lea	nocopytxt,a0
	bsr	.insert
	move.l	#RecoB_DupString,d1
	lea	dupstringtxt,a0
	bsr	.insert

	lea	UnitOutput,a0
	bsr	WRITEC

	move.l	_PATT,d0
	bne.s	.patt
	rts
.patt:	move.l	a4,a0	
	move.l	#DMR_Pattern,d0
	CALLDM	dmGetDMR_Tag
	tst.l	d0
	bne.s	.pattOn
	rts
.patton:lea	PattTxt0,a0		;header
	bsr	_WRITE

	move.l	d0,a4
.loop:	move.l	a4,PC_array
	lea	PattTxt,a0
	bsr	WRITEC
.seekZ:	tst.b	(a4)+
	bne.s	.seekZ
	move.b	(a4),d0
	cmp.b	#$ff,d0
	bne.s	.loop
	rts

.insert:
	btst	d1,d0
	bne.s	.on
	lea	nothing,a0
.on:	move.l	a0,(a3)+
	rts

_Write:				;a0=string (PRESERVES *ALL* REGS)
	movem.l	a0-a6/d0-d7,-(sp)
	bsr.s	.do
	movem.l	(sp)+,a0-a6/d0-d7
	rts
.do:	move.l	a0,a1
.loop:	move.b	(a1)+,d0
	bne.s	.loop
	subq	#1,a1
	sub.l	a0,a1
	move.l	a1,d3		;length
	move.l	a0,d2		;beginning
	move.l	Output,d1
	IFND	TESTING
	CALLDOS	WRITE
	ENDC
	rts
;----------------------------------------------------------------------------
;				Misc/Startup routines
;----------------------------------------------------------------------------
DO_READARGS:
	move.l	#args_template,d1
	move.l	#Myargs,d2
	moveq	#0,d3
	CALLDOS	ReadArgs
	move.l	d0,ArrayAdr
	rts

DO_FREEARGS:
	move.l	ArrayAdr,d1
	CALLDOS	FreeArgs
	rts

Openlibs:
	lea	DM_name,a1
	moveq	#0,d0
	CALLEXEC Openlibrary
	move.l	d0,_DMbase
	rts

Closelibs:
	move.l	_dmbase,a1
	move.l	a1,d0
	bne.s	.do
	rts
.do:	CALLEXEC Closelibrary
	rts

arrayadr:
	dc.l	0


myargs:
_L:	dc.l	0	;dc.b	"L=LIST/K/S,"
_PATT:	dc.l	0	;dc.b	"PATT=K/S,"		;switch for RI/FI =>prints out patterns...
_RT:	dc.l	0	;dc.b	"RR=REMTYPE/K,"		;remove a recognizer (in mem)
_AT:	dc.l	0	;dc.b	"AR=ADDTYPE/K,"		;add (multiple) files [ex:DUMMY=>DUMMY.patt+DUMMY.data+DUMMY.myreco etc]
_AF:	dc.l	0	;dc.b	"AF=ADDFILE/K,"		;add one file [ex:DUMMY.patt]
_AD:	dc.l	0	;dc.b	"AD=ADDDIR/K,"		;add dir
_SD:	dc.l	0	;dc.b	"SD=SETDIR/K,"		;same but frees previous recos before
_TFS:	dc.l	0	;dc.b	"TF=TESTFILE/K,"	;testfile()
_XPK:	dc.l	0	;dc.b	"XPK/K/S,"		;switch for testfile
_S:	dc.l	5000	;dc.b	"SIZE/K/N,"		;size for tesfile
_NC:	dc.l	0	;dc.b	"NC=NODATACHECK/K/S,"	;switch
_SN:	dc.l	0	;dc.b	"SN=SHORTNAME/K/S"	;switch for short filename
_TI:	dc.l	0	;dc.b	"RI=TYPEINFO/K,"	;info on recognizer (may be ALL)
_FI:	dc.l	0	;dc.b	"FI=FILEINFO/K,"	;same but we'll loadseg it. (no ALL)

fsize:	dc.l	0

_TF:	dc.l	0	;CURRENT file!! (NOT a ReadArgs param!!)

PRINTC:			;IN:		a0=format string
			;**PRESERVES ALL REGS**

	movem.l	a0-a6/d0-d7,-(sp)
	bsr.s	.do
	movem.l	(sp)+,a0-a6/d0-d7
	rts

.do:	lea	PC_array,a1
	lea	PC_buff,a2
.ok:	move.l	a2,a3
	lea	.putch,a2
	CALLEXEC RawDoFmt
	rts
.putch:	move.l	a3,PC_adr
	move.b	d0,(a3)+
	rts

WRITEC:			;constructs stuff (same IN as PRINTC) AND outputs it.
	bsr	PRINTC
	lea	PC_BUFF,a0
	bra	_WRITE

_dmbase:
	dc.l	0
_dosbase:
	dc.l	0

			section "stuff",data


DM_name:	dc.b	"datamaster.library",0

FileOutput:
	dc.b	10
	NOIRGRAS
	dc.b	"FILE : "
	BLANCGRAS
	dc.b	">>  %s <<",10
	NORMAL
	dc.b	0
Unitoutput:
	dc.b	10
	NOIRGRAS
	dc.b	"Recognizer:"
	NORMAL
	BLANCGRAS
	dc.b	"%s"
	NORMAL
	dc.b	" (%ld.%ld),Pri=%ld [%ld SubRecos]",10
	NOIRGRAS
	dc.b	"Description:"
	NORMAL
	dc.b	"%s",10
	NOIRGRAS
	dc.b	"Flags:"
	NORMAL
	dc.b	"%s %s %s %s %s %s %s",10,10
	dc.b	0

Ftypes:	dc.b	10
	NOIRSOUL
	dc.b	">>%ld<< Filetypes available:",10,10
	NORMAL
	dc.b	0

reconbs:dc.b	10
	NOIRSOUL
	dc.b	">>%ld<< Recognizers in memory",10,10
	NORMAL
	dc.b	0

pattTxt0:
	NOIRSOUL
	dc.b	"Pattern Matches:"
	NORMAL
	dc.b	10,0
PattTxt: dc.b	"        --> '%s'",10,0

return:	dc.b	10
nothing:dc.b	0

internaltxt:
	dc.b	"INTERNAL",0
checkdatatxt:
	dc.b	"CHECKDATA",0
checkpatttxt:
	dc.b	"CHECKPATTERN",0	
disabledtxt:
	dc.b	"DISABLED",0
getnametxt:
	dc.b	"GETNAME",0
nocopytxt:
	dc.b	"NOCOPY",0
dupstringtxt:
	dc.b	"DUPSTRING",0


alltxt:	dc.b	"All",0
notfoundtxt:
	BLANCGRAS
	dc.b	"Unknown Recognizer/file!"
	NORMAL
	dc.b	10,10,0

ferrtxt:dc.b "File/Load Error",0

ftypetxt:
	NORMAL
	dc.b	"File "
	NOIRGRAS
	dc.b	"%s :"
	BLANCGRAS
	dc.b	"<< %s >>"
	NORMAL
	dc.b 10,0

		
args_template:
	dc.b	"L=LIST/K/S,"
	dc.b	"PATT=K/S,"		;switch for RI/FI =>prints out patterns...
	dc.b	"RT=REMTYPE/K,"		;remove a recognizer (in mem)
	dc.b	"AT=ADDTYPE/K,"		;add (multiple) files [ex:DUMMY=>DUMMY.patt+DUMMY.data+DUMMY.myreco etc]
	dc.b	"AF=ADDFILE/K,"		;add one file [ex:DUMMY.patt]
	dc.b	"AD=ADDDIR/K,"		;add dir
	dc.b	"SD=SCANDIR/K,"		;same but frees previous recos before
	dc.b	"TF=TESTFILES/K/M,"	;testfile()
	dc.b	"XPK/K/S,"		;switch for testfile
	dc.b	"S=SIZE/K/N,"		;size for loading (default=-1 :-)
	dc.b	"NC=NODATACHECK/K/S,"	;switch
	dc.b	"SN=SHORTNAME/K/S,"	;switch for short filename
	dc.b	"TI=TYPEINFO/K,"	;info on recognizer (may be ALL)
	dc.b	"FI=FILEINFO/K,"	;same but we'll loadseg it. (no ALL)
	dc.b	0

			section	"blanks",BSS

output:	ds.l	1

rlist:	ds.b	rl_sizeof	;recolist

PC_adr:	ds.l	1
PC_Array:
	ds.l	30
PC_buff:ds.b	1024







