; The stuff below is some pretty basic support and initialization, and
; should be replaced easily with the includes and macros used in your
; assembly system. I don't think you'll encounter many problems when
; trying to assemble this.

	OPT	A-,M-,O+,O3-,OW-,I+,P+,S-,T+,W+,D-,X-

; Define global variable structure pointer

GP	EQUR	A5

; Equs private to initialization code

InitError	EQU	100
NormError	EQU	20

; Some LVOs & equates (can be gotten by including dos*.i & arpbase.i etc.)

_LVOArpAlloc	EQU	-384
_LVOArpAllocMem	EQU	-390
_LVOArpLock	EQU	-408
_LVOArpOpen	EQU	-396
_LVOAtol	EQU	-258
_LVOCheckAbort	EQU	-270
_LVOClose	EQU	-36
_LVOCloseDevice	EQU	-450
_LVOCloseLibrary EQU	-414
_LVODoIO	EQU	-456
_LVODelay	EQU	-198
_LVODeleteFile	EQU	-72
_LVOExamine	EQU	-102
_LVOForbid	EQU	-132
_LVOFindPort	EQU	-390
_LVOFindTask	EQU	-294
_LVOGADS	EQU	-252
_LVOInput	EQU	-54
_LVOLock	EQU	-84
_LVOOpen	EQU	-30
_LVOOpenDevice	EQU	-444
_LVOOpenLibrary	EQU	-552
_LVOOpenWorkBench EQU	-210
_LVOOutput	EQU	-60
_LVOPermit	EQU	-138
_LVOPuts	EQU	-240
_LVORawDoFmt	EQU	-522
_LVORead	EQU	-42
_LVOSeek	EQU	-66
_LVOSetProtection EQU	-186
_LVOStamptoStr	EQU	-564
_LVOStrcmp	EQU	-522
_LVOUnLock	EQU	-90
_LVOWBenchToFront EQU	-342
_LVOWrite	EQU	-48

ACCESS_READ	EQU	-2
ACCESS_WRITE	EQU	-1
ArpVersion	EQU	39
ds_Days		EQU	0
ds_Minute	EQU	4
ds_Tick		EQU	8
fib_DateStamp	EQU	$84
fib_SIZEOF	EQU	$104
FORMAT_DOS	EQU	0
IO_COMMAND	EQU	$1C
IOTV_SIZE	EQU	$28
IOTV_TIME	EQU	$20
LEN_DATSTRING	EQU	10
LN_NAME		EQU	$A
MEMF_CLEAR	EQU	$10000
MEMF_PUBLIC	EQU	1
MN_REPLYPORT	EQU	$E
MODE_NEWFILE	EQU	$3EE
MODE_OLDFILE	EQU	$3ED
OFFSET_END	EQU	1
pr_MsgPort	EQU	$5C
pr_WindowPtr	EQU	$B8
RESIDENT_MAGIC	EQU	$4AFC
ThisTask	EQU	$114
TR_SETSYSTIME	EQU	$B
TV_SECS		EQU	0

; Negative structure building macros

ALIGN	MACRO
soff	SET	soff-(soff&1)
	ENDM

STRUCT	MACRO
soff	SET	soff-\2
	ALIGN
\1	EQU	soff
	ENDM

LONG	MACRO
	ALIGN
soff	SET	soff-4
\1	EQU	soff
	ENDM

WORD	MACRO
	ALIGN
soff	SET	soff-2
\1	EQU	soff
	ENDM

BYTE	MACRO
soff	SET	soff-1
\1	EQU	soff
	ENDM

SIZE	MACRO
	ALIGN
StrcSize EQU	soff
	ENDM

; Define default variables.

soff	SET	0
	LONG	ComLineBase
	LONG	ComLineSize
	WORD	ReturnCode

; This requires A6 to be set properly! Keep track carefully or reload A6

CALL	MACRO
	JSR	_LVO\1(A6)
	ENDM

; This tells ARP's shell and resident how large a stack we require.

STACK	MACRO
	BRA.S	ResStart
	DC.W	RESIDENT_MAGIC
	DC.L	\1
	DC.L	0
ResStart:
	ENDM

; The big one.

INIT	MACRO

; Setup the stack structure (on stack for reentrability) (GP=A5, do not modify)

	LINK	GP,#StrcSize
	MOVE.L	SP,A1
ClearStackStruct:
	CLR.W	(A1)+
	CMP.L	A1,GP
	BNE	ClearStackStruct

; Initialize default variables

	MOVE.W	#InitError,ReturnCode(GP)
	MOVE.L	A0,ComLineBase(GP)
	MOVE.L	D0,ComLineSize(GP)

; Try to open ARP

	MOVE.L	$4.W,A6
	LEA	ArpName(PC),A1
	MOVEQ	#ArpVersion,D0
	CALL	OpenLibrary
	TST.L	D0
	BNE.S	OpenedOK

; Report that the ARP library could not be opened.

;	MOVEQ	#0,D0		; Already 0
	LEA	DosName(PC),A1
	CALL	OpenLibrary
	TST.L	D0
	BEQ.S	ThisIsHorrible
	MOVE.L	D0,A6
	CALL	Output
	MOVE.L	D0,D1
	BEQ.S	BackToDOS
	LEA	LibErr(PC),A0
	MOVE.L	A0,D2
	MOVEQ	#StringEnd-LibErr,D3
	CALL	Write

; Return to DOS

BackToDOS:
	MOVE.L	A6,A1
	MOVE.L	$4.W,A6
	CALL	CloseLibrary
ThisIsHorrible:
	MOVE.W	ReturnCode(GP),D0
	EXT.W	D0
	UNLK	GP
	RTS

; Support strings

	IFGE	ArpVersion-100
	FAIL "Version > 3 digits"
	ENDC

TMP	  SET	ArpVersion/10
DosName	  DC.B	'dos.library',0
LibErr	  DC.B	'you need '
ArpName	  DC.B	'arp.library',0,' V',TMP+'0',(ArpVersion-(TMP*10))+'0','+',10
StringEnd:
	CNOP	0,2

; A6 = ARP base (Do not modify A6 if you use CALL), lower error level, call user.

OpenedOK:
	MOVE.L	D0,A6
	MOVE.W	#NormError,ReturnCode(GP)
	BSR.S	UserCode
	BRA	BackToDOS
UserCode:
	ENDM
