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

    Unit Xalloc; { EXPanded Memory Unit }

    Interface

    Const nilpage=$ff;

    type xaddress = record
          page:byte;
          pos :word;
          end;

    function  xalloc_init:boolean;
    procedure xgetmem(var x:xaddress;size:word);
    procedure xfreemem(var x:xaddress;size:word);
    function  xpage_in(var x:xaddress):pointer;
    function  xmaxavail:longint;
    function  xmemavail:longint;
    procedure xalloc_done;

    implementation

    uses dos,crt;

    const
      emm_int = $67;
      dos_int = $21;
      maxfreeblock = 4000;
      xblocksize = $4000;
      _get_frame = $41;
      _unalloc_cound = $42;
      _alloc_pages = $43;
      _map_page = $44;
      _dealloc_pages = $45;
      _change_alloc = $51;

    type
        xheap = array[0..1000] of word;
        fblock = record
         page:byte;
         start,stop:word;
         end;
        fblockarray = array[1..maxfreeblock] of fblock;
    var
       regs:registers;
       handle,tot_pages:word;
       xheapptr:^xheap;
       xfreeptr:^fblockarray;
       last_page,lastptr:integer;
       map: array[0..3] of integer;
       frame:word;

    function ems_isntalled: boolean;
      const device_name: string[8]='EMMXXXX0';
      var i:integer;
      begin
      ems_installed:=false;
      with regs do
         begin
         ah:=$35;
         al := emm_int;
         intr(dos_int,regs);
         for i:=1 to 8 do if device_name[i]<>chr(mem[es:i+9]) then exit;
         end;
      ems_installed:=true;
      end;

    function unalloc_count(var available: word):boolean;
     begin
     with regs do
      begin
      ah := _unalloc_count;
      intr(emm_int,regs);
      available := bx;
      unalloc_count := ah = 0;
      end;
     end;

    Function alloc_pages(needed:integer):boolean;
     begin
     with regs do
       begin
       ah := _alloc_pages;
       bx := needed;
       intr(emm_int,regs);
       handle := dx;
       alloc_pages := ah = 0;
       end;
     end;

    function xdealloc_pages: boolean;
     begin
     with regs do begin
       ah := _dealloc_pages;
       dx := handle;
       intr(emm_int,regs);
       xdealloc_pages := ah = 0;
       end;
     end;

    function change_alloc(needed: integer): boolean;
     begin
     with regs do begin
       ah := _change_alloc;
       bx := needed;
       dx := handle;
       intr(emm_int,regs);
       change_alloc := ah=0;
       end;
     end;

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