home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / msdos / sysutl / toadexec.arc / TOADEXEC.ASM next >
Assembly Source File  |  1988-06-30  |  3KB  |  137 lines

  1. TITLE    Exec call test
  2. PAGE    60,132
  3.  
  4. ;  This program demonstrates shelling to DOS command processor
  5. ;  using the EXEC funtion.
  6. ;  Assemble, link and convert to a .COM file.
  7. ;  Program written by Brian M. Markey
  8.  
  9. ; Toad Hall Tweak, 30 Jun 88
  10. ; - Accepts up to 125 chars at regular DOS command line.
  11. ; - If no DOS command line, defaults to COMMAND.COM shell
  12. ;    (EXIT to exit).
  13. ; - Otherwise execs any .COM, .EXE, .BAT file via COMMAND.COM,
  14. ;    returns Exec result as ERRORLEVEL.
  15. ; - tightened code in general.
  16. ; - still assumes COMMAND.COM is in C:\
  17. ; - no decent error trapping yet (e.g., insufficient memory,
  18. ;    file not found, etc.)
  19. ;
  20. ; David Kirschbaum
  21. ; Toad Hall
  22. ; kirsch@braggvax.ARPA
  23.  
  24. CR    equ    0DH
  25. LF    equ    0AH
  26.  
  27. CSeg    SEGMENT    'CODE'
  28.     ASSUME    CS:CSeg,DS:CSeg,ES:CSeg
  29.  
  30.     org    2CH
  31. envaddr    dw    ?                ;Environment address
  32.  
  33.     org    80H                ;PSP cmd line [TH]
  34. PSPcmdline    db    ?
  35.  
  36.     ORG    100H                ; Program entry point
  37. ExecTest:
  38.  
  39.     MOV    SP,OFFSET stack            ; Set up local stack
  40.  
  41.     MOV    DX,OFFSET mess1            ;'Before shell'
  42.     MOV    AH,9                ;display string
  43.     INT    21H
  44.  
  45.     MOV    BX,OFFSET lastloc+15        ; BX := program size in
  46.     MOV    CX,4                ;  paragraphs
  47.     SHR    BX,CL                ;requested memory in paras
  48.  
  49.     MOV    ah,4AH                ;TH  Deallocate unused memory
  50.     INT    21H
  51.  
  52.     mov    ax,envaddr            ;TH get environment addr
  53.     MOV    parmblk,AX            ;stuff in parameter block
  54.  
  55.     MOV    AX,CS                ; Set segment registers
  56.     MOV    parmblk+4,AX            ;  in parameter block
  57.     MOV    parmblk+8,AX            ; to our Code Seg
  58.     MOV    parmblk+12,AX
  59.  
  60. ;TH move PSP command line into our own working buffer
  61.     mov    si,offset PSPcmdline        ;point to PSP cmd line
  62.     mov    di,offset comline        ;point to our own cmd line buff
  63.     xor    ax,ax                ;insure msb is clear
  64.     cld                    ;insure fwd
  65.     lodsb                    ;snarf cmd line length byte
  66.     or    ax,ax                ;anything there?
  67.     je    NoCmd                ; nope, use default
  68.     mov    cx,ax                ;into cx as a counter
  69. ;TH si now points to first char of PSP cmd line
  70.     inc    ax                ;+2 for '/C' already there
  71.     inc    ax
  72.     stosb                    ;force working cmd line len
  73.     inc    di                ;bump past "/C"
  74.     inc    di
  75.     rep    movsb                ;transfer cmd line
  76. NoCmd:
  77. ;end of Toad Hall code
  78.  
  79.     MOV    DX,OFFSET filenam        ;DS:DX = program name
  80.     MOV    BX,OFFSET parmblk        ;ES:BX = control block
  81.     MOV    AX,4B00H            ;service 0, exec
  82.  
  83.     PUSH    DS                ; Save machine state
  84.     PUSH    ES
  85.     mov    savess,SS            ;TH
  86.     mov    savesp,SP            ;TH
  87.     INT    21H                ; Shell to DOS
  88.  
  89. ;TH seem to recall something about disabling interrupts
  90. ; before fiddling these registers, but can't remember just what!
  91. ; Seems to work ok, so will leave it be for now.
  92.  
  93.     MOV    SP,CS:savesp            ; Restore machine state
  94.     MOV    SS,CS:savess
  95.     POP    ES
  96.     POP    DS
  97.     mov    bx,ax                ;TH save any errors
  98.  
  99.     MOV    DX,OFFSET mess2            ;'After shell'
  100.     MOV    AH,9                ;display string
  101.     INT    21H
  102.  
  103.     mov    ax,bx                ;TH restore any errors
  104.     mov    ah,4CH                ;TH terminate process
  105.     int    21H
  106.  
  107. savess    DW    ?                ; Holders for SS:SP
  108. savesp    DW    ?
  109.  
  110. mess1    DB    'Before shell',CR,LF,'$'
  111. mess2    DB    'After shell',CR,LF,'$'
  112.  
  113. filenam    DB    'C:\COMMAND.COM',0        ; Assume COMMAND.COM on C:
  114.  
  115.     Even                    ;TH for faster access?
  116.  
  117. parmblk    DW    00                ; Parameter block
  118.     DW    OFFSET comline,00
  119.     DW    5CH,00
  120.     DW    6CH,00
  121.  
  122. ;TH default is just COMMAND.COM
  123. comline    db    17                ;TH default cmd length
  124.     db    '/C C:\COMMAND.COM',CR        ;TH default: Exec COMMAND.COM
  125.  
  126. COMLEN    =    $ - offset comline        ;TH
  127.  
  128.     db    128-comlen DUP(0)        ;TH up to 128 bytes
  129.  
  130.     DB    128  DUP (?)            ; Stack
  131. stack    LABEL    BYTE
  132.  
  133. lastloc    LABEL    BYTE                ; End of program
  134.  
  135. CSeg    ENDS
  136.     END    ExecTest
  137.