[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]
{
KELLY SMALL
>Does anyone know how to change the "master" environment? I want to have my
>program change the dos prompt and have it be there after my program ends.
>DOS's stupid little batch language can do it, so there must be a way.
Here's a procedure that should do it from TeeCee:
}
procedure InitNewPrompt;
{-set up a new prompt for shelling to dos}
type
_2karray = array[1..2048] of byte;
SegPtr = ^_2karray;
const
NewPrompt : string = ('PROMPT=Type EXIT to return to program$_$p$g'+#0);
var
EnvSegment,
NewEnvSeg : word;
PtrSeg,
NewEnv : SegPtr;
begin
EnvSegment := memw[prefixseg:$2C];
{-this gets the actual starting segment of the current program's env}
PtrSeg := ptr(pred(EnvSegment), 0);
{-The segment of the program's MCB - (Memory control block) }
getmem(NewEnv, 1072 + length(NewPrompt));
{-Allocate heap memory and allow enough room for a dummy mcb }
if ofs(NewEnv^) <> 0 then
NewEnvSeg := seg(NewEnv^) + 2
else
NewEnvSeg := succ(seg(NewEnv^));
{-Force the new environment to start at paragraph boundary}
move(PtrSeg^, mem[pred(NewEnvSeg) : 0], 16);
{-copy the old mcb and force to paragraph boundary}
memw[pred(NewEnvSeg) : 3] := (1072 + length(NewPrompt)) shr 4;
{-Alter the environment length by changing the dummy mcb}
move(NewPrompt[1], memw[NewEnvSeg : 0], length(NewPrompt));
{-install new prompt}
memw[prefixseg:$2C] := NewEnvSeg;
{-let the program know where the new env is}
move(mem[EnvSegment : 0], mem[NewEnvSeg : length(NewPrompt)], 1024);
{-shift the old env to the new area}
end;
[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]