home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
World of Shareware - Software Farm 2
/
wosw_2.zip
/
wosw_2
/
QBAS
/
QBNWS102.ZIP
/
QEXEC.ZIP
/
QEXEC.ASM
< prev
next >
Wrap
Assembly Source File
|
1989-12-02
|
5KB
|
88 lines
Page 60, 130
EXTRN Pascal B$ShellSetup:Far
EXTRN Pascal B$ShellRecover:Far
.MODEL MEDIUM,BASIC
.CODE
Qexec Proc Far Uses DS ES SI DI, Arg1:Ptr
Jmp Start
HoldRC DW 0
Pars DW 0 ;Environment segment
CmdLine DW 0 ;Command line for child - length
CmdLineS DW 0 ; Command line text
DW 5CH ;Default FCB 1 offset
Fcb1 DW 0 ;FCB 1 segment address
DW 6CH ;Default FCB 2 offset
Fcb2 DW 0 ;FCB 2 segment address
PgmTxt DB 65 Dup(?) ;Work area to build pgm string
CmdBuf DB ? ;This will hold the length
DB ' ' ;Must allow one space
CmdTxt DB 80 Dup(?) ;The command line text
Start: Mov CS:HoldRC,-1 ;Set RC to -1
Mov BX,Arg1 ;Get Program name length
Mov CX,[BX] ; in CX
Jcxz GetOut ;Error - Get out
Mov SI,[BX+2] ;Address of Program string
Mov DI,Offset PgmTxt ;Program text buffer
Push ES ;Save ES register
Mov AX,CS ;Make the ES register
Mov ES,AX ; the same as the CS register
Pline: Lodsb ;Get a character
Cmp AL,' ' ;Is it a space?
Je Pline1 ;Yes - go to next routine
Stosb ;Move to buffer
Loop Pline ;Do it again
Pline1: Xor AX,AX ;Zero out AX register
Stosb ;Make PgmTxt an ASCIIZ string
Jcxz Pline2 ;No more - continue
Dec CX ;Adjust for space
Pline2: Mov CS:CmdBuf,CL ;Save command tail length
Mov DI,Offset CmdTxt ;Command tail buffer
Jcxz Tline ;No more - continue
Rep Movsb ;Move command tail to buffer
Tline: Inc CS:CmdBuf ;Add one to tail length
Mov AL,13 ;CR value in AL
Stosb ;Move to buffer
Pop ES ;Restore ES register
Mov DI,Offset CmdBuf ;New command tail
Mov CS:CmdLine,DI ;Move address to parameter block
Mov DI,CS ;Get CS register address
Mov CS:CmdLineS,DI ;Move address to parameter block
Mov AH,62H ;Get current PSP segment
Int 21H ;DOS interrupt
Mov CS:Fcb1,BX ;Move PSP address to param block
Mov CS:Fcb2,BX ;Move PSP address to param block
Call B$ShellSetup ;QB routine to compress memory
Mov DX,Offset PgmTxt ;DX points to program name string
Mov BX,Offset Pars ;BX points to child environment
Push DS ;Save DS register
Mov AX,CS ;Put CS register address
Mov ES,AX ; into the ES register
Mov DS,AX ; into the DS register
Mov AH,4BH ;Function 4B - EXEC function
Mov AL,00H ;Sub Function 0 - load & exec pgm
Int 21H ;DOS interrupt
Pop DS ;Restore DS register
Jnc Cont ;No Error - Continue
Mov AH,-1 ;Set AH = FFh
Jmp Cont1 ;Error - Get out
Cont: Mov AH,4DH ;Function 4D - Get child errorlevel
Int 21H ;DOS interrupt
Xor AH,AH ;Zero out AH register
Cont1: Mov CS:HoldRC,AX ;Set RC to -1
Call B$ShellRecover ;QB routine to uncompress memory
GetOut: Mov AX,CS:HoldRC ;Set the return code
Ret ;Go back to caller
Qexec Endp
End