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