
; StormC Startupcode
; $VER StormC Startupcode 1.05 (21.02.95)

; Copyright HAAGE & PARTNER Computer GmbH

; datamodel: NEAR
; codemodel: FAR

; This startup code is not of much use because the small datamodel a6 is
; mainly created for shared library programming

	XDEF _exit
	XDEF abort__STANDARD
	XDEF _SysBase
	
	XREF _InitModules
	XREF _CleanupModules
	XREF main_
	XREF wbmain__P09WBStartup

	XREF _LinkerDB
	XREF __OFFSET
	XREF __BSSBAS
	XREF __BSSLEN
	XREF RESIDENT
	XREF _DDSIZE
	XREF _DDTABLE
	XREF __DATALEN
	
	TTL "NEAR_A6"
	
Forbid		= -132
GetMsg		= -372
ReplyMsg	= -378
WaitPort	= -384

	SECTION "startup",CODE

	NEAR a6,-1

	move.l 4.w,a6
	move.l a7,a5 		; stackframe for _exit

	move.l $114(a6),a1      ; ThisTask
	tst.l $AC(a1)
	bne .cli
	
	; Run from Workbench
	lea $5C(a1),a0
	move.l a0,-(a7)
	jsr WaitPort(a6)
	move.l (a7)+,a0
	jsr GetMsg(a6)
	move.l a6,-(a7)
	move.l d0,-(a7)
	bsr initNearData
	move.l (a7)+,StartupMessage(a6)
	move.l (a7)+,_SysBase(a6)
	move.l a5,returnAddress(a6)
	jsr _InitModules
	move.l StartupMessage(a6),-(a7)
	jsr wbmain__P09WBStartup
	addq.l #4,a7
	jsr _CleanupModules
	move.l _SysBase(a6),a4
	move.l StartupMessage(a6),-(a7)
	bsr exitNearData
	jsr Forbid(a6)
	move.l (a7)+,a1
	jsr ReplyMsg(a6)
	moveq #0,d0
	rts

.cli
	move.l a0,-(a7)
	move.l d0,-(a7)
	move.l a6,-(a7)
	bsr initNearData
	move.l (a7)+,_SysBase(a6)
	move.l a5,returnAddress(a6)
	jsr _InitModules
	jsr main_
	addq.l #8,a7
	move.l d0,-(a7)
	jsr _CleanupModules
	move.l _SysBase(a6),a4
	bsr exitNearData
	move.l (a7)+,d0
	rts

initNearData
; _SysBase is in a6, a6 gets _LinkerDB
	moveq #RESIDENT,d0
	bne .resident
	move.l #__BSSLEN,d0
	lea __BSSBAS,a0
	bra .1
.l1
	clr.l (a0)+
.1
	dbf d0,.l1
	lea _LinkerDB,a6
	rts
.resident
	; alloc DATA/BSS Hunk 
	move.l #__DATALEN,d0
	add.l #__BSSLEN,d0
	lsl.l #2,d0
	moveq #0,d1
	jsr -198(a6) ; AllocMem
	tst.l d0
	beq .nomem
	move.l d0,a4

	; copy DATA
	lea _LinkerDB,a0
	sub.l #__OFFSET,a0
	move.l d0,a1
	move.l #__DATALEN,d0
	lsl.l #2,d0
	jsr -630(a6) ; CopyMemQuick

	; reloc DATA
	move.l #_DDSIZE,d0
	lea _DDTABLE,a0
	bra .2
.l2
	move.l (a0)++,d1
	lsl.l #2,d1
	add.l a4,d1
	move.l d1,a1
	move.l (a1),d1
	add.l a4,d1
	move.l d1,(a1)
.2
	dbf d0,.l2

	; clear BSS
	move.l a4,a0
	move.l #__DATALEN,d0
	lsl.l #2,d0
	add.l d0,a0
	move.l #__BSSLEN,d0
	bra .3
.l3
	clr.l (a0)++
.3
	dbf d0,.l3

	move.l a4,a6
	add.l #__OFFSET,a6
	rts
.nomem
	move.l a5,a7
	move.l #999,d0
	rts

exitNearData
; _SysBase is in a4, is moved to a6
	moveq #RESIDENT,d0
	beq .notresident
	move.l a6,a1
	sub.l #__OFFSET,a1
	move.l #__DATALEN,d0
	add.l #__BSSLEN,d0
	lsl.l #2,d0
	move.l a4,a6
	jsr -210(a6) ; FreeMem
.notresident
	rts

	SECTION "exit",CODE

_exit
	move.l 4(a7),d0
	move.l returnAddress(a6),a7
	move.l d0,-(a7)
	jsr _CleanupModules
	move.l StartupMessage(a6),-(a7)
	move.l _SysBase(a6),a4
	jsr exitNearData
	move.l (a7)+,d2
	beq .nowb
	jsr Forbid(a6)
	move.l d2,a1
	jsr ReplyMsg(a6)
.nowb
	move.l (a7)+,d0
	rts

	SECTION "abort_STANDARD",CODE

abort__STANDARD
	move.l returnAddress(a6),a7
	move.l StartupMessage(a6),-(a7)
	move.l _SysBase(a6),a4
	jsr exitNearData
	move.l (a7)+,d2
	beq .nowb
	jsr Forbid(a6)
	move.l d2,a1
	jsr ReplyMsg(a6)
.nowb
	moveq #20,d0
	rts

	SECTION "startupd",DATA

_SysBase
	dc.l 0
returnAddress
	dc.l 0
StartupMessage
	dc.l 0

	END
