
*
*	GC's personal Runback C initial startup procedure under AmigaDOS
* 
*	$VER: cgcback_2.s 1.2 (05.09.95)
*
*	Copyright (c) 1995 The Beet Research
*	written by Grzegorz Calkowski
*

		opt	alink
 
		incdir	"asminc:"
		include	"lvo30/exec_lib.i"
		include	"gcmacros_new.i"

		xref	_main		* Name of C program to start with.
		xref	_LinkerDB	* linker defined base value
		xref	__BSSBAS	* linker defined base of BSS
		xref	__BSSLEN	* linker defined length of BSS

		xdef	__XCEXIT	* exit(code) is standard way to leave C.
		xdef	_@_XCEXIT
		xdef	_RunBackBreak
	
		* defs & refs to the first hunk (cgcback_1)
		xdef	rb_CommandStr,rb_WBMsg,rb_RunningBack
		xref	rb_ExitSignalTask

AbsExecBase	equ	4

		SECTION	_NOMERGE,code

rb_RunningBack	lea	_LinkerDB,a4
		
		move.l	AbsExecBase.W,a6

		lea	__BSSBAS,a3		* get base of BSS
		moveq	#0,d1
		move.l	#__BSSLEN-1,d0		* get length of BSS in longwords
clr_bss		move.l	d1,(a3)+
		dbf	d0,clr_bss

		move.l	a7,stack		* Save stack ptr
		move.l	a6,_SysBase(a4)

		move.l	rb_CommandStr(pc),a0	* restore command pointer
		move.l	rb_CommandLen(pc),d0	* and command length

		jsr	_main(pc)		* call C entrypoint
		moveq	#0,d0			* set successful status
		bra.s	exit2

_XCEXIT
__XCEXIT	move.l	4(sp),d0		* extract return code

_@XCEXIT
_@_XCEXIT
exit2		move.l	stack(pc),sp		* restore stackptr
		move.l	d0,d7			* save return code

		bsr.s	_RunBackBreak

		move.l	rb_WBMsg(pc),d0
		beq.s	bye
		setexec
		call	Forbid			; NOTE! NO Permit needed!
		move.l	d0,a1			; get old message
		call	ReplyMsg		; reply it

bye		move.l	   d7,d0
just_rts	rts


_RunBackBreak	tst.b	rb_breakflag
		bne.s	just_rts
		st	rb_breakflag
		setexec
		lea	rb_ExitSignalTask,a0
		move.l	(a0)+,a1
		move.l	(a0),d0
		calljmp	Signal



stack		dc.l	0

rb_WBMsg	dc.l	0
rb_CommandStr	dc.l	0
rb_CommandLen	dc.l	0

rb_breakflag	dc.b	0


		section __MERGED,BSS	* we want to have it together with
					* the rest of data
		xdef	_NULL
		xdef	_SysBase

	
_NULL		ds.b    4	       
_SysBase	ds.b    4

		end
