home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS - Coast to Coast / simteldosarchivecoasttocoast.iso / pcmag / vol8n20.zip / FINDENV.PAS < prev    next >
Pascal/Delphi Source File  |  1989-10-13  |  2KB  |  83 lines

  1. (*** FINDENV.PAS -  A Program to Find the Real DOS Environment ***)
  2.  
  3. USES DOS;
  4.  
  5. VAR
  6.   envseg : Word;                  {address of environment}
  7.   envsize : Word;                 {absolute size of environment}
  8.   envinuse : Word;                {bytes in env up to first double 00}
  9.  
  10.   FUNCTION SpecialDOS : Boolean;  {true if DOS 3.2x}
  11.   VAR
  12.     regs : registers;
  13.   BEGIN
  14.     WITH regs DO BEGIN
  15.       AH := $30;                  {Get MS-DOS version number}
  16.       MsDos(regs);
  17.       IF ((AL = 3) AND (AH > 19) AND (AH < 30)) THEN SpecialDOS := True
  18.       ELSE SpecialDOS := False;
  19.     END;
  20.   END;
  21.  
  22.   FUNCTION getDOSPSP : Word;
  23.   VAR
  24.     tent, tent1 : Word;
  25.   BEGIN
  26.     tent := MemW[PrefixSeg:$16];
  27.     WHILE True DO BEGIN
  28.       tent1 := MemW[tent:$16];
  29.       IF ((tent1 = 0) OR (tent1 = tent)) THEN BEGIN {this means we have DOS!}
  30.         getDOSPSP := tent;
  31.         Exit;
  32.       END ELSE tent := tent1;
  33.     END;
  34.   END;
  35.  
  36.   PROCEDURE ComputeEnvInUse;
  37.   VAR
  38.     j : Word;
  39.   BEGIN
  40.     FOR j := 0 TO (envsize-3) DO
  41.       IF MemW[envseg:j] = $0 THEN BEGIN {word 0 means two bytes}
  42.         envinuse := j+2;
  43.         Exit;
  44.       END;
  45.     envinuse := envsize;
  46.   END;
  47.  
  48.   PROCEDURE getenv;
  49.   VAR
  50.     DOSPSP, temp : Word;
  51.   BEGIN
  52.     DOSPSP := getDOSPSP;
  53.     temp := MemW[DOSPSP:$2C];
  54.     IF ((temp <> 0) AND (NOT SpecialDOS)) THEN envseg := temp
  55.     ELSE envseg := DOSPSP+MemW[DOSPSP-1:3]+1;
  56.     envsize := 16*MemW[envseg-1:3];
  57.     ComputeEnvInUse;
  58.   END;
  59.  
  60.   FUNCTION HexDigit(b : Byte) : Char;
  61.   BEGIN
  62.     IF b < 10 THEN HexDigit := Char(Ord('0')+b)
  63.     ELSE HexDigit := Char(Ord('A')-10+b);
  64.   END;
  65.  
  66.   FUNCTION HexWord(w : Word) : STRING;
  67.   BEGIN
  68.     HexWord := HexDigit(w DIV $1000)+HexDigit((w MOD $1000) DIV $100)
  69.     +HexDigit((w MOD $100) DIV $10)+HexDigit(w MOD $10);
  70.   END;
  71.  
  72. BEGIN
  73.   getenv;
  74.   WriteLn('ENVREP. Copyright Ziff-Davis Corp., 1989');
  75.   WriteLn('  Your active environment environment is at '+HexWord(envseg)+'H.');
  76.   WriteLn('  The size of the environment is ', envsize, ' bytes');
  77.   WriteLn('    of which ', envinuse, ' bytes are used');
  78.   WriteLn('    leaving ', envsize-envinuse, ' bytes free.');
  79.   WriteLn('  Have a good day.');
  80. END.
  81.  
  82.  
  83.