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

    {
    Here a small piece of code to determine the DOS memory (that
    would be available at the DOS prompt) from within a TP program. It
    doesn't account for UMB and heap limited programs (the $M directive).
    It returns (almost) the value chkdsk and mem return for largest
    available block of dos memory.
    }

    FUNCTION Dosmem : LONGINT;

    {----Returns Largest Free DOS memory as seen on the dos prompt by          }
    {    CHKDSK and MEM.                                                       }

    {----Records from The Programmer's PC Sourcebook by Thom Hogan, 1st Edition}

    {    Only relevant field commented. Tuned by be equal to DR-DOS's 6.0}
    {    MEM command. Works only if programs allocates all memory available}
    {    so no max heaplimits to enable TP's Exec.}

    Type
      MCBrec = RECORD
                 location   : Char; {----'M' is normal block, 'Z' is last block }
                 ProcessID,
                 allocation : WORD; {----Number of 16 Bytes paragraphs allocated}
                 reserved   : ARRAY[1..11] OF Byte;
               END;

      PSPrec = RECORD
                 int20h,
                 EndofMem        : WORD;
                 Reserved1       : BYTE;
                 Dosdispatcher   : ARRAY[1..5] OF BYTE;
                 Int22h,
                 Int23h,
                 INT24h          : POINTER;
                 ParentPSP       : WORD;
                 HandleTable     : ARRAY[1..20] OF BYTE;
                 EnvSeg          : WORD; {----Segment of Environment}
                 Reserved2       : LONGINT;
                 HandleTableSize : WORD;
                 HandleTableAddr : POINTER;
                 Reserved3       : ARRAY[1..23] OF BYTE;
                 Int21           : WORD;
                 RetFar          : BYTE;
                 Reserved4       : ARRAY[1..9] OF BYTE;
                 DefFCB1         : ARRAY[1..36] OF BYTE;
                 DefFCB2         : ARRAY[1..20] OF BYTE;
                 Cmdlength       : BYTE;
                 Cmdline         : ARRAY[1..127] OF BYTE;
               END;

    Var
      pmcb   : ^MCBrec;
      emcb   : ^MCBrec;
      psp    : ^PSPrec;
      dmem   : LONGINT;

    Begin
       psp:=PTR(PrefixSeg,0);      {----PSP given by TP var                }
      pmcb:=Ptr(PrefixSeg-1,0);    {----Programs MCB 1 paragraph before PSP}
      emcb:=Ptr(psp^.envseg-1,0);  {----Environment MCB 1 paragraph before
                                        envseg                             }
      dosmem:=LONGINT(pmcb^.allocation+emcb^.allocation+1)*16;
    End; {of DOSmem}

    Begin
      Writeln(Dosmem,' Bytes available.');
    End.

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