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


program XMS;

{ Functions to get to the XMS API }

var XMS_Driver : pointer;

function XMS_get_state : byte; assembler;
asm mov ax,4300h; int 2Fh end;

function XMS_get_entry_point : pointer; assembler;
asm mov ax,4310h; int 2Fh; mov ax,bx; mov dx,es end;


{ XMS API }

type MoveStruct = record
 length    : longint;
 srcHandle : word;
 srcOffset : longint;
 dstHandle : word;
 dstOffset : longint
end;

function XMS_get_version : word; assembler;
asm mov ah,00h; call XMS_Driver end;

function XMS_query : word; assembler;
asm mov ah,08h; call XMS_Driver end;

function XMS_alloc(size : word) : word; assembler;
asm mov ah,09h; call XMS_Driver; mul dx end;

function XMS_free(handle : word) : boolean; assembler;
asm mov ah,0Ah; mov dx,handle; call XMS_Driver end;

function XMS_move(var MoveStructPtr : MoveStruct) : boolean; assembler;
asm mov ah,0Bh; push ds; push ds; pop es; lds si,MoveStructPtr; call
es:XMS_Driver; pop ds end;

{ Main program }

var XMS_version, XMS_handle  : word;

    a : word;
    b : array[0..1999] of real;
    c : MoveStruct;
    d : boolean;

    x,y : word;

begin
 if XMS_get_state = $80 then begin
  XMS_driver := XMS_get_entry_point;

  XMS_version := XMS_get_version;
  writeln('XMS version           : ', hi(XMS_version), '.', lo(XMS_version));

  writeln('Largest available EMB : ', XMS_query, 'KB');
  if XMS_query > 0 then begin

   a := longint(XMS_query) * 1024 div sizeof(b);
   XMS_handle := XMS_alloc(XMS_query);
   if XMS_handle > 0 then begin

    writeln('Number of arrays      : ', a);

    c.length := sizeof(b);
    c.srcHandle := 0;
    c.srcOffset := longint(Addr(b));
    c.dstHandle := XMS_handle;

    for x := 0 to pred(a) do begin
     write('Filling array #       : ', x, #13);
     for y := 0 to 1999 do
      b[y] := x * y;
     c.dstOffset := longint(x) * sizeof(b);
     XMS_move(c);
    end;

    writeln;

    c.srcHandle := XMS_handle;
    c.dstHandle := 0;
    c.dstOffset := longint(Addr(b));

    for x := 0 to pred(a) do begin
     write('Checking array #      : ', x, #13);
     c.srcOffset := longint(x) * sizeof(b);
     XMS_move(c);
     d := true;
     for y := 0 to 1999 do
      d := d and (b[y] = x * y);
     if not d then
      writeln('Error in array #      : ', x)
    end;

    if not XMS_free(XMS_handle) then
     writeln('Error freeing EMB!')

   end else
    writeln('Error Allocating EMB!')

  end else
   writeln('No free XMS memory!')

 end else
  writeln('No XMS driver found!')
end.

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