 INCLUDE "libraries/ArpBase.i"
 INCLUDE "exec/execbase.i"
 INCLUDE "libraries/dosextens.i"

 XREF _main
 XREF _DOSBase

 XREF _LVOOpenLibrary
 XREF _LVOCloseLibrary
 XREF _LVOSetSignal
 XREF _LVOForbid
 XREF _LVOWaitPort
 XREF _LVOGetMsg
 XREF _LVOReplyMsg

 XREF _LinkerDB
 XREF __BSSBAS
 XREF __BSSLEN
 XREF _RESLEN
 XREF _RESBASE
 XREF _NEWDATAL

CALL	MACRO
	jsr _LVO\1(a6)
	ENDM

  SECTION StartCode,CODE

; arp resident tag goes here
	RESIDENT 4*1024

init:
	movem.l	d0/a0,-(sp)
	lea	_LinkerDB,a4
	movea.l	4,a6
	lea	ARPlib(pc),a1
	moveq	#39,d0
	CALL	OpenLibrary
	tst.l	d0
	bne.s	__main

	lea	DOSlib(pc),a1
	CALL	OpenLibrary
	tst.l	d0
	beq.s	bomb

	move.l	d0,a6
	CALL	Output
	move.l	d0,d1
	beq.s	bomb

	lea	Msg1(pc),a0
	move.l	a0,d2
	moveq	#Msg1Len,d3
	CALL	Write

	move.l	a6,a1
	movea.l	4,a6
	CALL	CloseLibrary
	moveq	#0,d0

bomb:
	addq.l	#8,sp
	rts

DOSlib	dc.b "dos.library",0

Msg1	dc.b "You need "
ARPlib	dc.b "arp.library",0
	dc.b " V39+",10,0
Msg1Len	EQU *-Msg1
	ds.w 0

__main:
	move.l	d0,a6
	sub.l	#_RESBASE,a4

; get mem to hold data and bss stuff
	move.l	#_RESLEN,d0
	CALL	ArpAlloc
	tst.l	d0
	bne.s	gotmem

	moveq	#20,d0
	moveq	#0,d2
	CALL	ArpExit

; get ready to copy data over into freshly alloced data area
gotmem:	move.l	d0,a0
	move.l	d0,a2

	move.l	d0,a1
	move.l	#_NEWDATAL,d0
cpy:	move.l	(a4)+,(a0)+
	subq.l	#1,d0
	bne.s	cpy

; now do the relocs for resident data
	move.l	(a4)+,d0
reloc:	beq.s	nreloc
	move.l	a1,a0
	add.l	(a4)+,a0
	add.l	(a0),a2
	move.l	a2,(a0)
	move.l	a1,a2
	subq.l	#1,d0
	bra.s	reloc

nreloc:	move.l	a1,a4
	add.l	#_RESBASE,a4

; stash some important junk away
	move.l	a6,_ArpBase(a4)
	move.l	DosBase(a6),_DOSBase(a4)
	movea.l	4,a6
	move.l	a6,_SysBase(a4)
	movem.l	sp,__StackPtr(a4)

; get address of our task
	move.l	ThisTask(a6),a3

; clear any pending signals
	moveq	#0,d0
	move.l	#$00003000,d1
	CALL	SetSignal

; check for workbench and exit fast if so
	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,d2
	beq.s	ExitToDOS

	CALL	Forbid
	movea.l	d2,a1
	CALL	ReplyMsg
	moveq	#0,d0
	bra.s	ExitToDOS

FromCLI:
	movem.l	(sp)+,d0/a0
	jsr	_main
	moveq.l	#0,d0
	bra.s	ExitToDOS

 XDEF _XCEXIT
_XCEXIT:
	move.l	4(sp),d0
 XDEF @XCEXIT
@XCEXIT:

ExitToDOS:
	move.l	_ArpBase(a4),a6
	movea.l	__StackPtr(a4),sp
	moveq	#0,d2
	CALL	ArpExit

; ---- This is a data section

   SECTION __MERGED,BSS

 XDEF _ArpBase
 XDEF _SysBase
 XDEF __StackPtr

_ArpBase    ds.b 4
_SysBase    ds.b 4
__StackPtr  ds.b 4

   END
