	Section	QLaunch,CODE
	Opt	!

	Incdir	Include:
	Include	mysystem.i
	Include	lib/reqtools_lib.i
	Include	libraries/reqtools.i

CALL	MACRO	Offset,base
	IFNE	NARG-1
	Move.L	(_\2Base,PC),A6
	ENDC
	Jsr	(_LVO\1,A6)
	ENDM

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Start:	Move.L	(4).w,A6
	Move.L	A6,_EXECBase

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Sub.L	A1,A1
	CALL	FindTask
	Move.L	D0,A3
	Tst.L	(pr_CLI,A3)
	Bne.S	.FromCLI

	Lea	(pr_MsgPort,A3),A0
	CALL	WaitPort
	Lea	(pr_MsgPort,A3),A0
	CALL	GetMsg
	Move.L	D0,A1
	CALL	Forbid
	CALL	ReplyMsg
	Moveq	#0,D0
	Rts
.FromCLI
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Moveq	#0,D0
	Lea	(DOSLibrary,PC),A1
	CALL	OpenLibrary
	Move.L	D0,_DOSBase
	Beq.S	CloseDown

	Moveq	#38,D0
	Lea	(RTLibrary,PC),A1
	CALL	OpenLibrary
	Move.L	D0,_RTBase
	Beq.S	CloseDown

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	#ArgTemplate,D1
	Move.L	#_RD_Cfg,D2
	Moveq	#0,D3
	CALL	ReadArgs,DOS
	Move.L	D0,_RDArgs
	Beq.S	CloseDown

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_RD_Cfg,PC),D1
	Move.L	#MODE_OLDFILE,D2
	CALL	Open
	Move.L	D0,_CfgHandle
	Bne.S	.GotFileOk

	Move.L	#_CfgName,D1
	Move.L	(_RD_Cfg,PC),D2
	Moveq	#56,D3
	CALL	AddPart

	Move.L	#_CfgName,D1
	Move.L	#MODE_OLDFILE,D2
	CALL	Open
	Move.L	D0,_CfgHandle
	Beq.S	CloseDown

.GotFileOk	Move.L	(_CfgHandle,PC),D1
	Move.L	#_CfgFIB,D2
	CALL	ExamineFH

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_CfgFIB+fib_Size,PC),D0
	Beq.S	CloseDown

	Addq	#1,D0
	Move.L	#MEMF_CLEAR,D1
	CALL	AllocMem,EXEC
	Move.L	D0,_CfgMem
	Beq.S	CloseDown

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_CfgHandle,PC),D1
	Move.L	(_CfgMem,PC),D2
	Move.L	(_CfgFIB+fib_Size,PC),D3
	CALL	Read,DOS

	Move.L	(_CfgHandle,PC),D1
	CALL	Close
	Clr.L	_CfgHandle

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_CfgMem,PC),A0
	Move.L	A0,_RTTags+4

.FindEnd1	Move.B	(A0)+,D0
	Bne.S	.FindEnd1
	Move.L	A0,A3

.FindEnd2	Move.B	(A0)+,D0
	Bne.S	.FindEnd2
	Move.L	A0,A2

.FindEnd3	Move.B	(A0)+,D0
	Bne.S	.FindEnd3
	Move.L	A0,D1

.FindEnd4	Move.B	(A0)+,D0
	Bne.S	.FindEnd4
	Move.L	A0,_Commands

	Move.L	#_RTTags+12,D2
	CALL	StrToLong,DOS

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Lea	(_RTTags,PC),A0
	Move.L	A3,A1
	Sub.L	A3,A3
	Sub.L	A4,A4
	CALL	rtEZRequestA,RT

	Tst.L	D0
	Beq.S	CloseDown

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_Commands,PC),A0

	Subq	#1,D0
	Beq.S	.GotCommand
	Add.L	D0,D0
	Subq	#1,D0

.FindEnd5	Move.B	(A0)+,D1
	Bne.S	.FindEnd5
	DBra	D0,.FindEnd5
.GotCommand
	Move.L	A0,A2

	Cmp.B	#0,(A0)
	Beq.S	.FindEnd6
	Move.L	A0,D1

	Move.L	#ACCESS_READ,D2
	CALL	Lock,DOS
	Move.L	D0,_DirLock

	Move.L	D0,D1
	CALL	CurrentDir
	Move.L	D0,_OldDir

.FindEnd6	Move.B	(A2)+,D0
	Bne.S	.FindEnd6

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	A2,A0
	Lea	(_RD_Args,PC),A1
	Lea	(_LaunchString,PC),A3
	Lea	(.CopyChar,PC),A2
	CALL	RawDoFmt,EXEC
	Bra.S	.Launch

.CopyChar	Move.B	D0,(A3)+
	Rts

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.Launch	Move.L	#_LaunchString,D1
	Moveq	#0,D2
	CALL	SystemTagList,DOS

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
CloseDown:
	Move.L	(_OldDir,PC),D1
	Beq.S	.NoDir
	CALL	CurrentDir,DOS
.NoDir
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_DirLock,PC),D1
	Beq.S	.NoDirLock
	CALL	UnLock,DOS
.NoDirLock
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_CfgMem,PC),A1
	Cmp.L	#0,A1
	Beq.S	.NoCfgMem
	Move.L	(_CfgFIB+fib_Size,PC),D0
	Addq	#1,D0
	CALL	FreeMem,EXEC
.NoCfgMem
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_CfgHandle,PC),D1
	Beq.S	.NoCfgFile
	CALL	Close,DOS
.NoCfgFile
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_RDArgs,PC),D1
	Beq.S	.NoRDA
	CALL	FreeArgs,DOS
.NoRDA
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_RTBase,PC),A1
	Cmp.L	#0,A1
	Beq.S	.NoRT
	CALL	CloseLibrary,EXEC
.NoRT
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Move.L	(_DOSBase,PC),A1
	Cmp.L	#0,A1
	Beq.S	.NoDOS
	CALL	CloseLibrary,EXEC
.NoDOS
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
	Moveq	#0,D0
	Rts

;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
DOSLibrary:	DOSNAME
RTLibrary:	REQTOOLSNAME
ArgTemplate:	Dc.B	'CFG/A,ARGS/F',0
	Dc.B	'$VER: QLaunch 1.01 (28.5.95)',0
_CfgName:	Dc.B	'Workbench:S/QLaunchData/'
	Ds.B	32
	Even

_RTTags:	Dc.L	RTEZ_ReqTitle,0
	Dc.L	RTEZ_DefaultResponse,1
	Dc.L	RT_Underscore,'_'
	Dc.L	TAG_DONE

_EXECBase:	Dc.L	0
_DOSBase:	Dc.L	0
_RTBase:	Dc.L	0

_RDArgs:	Dc.L	0
_RD_Cfg:	Dc.L	0
_RD_Args:	Dc.L	0,0

_CfgHandle:	Dc.L	0
_CfgMem:	Dc.L	0

	Cnop	0,4
_CfgFIB:	Ds.B	fib_SIZEOF

_Commands:	Dc.L	0
_OldDir:	Dc.L	0
_DirLock:	Dc.L	0

_LaunchString:	Ds.B	1024
