[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]

     {change the dos prompt when Shelling to DOS without
      having to change the current or master enviroment(It makes it's own).}

    {***********************************************************************}
    PROGRAM PromptDemo;             { Feb 12/94, Greg Estabrooks.           }
    {$M 16840,0,0}                  { Reserved some memory for the shell.   }
    USES CRT,                         { IMPORT Clrscr,Writeln.              }
         DOS;                         { IMPORT Exec.                        }

    PROCEDURE ShellWithPrompt( Prompt :STRING );
                             { Routine to allocate a temporary Enviroment   }
                             { with our prompt and the execute COMMAND.COM. }
                             { NOTE: This does NO error checking.           }
    VAR
       NewEnv :WORD;                { Points to our newly allocated env.    }
       OldEnv :WORD;                { Holds Old Env Segment.                }
       EnvPos :WORD;                { Position inside our enviroment.       }
       EnvLp  :WORD;                { Variable to loop through ENVStrings.  }
       TempStr:STRING;              { Holds temporary EnvString info.       }
    BEGIN
      ASM
       Mov AH,$48                   { Routine to allocate memory.           }
       Mov BX,1024                  { Allocate 1024(1k) of memory.          }
       Int $21                      { Call DOS to allocate memory.          }
       Mov NewEnv,AX                { Save segment address of our memory.   }
      END;

      EnvPos := 0;                  { Initiate pos within our Env.          }
      FOR EnvLp := 1 TO EnvCount DO { Loop through entire enviroment.       }
       BEGIN
        TempStr := EnvStr(EnvLp);   { Retrieve Envirment string.            }
        IF Pos('PROMPT=',TempStr) <> 0 THEN  { If its our prompt THEN ....  }
         TempStr := 'PROMPT='+Prompt+#0  { Create our new prompt.           }
        ELSE                        {  .... otherwise.........              }
         TempStr := TempStr + #0;   { Add NUL to make it ASCIIZ compatible. }
        Move(TempStr[1],Mem[NewEnv:EnvPos],Length(TempStr)); { Put in Env.  }
        INC(EnvPos,Length(TempStr)); { Point to new position in Enviroment. }
       END;{For}

      OldEnv := MemW[PrefixSeg:$2C];{ Save old enviroment segment.          }
      MemW[PrefixSeg:$2C] := NewEnv;{ Point to our new enviroment.          }
      SwapVectors;                  { Swap Int vectors in case of conflicts.}
      Exec(GetEnv('COMSPEC'),'');   { Call COMMAND.COM.                     }
      SwapVectors;                  { Swap em back.                         }
      MemW[PrefixSeg:$2C] := OldEnv;{ Point back to old enviroment.         }

      ASM
       Push ES                      { Save ES.                              }
       Mov AH,$49                   { Routine to deallocate memory.         }
       Mov ES,NewEnv                { Point ES to area to deallocate.       }
       Int $21;                     { Call DOS to free memory.              }
       Pop ES                       { Restore ES.                           }
      END;
    END;{ShellWithPrompt}

    BEGIN
      Clrscr;                        { Clear the screen.                    }
      Writeln('Type EXIT to return');{ Show message on how to exit shell.   }
      ShellWithPrompt('[PromptDemo] $P$G'); { shell to DOS with our prompt. }
    END.{PromptDemo}

[Back to EXEC SWAG index] [Back to Main SWAG index] [Original]