	opt	AMIGA

	include	exec/alerts.i
	include	libraries/errormsg.i
	include	libraries/errormsg_lib.i
	include	utility/utility_lib.i

Start	lea	DOS.Name(pc),a1
	move.l	#37,d0
	move.l	4.w,a6
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,DOS.Base
	bne.s	DOSOpened
	move.l	#AT_Recovery!AG_OpenLib!AO_DOSLib,d7
	jmp	_LVOAlert(a6)
DOSOpened	
	lea	ErrorMsg.Name(pc),a1
	moveq	#1,d0
	jsr	_LVOOpenLibrary(a6)
	move.l	d0,ErrorMsg.Base
	bne.s	ErrorMsgOpened
	move.l	#NoErrorMsg.MSG,d1
	move.l	DOS.Base(pc),a6
	jsr	_LVOPutStr(a6)
	bra	CloseDOS

ErrorMsgOpened
	move.l	DOS.Base(pc),a6
	move.l	#Args.Template,d1
	move.l	#Args.Array,d2
	moveq	#0,d3
	jsr	_LVOReadArgs(a6)
	move.l	d0,Args.RDArgs
	bne.s	ArgsRead

	jsr	_LVOIoErr(a6)
	move.l	#ERMSYS_DOS,d1
	move.l	#ERMSUB_IoErr,d2
	lea	ReadArgsFailed.MSG(pc),a0
	move.l	ErrorMsg.Base(pc),a6
	jsr	_LVOPutErrorMsg(a6)
	bra	CloseErrorMsg

ArgsRead
	lea	SystemTranslation.Array(pc),a1
	move.l	Args.Array(pc),a0
	bsr	TranslateWord
	cmp.l	#-1,d0
	bne.s	SystemOK
	move.l	#UnknownSystem.MSG,d1
	move.l	DOS.Base(pc),a6
	jsr	_LVOPutStr(a6)
	lea	SystemTranslation.Array(pc),a2
	bsr	PrintList
	move.l	#SubAvailable.MSG,d1
	jsr	_LVOPutStr(a6)
	lea	SubSystemTranslation.Array(pc),a2
	bsr	PrintList
	bra.s	ErrorWritten

SystemOK
	move.l	d0,d3
	lea	SubSystemTranslation.Array(pc),a1
	move.l	Args.Array+8(pc),d0
	beq.s	SubOK
	move.l	d0,a0
	bsr.s	TranslateWord
	cmp.l	#-1,d0
	bne.s	SubOK
	moveq	#ERMSUB_Generic,d0

SubOK	move.l	d0,d2
	move.l	d3,d1
	move.l	Args.Array+4(pc),a0
	move.l	(a0),d0
	suba.l	a0,a0
	move.l	ErrorMsg.Base(pc),a6
	jsr	_LVOPutErrorMsg(a6)
	tst.l	d0
	bne.s	ErrorWritten
	move.l	#UnavailableCode.MSG,d1
	move.l	DOS.Base(pc),a6
	jsr	_LVOPutStr(a6)

ErrorWritten
	move.l	Args.RDArgs(pc),d1
	move.l	DOS.Base(pc),a6
	jsr	_LVOFreeArgs(a6)
CloseErrorMsg
	move.l	ErrorMsg.Base(pc),a1
	move.l	4.w,a6
	jsr	_LVOCloseLibrary(a6)
CloseDOS
	move.l	DOS.Base(pc),a1
	move.l	4.w,a6
	jmp	_LVOCloseLibrary(a6)

TranslateWord	; Result=TranslateWord(String,CompArray)(A0,A1)
	move.l	ErrorMsg.Base(pc),a6
	move.l	emb_UtilityBase(a6),a6
	move.l	a0,a2
	move.l	a1,a3
.Loop	move.l	(a3)+,d0
	move.l	(a3)+,d2
	cmp.l	#-1,d0
	beq.s	.NotFound
	add.l	#KW,d0
	move.l	d0,a1	; string1=Known one (stored in increasing order)
	move.l	a2,a0	; string2=Unknown one (argument)
	jsr	_LVOStricmp(a6)
	tst.l	d0
	bgt.s	.Loop
	bne.s	.NotFound
	move.l	d2,d0
	rts
.NotFound
	moveq	#-1,d0
	rts

PrintList	; PrintList(List)(A2)
	move.l	DOS.Base(pc),a6
.Loop	cmp.l	#-1,(a2)
	beq.s	.Finished
	move.l	(a2),d1
	add.l	#KW,d1
	jsr	_LVOPutStr(a6)
	move.l	#LF,d1
	jsr	_LVOPutStr(a6)
	addq.l	#8,a2
	bra.s	.Loop
.Finished
	rts

SystemTranslation.Array
	dc.l	AMIGAGUIDE-KW,ERMSYS_AMIGAGUIDE		; sorted list
	dc.l	ARP-KW,ERMSYS_ARP
	dc.l	AUDIO-KW,ERMSYS_AUDIO
	dc.l	CLIPBOARD-KW,ERMSYS_CLIPBOARD
	dc.l	COMMODITIES-KW,ERMSYS_COMMODITIES
	dc.l	CONSOLE-KW,ERMSYS_CONSOLE
	dc.l	DATATYPES-KW,ERMSYS_DATATYPES
	dc.l	DISKFONT-KW,ERMSYS_DISKFONT
	dc.l	DOS-KW,ERMSYS_DOS
	dc.l	ERRORMSG-KW,ERMSYS_ERRORMSG
	dc.l	EXEC-KW,ERMSYS_EXEC
	dc.l	EXPANSION-KW,ERMSYS_EXPANSION
	dc.l	GADTOOLS-KW,ERMSYS_GADTOOLS
	dc.l	GAMEPORT-KW,ERMSYS_GAMEPORT
	dc.l	GRAPHICS-KW,ERMSYS_GRAPHICS
	dc.l	IFFPARSE-KW,ERMSYS_IFFPARSE
	dc.l	INPUT-KW,ERMSYS_INPUT
	dc.l	INTUITION-KW,ERMSYS_INTUITION
	dc.l	KEYBOARD-KW,ERMSYS_KEYBOARD
	dc.l	NARRATOR-KW,ERMSYS_NARRATOR
	dc.l	PARALLEL-KW,ERMSYS_PARALLEL
	dc.l	POWERPACKER-KW,ERMSYS_POWERPACKER
	dc.l	PRINTER-KW,ERMSYS_PRINTER
	dc.l	SCSIDISK-KW,ERMSYS_SCSIDISK
	dc.l	SERIAL-KW,ERMSYS_SERIAL
	dc.l	TIMER-KW,ERMSYS_TIMER
	dc.l	TRACKDISK-KW,ERMSYS_TRACKDISK
	dc.l	TRANSLATOR-KW,ERMSYS_TRANSLATOR
	dc.l	-1

SubSystemTranslation.Array
	dc.l	CXBROKER-KW,ERMSUB_CxBroker
	dc.l	CXOBJERROR-KW,ERMSUB_CxObjError
	dc.l	FAULT-KW,ERMSUB_Fault
	dc.l	IOERR-KW,ERMSUB_IoErr
	dc.l	MAKEVPORT-KW,ERMSUB_MakeVPort
	dc.l	MATCHFIRST-KW,ERMSUB_MatchFirst
	dc.l	MATCHNEXT-KW,ERMSUB_MatchNext
	dc.l	MRGCOP-KW,ERMSUB_MrgCop
	dc.l	NOMEMORY-KW,ERMSUB_NoMemory
	dc.l	OPENSCREEN-KW,ERMSUB_OpenScreen
	dc.l	OPENSCREENTAGLIST-KW,ERMSUB_OpenScreenTagList
	dc.l	-1

DOS.Base	dc.l	0
ErrorMsg.Base	dc.l	0

Args.RDArgs	dc.l	0
Args.Array	dc.l	0,0,0

DOS.Name	dc.b	'dos.library',0
ErrorMsg.Name	dc.b	'errormsg.library',0

NoErrorMsg.MSG	dc.b	'You need errormsg.library V1.0+ in your LIBS: directory.',10,0
ReadArgsFailed.MSG	dc.b	'ReadArgs() failed',0
UnknownSystem.MSG	dc.b	'Unknown system, currently available are:',10,0
SubAvailable.MSG	dc.b	10,'Known Subsytems (any other for ERMSUB_Generic):',10,0
UnavailableCode.MSG	dc.b	'Unavailable code !'
LF	dc.b	10,0

Args.Template	dc.b	'SYSTEM/A,CODE/N/A,SUBSYSTEM',0

KW	; base of keywords (relative displacements avoid too big Reloc tables)

; ******************** System identificators ***********************
DOS	dc.b	'dos',0
EXEC	dc.b	'exec',0
GRAPHICS	dc.b	'graphics',0
INTUITION	dc.b	'intuition',0
IFFPARSE	dc.b	'iffparse',0
AUDIO	dc.b	'audio',0
GAMEPORT	dc.b	'gameport',0
NARRATOR	dc.b	'narrator',0
PARALLEL	dc.b	'parallel',0
PRINTER	dc.b	'printer',0
SCSIDISK	dc.b	'scsidisk',0
SERIAL	dc.b	'serial',0
TRACKDISK	dc.b	'trackdisk',0
CLIPBOARD	dc.b	'clipboard',0
CONSOLE	dc.b	'console',0
INPUT	dc.b	'input',0
KEYBOARD	dc.b	'keyboard',0
TIMER	dc.b	'timer',0
AMIGAGUIDE	dc.b	'amigaguide',0
ARP	dc.b	'arp',0
COMMODITIES	dc.b	'commodities',0
ERRORMSG	dc.b	'errormsg',0
EXPANSION	dc.b	'expansion',0
GADTOOLS	dc.b	'gadtools',0
POWERPACKER	dc.b	'powerpacker',0
TRANSLATOR	dc.b	'translator',0
DATATYPES	dc.b	'datatypes',0
DISKFONT	dc.b	'diskfont',0

; ********************* Subsystem identificators *******************
IOERR	dc.b	'ioerr',0
MATCHFIRST	dc.b	'matchfirst',0
MATCHNEXT	dc.b	'matchnext',0
FAULT	dc.b	'fault',0
NOMEMORY	dc.b	'nomemory',0
MAKEVPORT	dc.b	'makevport',0
MRGCOP	dc.b	'mrgcop',0
OPENSCREEN	dc.b	'openscreen',0
OPENSCREENTAGLIST	dc.b	'openscreentaglist',0
CXBROKER	dc.b	'cxbroker',0
CXOBJERROR	dc.b	'cxobjerror',0
