home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / mslang / as / execsub.asm < prev    next >
Assembly Source File  |  1985-05-28  |  4KB  |  201 lines

  1. ; EXECSUB - execute program from compiled BASIC - requires DOS 2.00
  2. ; This version allows one BASIC program to call another
  3. ;
  4. ; CALL EXECSUB(PROG$,PARM$,FCB1$,FCB2$,RETCD%)
  5. ; PROG$ is the program name (e.g. 'command.com')
  6. ; PARM$ is the parameter to be passed to the program (e.g. '/c dir *.bas')
  7. ; FCB1$ is the first file control block (required by some programs)
  8. ; FCB2$ is the second file control block (required by some programs)
  9. ; RETCD% is the error return code
  10.  
  11.     skip equ 2        ; 1 for interpretive, 2 for compiled
  12.  
  13. cseg    segment para public 'code'
  14. public    execsub
  15. execsub proc far
  16.  
  17.     assume cs:cseg,ds:cseg,ss:nothing,es:nothing
  18.  
  19. basicds equ 510h
  20. i24ip    equ 90h
  21. i24cs    equ 92h
  22. i1bip    equ 6ch
  23. i1bcs    equ 6eh
  24. i1cip    equ 70h
  25. i1ccs    equ 72h
  26.  
  27. b24ip    equ 51ah
  28. b24cs    equ 51ch
  29. b1bip    equ 516h
  30. b1bcs    equ 518h
  31. b1cip    equ 512h
  32. b1ccs    equ 514h
  33.  
  34.     push bp
  35.     mov bp,sp
  36.     jmp p010
  37.  
  38. stak    equ this byte
  39.     dw 0            ; save sp
  40.     dw 0            ; save ss
  41.  
  42. prm1    equ this byte
  43.     dw 0            ; environment
  44. prm2    equ this word
  45.     dw 0            ; command line - ip & cs
  46.     dw 0
  47. prm3    equ this byte
  48.     dw 0            ; default FCB - ip & cs
  49.     dw 0
  50. prm4    equ this byte
  51.     dw 0            ; second default FCB - ip & cs
  52.     dw 0
  53.  
  54. p010:
  55.     xor ax,ax        ; get psp
  56.     mov es,ax        ; es=0
  57.     mov bx,ds        ; save ds
  58.     mov ds,ax        ; ds=0
  59.     cli
  60.  
  61.     push ds:[basicds]    ; save basic's ds
  62.  
  63.     push ds:[i24ip]     ; save int 24h and shadow
  64.     push ds:[b24ip]
  65.     push ds:[b24ip]
  66.     pop ds:[i24ip]
  67.  
  68.     push ds:[i24cs]
  69.     push ds:[b24cs]
  70.     push ds:[b24cs]
  71.     pop ds:[i24cs]
  72.  
  73.     push ds:[i1bip]     ; save int 1bh and shadow
  74.     push ds:[b1bip]
  75.     push ds:[b1bip]
  76.     pop ds:[i1bip]
  77.  
  78.     push ds:[i1bcs]
  79.     push ds:[b1bcs]
  80.     push ds:[b1bcs]
  81.     pop ds:[i1bcs]
  82.  
  83.     push ds:[i1cip]     ; save int 1ch and shadow
  84.     push ds:[b1cip]
  85.     push ds:[b1cip]
  86.     pop ds:[i1cip]
  87.  
  88.     push ds:[i1ccs]
  89.     push ds:[b1ccs]
  90.     push ds:[b1ccs]
  91.     pop ds:[i1ccs]
  92.  
  93.     sti
  94.     mov ds,bx        ; restore ds
  95.  
  96.     mov di,4f2h        ; point to dos comm. area
  97.     mov ax,es:[di]        ; get psp segment
  98.     mov es,ax
  99.     mov di,2
  100.     mov bx,es:[di]        ; get top of memory
  101.     sub bx,ax        ; subtract psp
  102.     mov ah,4ah
  103.     int 21h         ; free memory
  104.     jnc p020        ; no error
  105.     mov ah,0        ; memory error
  106.     jmp p090        ; to error control
  107.  
  108. p020:    mov si,[bp+12]        ; point to parm$
  109.     add si,skip
  110.     mov ax,[si]
  111.     mov si,offset prm2    ; establish command line
  112.     mov cs:[si],ax
  113.     mov ax,ds
  114.     mov cs:[si+2],ax
  115.  
  116.     mov si,[bp+10]        ; point to fcb1$
  117.     add si,skip
  118.     mov ax,[si]
  119.     mov si,offset prm3
  120.     mov cs:[si],ax
  121.     mov ax,ds
  122.     mov cs:[si+2],ax
  123.  
  124.     mov si,[bp+8]        ; point to fcb2$
  125.     add si,skip
  126.     mov ax,[si]
  127.     mov si,offset prm4    ; establish second fcb
  128.     mov cs:[si],ax
  129.     mov ax,ds
  130.     mov cs:[si+2],ax
  131.  
  132.     push bp         ; save registers
  133.     push ds
  134.     push es
  135.     pushf
  136.     mov si,offset stak    ; save stack
  137.     mov cs:[si],sp
  138.     mov cs:[si+2],ss
  139.  
  140.     mov ah,4bh        ; load prog
  141.     mov al,0        ; load & execute
  142.     mov si,[bp+14]        ; point to prog$
  143.     add si,skip
  144.     mov dx,[si]
  145.     push cs
  146.     pop es
  147.     mov bx,offset prm1    ; point to parameter
  148.     int 21h         ; load & execute program
  149.     jnc p050        ; no error
  150.     mov ah,1        ; set error code
  151.     jmp p060
  152.  
  153. p050:    mov ax,0        ; clear error
  154.  
  155. p060:    mov bx,cs        ; restore stack
  156.     mov ds,bx
  157.     mov si,offset stak
  158.     cli            ; no interrupts
  159.     mov sp,cs:[si]
  160.     mov ss,cs:[si+2]
  161.     sti            ; allow interrupts
  162.  
  163.     popf            ; restore registers
  164.     pop es
  165.     pop ds
  166.     pop bp
  167.  
  168.     mov cx,ds        ; save ds
  169.     xor bx,bx
  170.     mov ds,bx        ; ds=0
  171.     cli
  172.  
  173.     pop ds:[b1ccs]        ; restore int 1ch
  174.     pop ds:[i1ccs]
  175.     pop ds:[b1cip]
  176.     pop ds:[i1cip]
  177.  
  178.     pop ds:[b1bcs]        ; restore int 1bh
  179.     pop ds:[i1bcs]
  180.     pop ds:[b1bip]
  181.     pop ds:[i1bip]
  182.  
  183.     pop ds:[b24cs]        ; restore int 24h
  184.     pop ds:[i24cs]
  185.     pop ds:[b24ip]
  186.     pop ds:[i24ip]
  187.  
  188.     pop ds:[basicds]    ; restore basic's ds
  189.     sti
  190.     mov ds,cx
  191.  
  192. p090:    mov si,[bp+6]        ; point to RETCD%
  193.     mov [si],ax        ; return error, if any
  194.  
  195.     pop bp            ; return to caller
  196.     ret 10
  197.  
  198. execsub endp
  199. cseg    ends
  200. end
  201.