summaryrefslogtreecommitdiff
path: root/v4.0/src/MAPPER/EXECPGM.ASM
blob: 738b95083fb8878fe451bb965d43d33573e6ee97 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
;
page 60,132
;
title CP/DOS  DOSExecPrg  mapper

buffer	segment word public 'buffer'
			public	DosExecPgmCalled
DosExecPgmCalled	db	0			  ;????????????
			public	DosExecPgmReturnCode
DosExecPgmReturnCode	dw	0

DosExecParameterBlock	label	word
EnvironmentSegment	dw	0
ArgumentPointer 	dd	0
Default_5C_FCB		dd	0
Default_6C_FCB		dd	0

buffer	ends

dosxxx	segment byte public 'dos'
	assume	cs:dosxxx,ds:nothing,es:nothing,ss:nothing
;
; ************************************************************************* *
; *
; *	 MODULE: DosExecPgm
; *
; *	 FUNCTION:  Allows a program to execute another program
; *
; *	 CALLING SEQUENCE:
; *
; *		push	Asyncindic	; execute asynchronously
; *		push	TraceIndic	; trace process
; *		push	Argpointer	; address of arguments string
; *		push	Envpointer	; address of environment string
; *		push	Processid	; address to put process id
; *		push	PgmPointer	; address of program filename
; *		call	dosexecpgm
; *
; *	 RETURN SEQUENCE:    AX = error code
; *
; *
; *
; *	 MODULES CALLED:   INT 21H   function 4BH and 4DH
; *
; *
; *
; *************************************************************************

	public	dosexecpgm
	.sall
	.xlist
	include macros.inc
	.list

inv_parm equ 0002
not_suf_mem equ 0004

str	struc
old_bp	dw	?
return	dd	?
Pgmpointer dd	?	; address of program file name
Processid  dd	?	; this is used when only sync exec
EnvPointer dd	?	; address of environment string
ArgPointer dd	?	; address of argument string
Traceindic dw	?	; ignored,  what is a trace process?
Asyncindic dw	?	; ignored,  PC-DOS always waits!
str	ends

dosexecpgm proc   far				; push registers
	Enter	dosexecpgm

	mov	ax,seg buffer			; setup buffer segment
	mov	ds,ax				;   and copy info into
	assume	ds:buffer			;      data buffer

	mov	ax,word ptr [bp+2].EnvPointer	; seg portion only for pc-dos
	mov	EnvironmentSegment,ax		; copy environment string

	les	di,[bp].ArgPointer
	mov	word ptr ArgumentPointer+0,di	; copy argument string
	mov	word ptr ArgumentPointer+2,es

	xor	ax,ax
	mov	word ptr Default_5C_FCB+0,ax	; setup defaults
	mov	word ptr Default_5C_FCB+2,ax

	mov	word ptr Default_6C_FCB+0,ax
	mov	word ptr Default_6C_FCB+2,ax

	mov	bx,ds
	mov	es,bx
	mov	bx,offset buffer:DosExecParameterBlock

	lds	dx,[bp].PgmPointer	   ; setup program name
	mov	ax,4b00h
	int	21h			   ; exec program  and
	jc	ErrorExit		   ;   check for error

	mov	ah,4dh
	int	21h			   ; get return code of program
	jc	ErrorExit		   ;   just executed and jump if
					   ;	   error
	mov	bx,seg buffer
	mov	ds,bx
	mov	DosExecPgmReturnCode,ax    ; else, save return code

	xor	ax,ax			   ; set no error code

ErrorExit:
	Mexit				   ; pop registers
	ret	size str - 6		   ; return

dosexecpgm  endp

dosxxx	ends

	end