home *** CD-ROM | disk | FTP | other *** search
- ; RUNDOS.ASM - Demonstrates how to invoke a copy of the COMMAND.COM
- ; DOS command line interpreter from your programs.
-
- include stdlib.a
- includelib stdlib.lib
-
- dseg segment para public 'data'
-
- ; Variables used by this program.
-
-
- ; MS-DOS EXEC structure.
-
- ExecStruct dw 0 ;Use parent's Environment blk.
- dd CmdLine ;For the cmd ln parms.
- dd DfltFCB
- dd DfltFCB
-
- DfltFCB db 3," ",0,0,0,0,0
- CmdLine db 0, 0dh ;Cmd line for program.
- PgmName dd filename ;Points at pgm name.
- filename byte "c:\command.com",0
-
- dseg ends
-
- cseg segment para public 'code'
- assume cs:cseg, ds:dseg
-
-
- Main proc
- mov ax, dseg ;Get ptr to vars segment
- mov ds, ax
-
- MemInit ;Start the memory mgr.
-
-
-
-
- ; Okay, we've built the MS-DOS execute structure and the necessary
- ; command line, now let's see about running the program.
- ; The first step is to free up all the memory that this program
- ; isn't using. That would be everything from zzzzzzseg on.
- ;
- ; Note: unlike some previous examples in other chapters, it is okay
- ; to call Standard Library routines in this program after freeing
- ; up memory. The difference here is that the Standard Library
- ; routines are loaded early in memory and we haven't free up the
- ; storage they are sitting in.
-
- mov ah, 62h ;Get our PSP value
- int 21h
- mov es, bx
- mov ax, zzzzzzseg ;Compute size of
- sub ax, bx ; resident run code.
- mov bx, ax
- mov ah, 4ah ;Release unused memory.
- int 21h
-
-
- ; Tell the user what is going on:
-
- print
- byte cr,lf
- byte "RUNDOS- Executing a copy of command.com",cr,lf
- byte "Type 'EXIT' to return control to RUN.ASM",cr,lf
- byte 0
-
- ; Warning! No Standard Library calls after this point. We've just
- ; released the memory that they're sitting in. So the program load
- ; we're about to do will wipe out the Standard Library code.
-
- mov bx, seg ExecStruct
- mov es, bx
- mov bx, offset ExecStruct ;Ptr to program record.
- lds dx, PgmName
- mov ax, 4b00h ;Exec pgm
- int 21h
-
- ; In MS-DOS 6.0 the following code isn't required. But in various older
- ; versions of MS-DOS, the stack is messed up at this point. Just to be
- ; safe, let's reset the stack pointer to a decent place in memory.
- ;
- ; Note that this code preserves the carry flag and the value in the
- ; AX register so we can test for a DOS error condition when we are done
- ; fixing the stack.
-
- mov bx, sseg
- mov ss, ax
- mov sp, offset EndStk
- mov bx, seg dseg
- mov ds, bx
-
- ; Test for a DOS error:
-
- jnc GoodCommand
- print
- byte "DOS error #",0
- puti
- print
- byte " while attempting to run COMMAND.COM",cr,lf
- byte 0
- jmp Quit
-
-
- ; Print a welcome back message.
-
- GoodCommand: print
- byte "Welcome back to RUNDOS. Hope you had fun.",cr,lf
- byte "Now returning to MS-DOS' version of COMMAND.COM."
- byte cr,lf,lf,0
-
- ; Return control to MS-DOS
-
- Quit: ExitPgm
- Main endp
- cseg ends
-
- sseg segment para stack 'stack'
- dw 128 dup (0)
- endstk dw ?
- sseg ends
-
- ; Set aside some room for the heap.
-
- zzzzzzseg segment para public 'zzzzzzseg'
- Heap db 200h dup (?)
- zzzzzzseg ends
- end Main
-