147 lines
3.1 KiB
Plaintext
Executable File
147 lines
3.1 KiB
Plaintext
Executable File
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.
|
||
|