[net.sources] exec

geb@cadre.UUCP (06/24/84)

From km Sat Jun 23 12:17:35 1984
Received: by cadre.UUCP (4.12/3.14)
	id AA06807; Sat, 23 Jun 84 12:17:32 edt
> Date: Sat, 23 Jun 84 12:17:32 edt
> From: km (Ken Mitchum)
> Message-Id: <8406231617.AA06807@cadre.UUCP>
> To: geb
> Subject: exec()
> Status: R
>
> you can give them my version of exec.asm. make certain it has my
> name at the top, with the explanation that it only works with
> lattice C. i think the explanation is already there.
>
;execute a program.
;(c) K. Mitchum 6/84. (km@cadre).
;primitive exec routine for ms-dos.
;assumes seg fixup of Microsoft C compiler.
;(others use at your own risk.)
;
;current seg fixup results in:
;cs = one page above program segment prefix
;es = set by program, not known to o.s.
;
;in order to properly allocate memory for the new program
;we must first deallocate to the "minimum" necessary.
;we assume a worst case minimum, with the entire
;PSP segment needed, and with entire data segment needed.
;

BDOSINT	EQU	21h
ALLOC	EQU	48h	;bdos allocate segment
SETBLOCK	EQU	4Ah	;shrink alloc. segment
BDOSEXEC	EQU	4Bh

DGROUP	GROUP	DATA
DATA		SEGMENT	WORD PUBLIC 'DATA'
		ASSUME	DS:DGROUP


ENVPTR	DW		?	;pointer to environment
CMDPTR	DW		?	;pointer to command line
CMDSEG	DW		?	;data segment
FCB1PTR	DW		?	;default fcb 1 pointer
FCB1SEG	DW		?
FCB2PTR	DW		?	;default fcb 2 pointer
FCB2SEG	DW		?

FCB1		DB		0
		DB		11 DUP (?)
		DB		25 DUP (0)
FCB2		DB		0
		DB		11 DUP (' ')
		DB		25 DUP (0)

DATA		ENDS

PGROUP	GROUP	PROG
PROG		SEGMENT	BYTE PUBLIC 'PROG'
		ASSUME	CS:PGROUP
		PUBLIC	EXEC

OLDSS	DW		?
OLDSTACK	DW		?

;int exec(cmd,arg)
;char *cmd,*arg;
;
;execute the file named "cmd" with arguments "arg"
;
;NOTE: "arg" must begin with a space, due to parsing
;peculiarities of dos.
;form of "cmd" = "<drive char>:filename.ext"
;or "path/filename.ext"
;or "<drive char>:path/filename.ext"
;
;form of "arg" = whatever called program needs
;
;this model assumes environment of callee is same as caller program
;and that default blank fcbs are adequate.
;future versions may take arguments for these.
;
;returns error code (DOS manual p D-14).
; 0 = no error
; 2 = file not found
; 5 = access denied
; 8 = insufficient memory
; 10 = invalid environment
; 11 = invalid format


EXEC		PROC	NEAR
		push	bp
		push	es		;system does not yet know of data seg,etc.
		mov	ax,cs
		sub	ax,10h	;program segment prefix is one page lower
		mov	es,ax
		mov	bx,1000h	;worst case, need entire segment
		mov	ah,SETBLOCK	;"shrink" to worst case
		mov	al,0
		int	BDOSINT
		pop	es		;but reserve entire data seg
		mov	bx,1000h
		mov	ah,ALLOC	;a kludge but it works
		mov	al,0
		int	BDOSINT
		mov	bp,sp
		cli
		add	sp,4		;now get the arguments
		pop	dx		;pointer to command
		pop	cx		;pointer to argument line
		mov	sp,bp
		sti
		mov	ENVPTR,0	;empty environment for now
		mov	CMDPTR,cx
		mov	ax,ds
		mov	CMDSEG,ax
		mov	FCB1SEG,ax
		mov	FCB2SEG,ax
		mov	FCB1PTR, offset DGROUP:FCB1
		mov	FCB2PTR, offset DGROUP:FCB2
		mov	bx, offset DGROUP:ENVPTR
		push	es
		push	ds
		push	di
		push	si
		push	dx
		push	cx
		push	bx
		mov	cs:OLDSTACK,sp
		mov	cs:OLDSS,ss
		mov	ah,BDOSEXEC
		mov	al,0
		int	BDOSINT
		cli
		mov	bx,ax		;save error code
		mov	ax,cs:OLDSS
		mov	ss,ax
		mov	sp,cs:OLDSTACK
		sti
		mov	ax,bx
		jc	exec1		;if no error
		mov	ax,0
exec1:
		pop	bx
		pop	cx
		pop	dx
		pop	si
		pop	di
		pop	ds
		pop	es
		pop	bp
		ret
EXEC		ENDP


PROG		ENDS

		END