; EXECSUB - execute program from compiled BASIC - requires DOS 2.00; This version allows one BASIC program to call another;; CALL EXECSUB(PROG$,PARM$,FCB1$,FCB2$,RETCD%); PROG$ is the program name (e.g. 'command.com'); PARM$ is the parameter to be passed to the program (e.g. '/c dir *.bas'); FCB1$ is the first file control block (required by some programs); FCB2$ is the second file control block (required by some programs); RETCD% is the error return code skip equ 2 ; 1 for interpretive, 2 for compiledcseg segment para public 'code'public execsubexecsub proc far assume cs:cseg,ds:cseg,ss:nothing,es:nothingbasicds equ 510hi24ip equ 90hi24cs equ 92hi1bip equ 6chi1bcs equ 6ehi1cip equ 70hi1ccs equ 72hb24ip equ 51ahb24cs equ 51chb1bip equ 516hb1bcs equ 518hb1cip equ 512hb1ccs equ 514h push bp mov bp,sp jmp p010stak equ this byte dw 0 ; save sp dw 0 ; save ssprm1 equ this byte dw 0 ; environmentprm2 equ this word dw 0 ; command line - ip & cs dw 0prm3 equ this byte dw 0 ; default FCB - ip & cs dw 0prm4 equ this byte dw 0 ; second default FCB - ip & cs dw 0p010: xor ax,ax ; get psp mov es,ax ; es=0 mov bx,ds ; save ds mov ds,ax ; ds=0 cli push ds:[basicds] ; save basic's ds push ds:[i24ip] ; save int 24h and shadow push ds:[b24ip] push ds:[b24ip] pop ds:[i24ip] push ds:[i24cs] push ds:[b24cs] push ds:[b24cs] pop ds:[i24cs] push ds:[i1bip] ; save int 1bh and shadow push ds:[b1bip] push ds:[b1bip] pop ds:[i1bip] push ds:[i1bcs] push ds:[b1bcs] push ds:[b1bcs] pop ds:[i1bcs] push ds:[i1cip] ; save int 1ch and shadow push ds:[b1cip] push ds:[b1cip] pop ds:[i1cip] push ds:[i1ccs] push ds:[b1ccs] push ds:[b1ccs] pop ds:[i1ccs] sti mov ds,bx ; restore ds mov di,4f2h ; point to dos comm. area mov ax,es:[di] ; get psp segment mov es,ax mov di,2 mov bx,es:[di] ; get top of memory sub bx,ax ; subtract psp mov ah,4ah int 21h ; free memory jnc p020 ; no error mov ah,0 ; memory error jmp p090 ; to error controlp020: mov si,[bp+12] ; point to parm$ add si,skip mov ax,[si] mov si,offset prm2 ; establish command line mov cs:[si],ax mov ax,ds mov cs:[si+2],ax mov si,[bp+10] ; point to fcb1$ add si,skip mov ax,[si] mov si,offset prm3 mov cs:[si],ax mov ax,ds mov cs:[si+2],ax mov si,[bp+8] ; point to fcb2$ add si,skip mov ax,[si] mov si,offset prm4 ; establish second fcb mov cs:[si],ax mov ax,ds mov cs:[si+2],ax push bp ; save registers push ds push es pushf mov si,offset stak ; save stack mov cs:[si],sp mov cs:[si+2],ss mov ah,4bh ; load prog mov al,0 ; load & execute mov si,[bp+14] ; point to prog$ add si,skip mov dx,[si] push cs pop es mov bx,offset prm1 ; point to parameter int 21h ; load & execute program jnc p050 ; no error mov ah,1 ; set error code jmp p060p050: mov ax,0 ; clear errorp060: mov bx,cs ; restore stack mov ds,bx mov si,offset stak cli ; no interrupts mov sp,cs:[si] mov ss,cs:[si+2] sti ; allow interrupts popf ; restore registers pop es pop ds pop bp mov cx,ds ; save ds xor bx,bx mov ds,bx ; ds=0 cli pop ds:[b1ccs] ; restore int 1ch pop ds:[i1ccs] pop ds:[b1cip] pop ds:[i1cip] pop ds:[b1bcs] ; restore int 1bh pop ds:[i1bcs] pop ds:[b1bip] pop ds:[i1bip] pop ds:[b24cs] ; restore int 24h pop ds:[i24cs] pop ds:[b24ip] pop ds:[i24ip] pop ds:[basicds] ; restore basic's ds sti mov ds,cxp090: mov si,[bp+6] ; point to RETCD% mov [si],ax ; return error, if any pop bp ; return to caller ret 10execsub endpcseg endsend  
|