|
|
Unit XPXMS;
|
|
|
{$F+}
|
|
|
|
|
|
Interface
|
|
|
|
|
|
|
|
|
Const ixms = $2F;
|
|
|
|
|
|
Var XMS_Version,
|
|
|
XMS_Treiber,
|
|
|
HMA : Word;
|
|
|
XMS_installed : Boolean;
|
|
|
Failure : Byte;
|
|
|
|
|
|
XmsControl : Pointer;
|
|
|
|
|
|
RecXms : record { XMS-INFOBLOCK }
|
|
|
Len : LongInt; { length of Bytes }
|
|
|
fr_Handle : Word; { source handle }
|
|
|
fr_Adr : LongInt; { source pointer }
|
|
|
to_Handle : Word; { destination handle }
|
|
|
to_Adr : LongInt; { destination pointer }
|
|
|
end;
|
|
|
|
|
|
|
|
|
Procedure get_XMS_Install;
|
|
|
Function get_XMS_Free : Word;
|
|
|
Function get_XMS_Ram(SizeKb : Word) : Word;
|
|
|
Procedure Free_XMS_Ram(Handle : Word);
|
|
|
Procedure Data_To_XMS(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
|
|
Procedure Xms_To_Data(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
|
|
Procedure Init_XMS;
|
|
|
|
|
|
Implementation
|
|
|
|
|
|
Procedure get_XMS_Install;
|
|
|
var Erg : Byte;
|
|
|
Begin
|
|
|
Erg := 0;
|
|
|
if not XMS_installed then
|
|
|
begin
|
|
|
asm mov ax, $4300
|
|
|
int ixms
|
|
|
mov Erg, al
|
|
|
cmp al, $80
|
|
|
jne @NoDrv
|
|
|
|
|
|
mov ax, $4310
|
|
|
int ixms
|
|
|
mov Word(XmsControl),bx
|
|
|
mov Word(XmsControl+2),es
|
|
|
|
|
|
xor ah,ah
|
|
|
call XmsControl
|
|
|
mov XMS_Version,ax
|
|
|
mov XMS_Treiber,bx
|
|
|
mov HMA,dx
|
|
|
|
|
|
@NoDrv:
|
|
|
end;
|
|
|
XMS_installed := (Erg = $80);
|
|
|
end;
|
|
|
End;
|
|
|
|
|
|
Function get_XMS_Free : Word;
|
|
|
var Free : Word;
|
|
|
Begin
|
|
|
asm mov ah,$08
|
|
|
call XmsControl
|
|
|
mov Free,ax
|
|
|
mov Failure,bl
|
|
|
end;
|
|
|
get_XMS_Free := Free;
|
|
|
End;
|
|
|
|
|
|
Function get_XMS_Ram(SizeKb : Word) : Word;
|
|
|
var Handle : Word;
|
|
|
Begin
|
|
|
asm mov ah, $09
|
|
|
mov dx, SizeKb
|
|
|
call XmsControl;
|
|
|
mov Handle, dx
|
|
|
end;
|
|
|
get_XMS_Ram := Handle;
|
|
|
End;
|
|
|
|
|
|
Procedure Free_XMS_Ram(Handle : Word);
|
|
|
Begin
|
|
|
asm mov ah, $0A
|
|
|
mov dx, Handle
|
|
|
call XmsControl;
|
|
|
end;
|
|
|
End;
|
|
|
|
|
|
|
|
|
Procedure Data_To_XMS(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
|
|
var Erg : Word;
|
|
|
m : Pointer;
|
|
|
Begin
|
|
|
m := Addr(RecXms);
|
|
|
If Count mod 2 <> 0 then inc(Count);
|
|
|
|
|
|
RecXms.Len := count;
|
|
|
RecXms.fr_Handle := 0;
|
|
|
RecXms.fr_Adr := LongInt(Source);
|
|
|
RecXms.to_Handle := handle;
|
|
|
RecXms.to_adr := Adresse;
|
|
|
asm mov ah, $0b
|
|
|
mov si, Word [m]
|
|
|
mov bl,0
|
|
|
call XmsControl
|
|
|
mov Erg, ax
|
|
|
mov Failure,bl
|
|
|
end;
|
|
|
End;
|
|
|
|
|
|
|
|
|
Procedure Xms_To_Data(Source : Pointer; Handle : Word; Adresse,Count : LongInt);
|
|
|
var Erg : Word;
|
|
|
m : Pointer;
|
|
|
Begin
|
|
|
m := Addr(RecXms);
|
|
|
If Count mod 2 <> 0 then inc(Count);
|
|
|
|
|
|
RecXms.Len := count;
|
|
|
RecXms.to_Handle := 0;
|
|
|
RecXms.to_adr := LongInt(Source);
|
|
|
RecXms.fr_Handle := Handle;
|
|
|
RecXms.fr_Adr := Adresse;
|
|
|
|
|
|
asm mov ah, $0b
|
|
|
mov si, Word [m]
|
|
|
mov bl,0
|
|
|
call XmsControl
|
|
|
mov Erg, ax
|
|
|
mov Failure,bl
|
|
|
end;
|
|
|
End;
|
|
|
|
|
|
Procedure Init_XMS;
|
|
|
Begin
|
|
|
XMS_installed := false;
|
|
|
get_XMS_Install;
|
|
|
End;
|
|
|
|
|
|
End.
|
|
|
|