Microsoft KB Archive/61383

Running Out of Memory When Chaining to Other Programs ID Number: Q61383

2.x 3.x 4.00 4.01 MS-DOS

Question:

I am writing a “shell” program to allow a user to move transparently between several programs that make up an application. One of the programs this shell must execute is very large; currently, it is hard to fit this program into 640K (even with overlays). I can easily invoke these programs from the shell using the 4BH (EXEC) call, but the shell program continues to take up memory. Is there a way of “chaining” from one process to another, with the caller being replaced by the callee, or is there a way to reduce the amount of memory occupied by the shell program to the minimum required to execute the large program? I suspect the latter could be done with SETBLOCK, but when the large program returns, how would I reload the rest of the shell process?

Response:

Unfortunately, there is no way of “chaining” from one process to another with the caller being replaced by the callee.

However, you can reduce the amount of memory occupied by the shell program to the minimum. You can shrink it down as much as you can with MS-DOS Interrupt 21H, service 4AH, SETBLOCK. If your shell program is a .COM program, you will definitely need to do this, since .COM files by default allocate all available memory when they are executed.

To write a shell program that allows the most room for called applications, you should have a small core program with the bulk of the application in one or more overlay files. When you first start up the shell program, you would load in the overlays and have full functionality. When you are about to execute a large program, you would then jump back to the code in your core program, use SETBLOCK to free up the memory taken up by your overlay(s), and then use EXEC to load and execute the application. When this application is finished, you would reload your overlays to restore the full functionality to your shell program and then proceed with your program.