home *** CD-ROM | disk | FTP | other *** search
/ Frostbyte's 1980s DOS Shareware Collection / floppyshareware.zip / floppyshareware / DPSX / TOOL-PAS.ZIP / DOSMEM.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-01-24  |  2.7 KB  |  118 lines

  1.  
  2. (*
  3.  * Copyright 1987, 1989 Samuel H. Smith;  All rights reserved
  4.  *
  5.  * This is a component of the ProDoor System.
  6.  * Do not distribute modified versions without my permission.
  7.  * Do not remove or alter this notice or any other copyright notice.
  8.  * If you use this in your own program you must distribute source code.
  9.  * Do not use any of this in a commercial product.
  10.  *
  11.  *)
  12.  
  13. (*
  14.  * dosmem - Dos Memory Management Unit (3-1-89)
  15.  *
  16.  * This unit allocates memory via DOS so you don't have to reserve
  17.  * heap space in advance.
  18.  *
  19.  *)
  20.  
  21. {$i prodef.inc}
  22.  
  23. unit DosMem;
  24.  
  25. interface
  26.    uses DOS;
  27.  
  28.    type
  29.       pointer_rec = record
  30.          offset:  word;
  31.          segment: word;
  32.       end;
  33.  
  34.    function dos_maxavail: longint;
  35.    procedure dos_getmem(var ptrvar; size: word);
  36.    procedure dos_freemem(var ptrvar);
  37.  
  38.  
  39. implementation
  40.  
  41.    function dos_maxavail: longint;
  42.    var
  43.       reg:     registers;
  44.    begin
  45.       reg.ah := $48;    {allocate memory}
  46.       reg.bx := $FFFF;  {more than available, force return of freespace}
  47.       msdos(reg);
  48.       dos_maxavail := longint(reg.bx) shl 4;
  49.    end;
  50.  
  51.    procedure dos_getmem(var ptrvar; size: word);
  52.    var
  53.       block:   pointer_rec absolute ptrvar;
  54.       mem:     ^char;
  55.       reg:     registers;
  56.       need:    word;
  57.  
  58.    begin
  59.  
  60. {$IFDEF DEBUGGING}
  61.       if debugging then
  62.          writeln(debugfd^,'dos_getmem(ptr=',seg(ptrvar),':',ofs(ptrvar),', size=',size,')');
  63. {$ENDIF}
  64.  
  65.       need := (size+15) div 16;
  66.       fillchar(reg,sizeof(reg),0);
  67.       reg.ah := $48;    {allocate memory}
  68.       reg.bx := need;
  69.       msdos(reg);
  70.  
  71.       if ((reg.flags and Fcarry) <> 0) and (reg.bx <> need) then
  72.       begin
  73.          write(^M^J'dos_getmem: Can''t allocate ',size,' bytes.'^M^J'Largest available block is ',reg.bx*16,' bytes.');
  74.          halt(99);
  75.       end;
  76.  
  77.       block.segment := reg.ax;
  78.       block.offset := 0;
  79.  
  80.       {initialize the memory to all zeros}
  81.       mem := ptr(block.segment,block.offset);
  82.       fillchar(mem^,size,0);
  83.    end;
  84.  
  85.  
  86.    procedure dos_freemem(var ptrvar);
  87.    var
  88.       block:   pointer_rec absolute ptrvar;
  89.       reg:     registers;
  90.    begin
  91.       if (block.segment = 0) and (block.offset = 0) then
  92.          exit;
  93.  
  94. {$IFDEF DEBUGGING}
  95.       if debugging then
  96.          writeln(debugfd^,'dos_freemem(ptr=',seg(ptrvar),':',ofs(ptrvar),
  97.             ' @',block.segment,':',block.offset,')');
  98. {$ENDIF}
  99.  
  100.       reg.ah := $49;    {free memory}
  101.       reg.es := block.segment;
  102.       msdos(reg);
  103.  
  104. {$IFDEF DEBUGGING}
  105.       if (reg.flags and Fcarry) <> 0 then
  106.       begin
  107.          writeln(debugfd^,'dos_freemem: dispose failure');
  108.          halt(99);
  109.       end;
  110. {$ENDIF}
  111.  
  112.       block.segment := 0;
  113.       block.offset := 0;
  114.    end;
  115.  
  116. end.
  117.  
  118.