
	incdir	"include:"

	include	"exec/execbase.i"
	include	"dos/dos.i"
	include	"dos/dostags.i"
	include	"lvo/LVOs.i"

main:
	move.l	(4).w,d4
	lea.l	(_dos_name,pc),a1
	moveq	#37,d0
	movea.l	d4,a6
	jsr	(_LVOOpenLibrary,a6)
	move.l	d0,d5
	bne.b	.dosok
	moveq	#RETURN_FAIL,d0
	rts

.dosok
	lea.l	(_template,pc),a0
	move.l	a0,d1
	lea.l	(_minStack,pc),a0
	move.l	a0,d2
	moveq	#0,d3
	movea.l	d5,a6
	jsr	(_LVOReadArgs,a6)
	movea.l	d0,a3


	movea.l	d4,a6
	jsr	(_LVOForbid,a6)
	move.l	#(_end-_start),d0
	moveq	#0,d1
	jsr	(_LVOAllocMem,a6)
	tst.l	d0
	bne.b	.memok
	moveq	#RETURN_FAIL,d6
	moveq	#ERROR_NO_FREE_STORE,d7
	bra.b	.exit

.memok
	lea.l	(_start,pc),a0
	movea.l	d0,a1
	movea.l	d0,a4
	move.l	#(_end-_start),d0
	jsr	(_LVOCopyMemQuick,a6)


	movea.l	d5,a1
	addq	#1,(LIB_OPENCNT,a1)
	lea.l	(newCreateProc-_start,a4),a0
	move.l	a0,d0
	movea.w	#_LVOCreateProc,a0
	jsr	(_LVOSetFunction,a6)
	move.l	d0,(oldCreateProc-_start+2,a4)


	movea.l	d5,a1
	lea.l	(newCreateNewProc-_start,a4),a0
	move.l	a0,d0
	movea.w	#_LVOCreateNewProc,a0
	jsr	(_LVOSetFunction,a6)
	move.l	d0,(oldCreateNewProc-_start+2,a4)


	movea.l	d5,a1
	lea.l	(newRunCommand-_start,a4),a0
	move.l	a0,d0
	movea.w	#_LVORunCommand,a0
	jsr	(_LVOSetFunction,a6)
	move.l	d0,(oldRunCommand-_start+2,a4)


	movea.l	(_minStack,pc),a0
	cmpa.w	#0,a0
	beq.b	.nomin
	move.l	(a0),d0
	addq	#3,d0
	andi.b	#%11111100,d0
	lea.l	(minStack-_start,a4),a1
	move.l	d0,(a1)

.nomin
	moveq	#RETURN_OK,d6
	moveq	#0,d7

.exit
	jsr	(_LVOPermit,a6)
	movea.l	d5,a6
	move.l	a3,d1
	beq.b	.noargs
	jsr	(_LVOFreeArgs,a6)

.noargs
	move.l	d7,d1
	beq.b	.noerror
	moveq	#0,d2
	jsr	(_LVOPrintFault,a6)

.noerror
	movea.l	d5,a1
	movea.l	d4,a6
	jsr	(_LVOCloseLibrary,a6)
	move.l	d6,d0
	rts

_dos_name	dc.b	'dos.library',0
_template	dc.b	'MIN/N',0
		dc.b	'$VER: MinStack 1.1 PK',0

	CNOP	0,4
_minStack	dc.l	0

;************** PATCHCODE ***********************

_start
minStack	dc.l	8000

;------------------------------------------------

	CNOP	0,4
newCreateProc:
	cmp.l	(minStack,pc),d4
	bge.b	oldCreateProc
	move.l	(minStack,pc),d4
oldCreateProc
	jmp	$BAD2FEED

;------------------------------------------------

	CNOP	0,4
newCreateNewProc:
	tst.l	d1
	bne.b	.tagsok
	moveq	#0,d0
	rts
.tagsok
	movea.l	d1,a0
.findstack
	move.l	#NP_StackSize,d0
.loop
	cmp.l	(a0),d0
	beq.b	.found
	tst.l	(a0)
	beq.b	.notfound
	cmp.l	#TAG_MORE,(a0)
	beq.b	.more
	cmp.l	#TAG_SKIP,(a0)
	beq.b	.skip
	addq	#ti_SIZEOF,a0
	bra.b	.loop
.more
	movea.l	(ti_Data,a0),a0
	bra.b	.loop
.skip
	moveq	#ti_SIZEOF,d0
	mulu	(ti_Data,a0),d0
	addq	#ti_SIZEOF,d0
	adda.l	d0,a0
	bra.b	.findstack
.found
	move.l	(ti_Data,a0),d0
	cmp.l	(minStack,pc),d0
	bge.b	.stackok
.notfound
	move.l	(minStack,pc),d0
.stackok
	move.l	d1,           -(sp)
	move.l	#TAG_MORE,    -(sp)
	move.l	d0,           -(sp)
	move.l	#NP_StackSize,-(sp)
	move.l	sp,d1
oldCreateNewProc
	jsr	$BAD2FEED					
	adda.w	#12,sp
	move.l	(sp)+,d1
	rts

;------------------------------------------------

	CNOP	0,4
newRunCommand:
	cmp.l	(minStack,pc),d2
	bge.b	oldRunCommand
	move.l	(minStack,pc),d2
oldRunCommand
	jmp	$BAD2FEED

;------------------------------------------------

	CNOP	0,4
_end

