[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]