;:ts=8
;
; Initial startup routine for Aztec 'C' and ARP using RESIDENT.
; NB: This should allow access to all Aztec Features, math, etc.
;     Could be made smaller if only for CLI, only for Workbench,
;     Could be made smaller if only this or that.
;
; Created 02-18-88 by -+=SDB+=- from arpcrt0.s
; Copyright (c) 1988 by Scott Ballantyne, may be freely
; used by Arp Supporters/users.
; Use at your own risk.
;
; NB: References to the ___fromdisk__ long have to be handled carefully,
;     since they are somewhat shizophrenic, sometimes referring to copied
;     data, sometimes not.  Note that they should fine for the C code without
;     special handling as long as small model is used.
;
; May 9, 1988:	Move OpenLibrary() call into _main() to fix WBench Bug.
;		Add AhOhNoARP() callout for better user interface.
;
; 10-Mar-90:	Put together from resgeta4.s & arprescrt0.s for
;		Aztec 5.0 release.

	include "exec/types.i"
	include "exec/execbase.i"
	include "exec/memory.i"
	include "exec/tasks.i"
	include "exec/alerts.i"
	include "libraries/arpbase.i"
	include "exec/execbase.i"

call	macro
	xref	_LVO\1
	jsr	_LVO\1(a6)
	endm

	mc68881
	entry	.begin
	public	.begin
	public	_geta4

*	If you need more or less stack, change the first number below
*	For example, if your program only needs 4000 bytes of stack, the
*	line below would read:
*	RESIDENT 4000,__H2_end-__H1_org,loaded
*

.begin
	RESIDENT 10240,__H2_end-__H1_org,loaded
	moveq.l #0,d7			; flag resident code
	move.l	a4,a3			; copy base
	add.l	#32766,a4		; bias
	bra.s	clonedata		; and copy the data segment only
loaded: moveq.l #-1,d7			; flag not resident (start if from disk)
	far data
	move.l	d7,___fromdisk__	; needs to be set for _geta4
	near data
	bsr	_geta4
isresident:
	lea	__H1_end,a1
	lea	__H2_org,a2
	cmp.l	a1,a2			;check if BSS and DATA together
	bne	normal			; this would actually be an error.
	move.w	#((__H2_end-__H2_org)/4)-1,d1
	bmi	normal
	move.l	#0,d2

loop	move.l	d2,(a1)+		;clear out memory
	dbra	d1,loop
	bra.s	normal

clonedata:
	move.l	#((__H1_end-__H1_org)/4)-1,d1
	bmi.s	normal
	far	data
	lea	__H1_end,a1
	lea	__H2_org,a2
	cmp.l	a1,a2
	beq.s	1$
	move.l	#500,d0			; error, must be same hunk, so scram
	rts

1$:	lea.l	__H1_org,a1		; clone data and bss

	near	data
0$	move.l	(a1)+,(a3)+		; a3 set to point to base
	dbra	d1,0$

normal: move.l	sp,__savsp		; save stack pointer
	move.l	(4).w,a6		; get Exec's library base pointer
	move.l	a6,_SysBase		; put where we can get it
	movem.l d0/a0,-(sp)		; save CLI command parameters

	move.w	AttnFlags(a6),d0
	btst	#AFB_68881,d0		;check for 68881 flag in AttnFlags
	beq	1$			;skip if not
	lea	2$,a5
	call	Supervisor		;do it in supervisor mode
	bra	1$

2$	clr.l	-(sp)
	frestore (sp)+			;reset the ffp stuff
	rte				;and return

1$	jsr	__main			;call the startup stuff
	addq.l	#8,sp			;pop args
	rts				;and return

_geta4:
	far	data
	movem.l d0-d1/a0-a1/a6,-(sp)	; max safety here...
	tst.l	___fromdisk__
	bne.s	1$
	move.l	(4).w,a6
	move.l	ThisTask(a6),a0
	lea.l	TC_MEMENTRY(a0),a0
	lea.l	PMEM(pc),a1
	call	FindName
	move.l	d0,a0
	cmp.w	#2,pm_Num(a0)		; check for data
	bne.s	1$			; resident, but no data allocated.
	move.l	pm_Data(a0),a4		; get data pointer
	add.l	#32766,a4		; bias 
	bra.s	2$
1$	lea.l	__H1_org+32766,a4
2$	movem.l (sp)+,d0-d1/a0-a1/a6
	rts

PMEM	PMEM_NAME

	public	__main,__H0_org

	dseg
	
	public	_SysBase,_DOSBase,__savsp,___fromdisk__
	public	__H1_org,__H1_end,__H2_org,__H2_end

	near	data

	even

___fromdisk__:
	dc.l	0	; default is resident

	end
