git » fp-git.git » master » tree

[master] / poprecog / record / M_XMS.PAS

(*
  XMS library
  
  Author   : Piotr Kochanek
  WWW site : www.pop2.princed.com.ar
*)

UNIT M_XMS;

INTERFACE
Var
 XMSError : Byte;

{ // Czy pamiec XMS istnieje ? }
FUNCTION XMSFind : Boolean;
{ // Funkcja zwraca adres programu XMM }
FUNCTION XMSGetAddress : Pointer;
{ // Zwraca wersje sterownika XMM }
FUNCTION XMSVersion : Word;
{ // Funkcja inicjujaca modul i spraqdzajaca czy wszystko OK }
FUNCTION XMSSetup : Boolean;
{ // Funkcja zwraca ilosc wolnej pamieci XMS w KB }
FUNCTION XMSMemAvail : Word;
{ // Funkcja zwraca wielkosc najwiekszego bloku pamieci XMS w KB }
FUNCTION XMSMaxAvail : Word;
{ // Funkcja alokuje pamiec XMS }
FUNCTION XMSGetMem (Var Handler : Word ; Size : Word) : Boolean;
{ // Zmienia rozmiar pamieci XMS pod wybranym uchwytem }
FUNCTION XMSReGetMem (Handler : Word ; Size : Word) : Boolean;
{ // Funkcja usuwa pamiec XMS }
FUNCTION XMSFreeMem (Handler : Word) : Boolean;
{ // Funkcja kopiuje bajty do/z pamieci XMS }
FUNCTION XMSMoveMem (SrcHandler : Word ; SrcOffset : Pointer ;
                     DstHandler : Word ; DstOffset : Pointer ; Size : Longint) : Boolean;

IMPLEMENTATION
VAR
 { // Adres sterownika pamieci XMS }
 XMSAddress : Pointer;
 { // Rekord potrzebny przy przesylaniu pamieci }
 XMSBlockInfo :
   RECORD
     Length : Longint;
     SourceHandler : Word;
     SourceOffset : Pointer;
     DestinationHandler : Word;
     DestinationOffset : Pointer;
   END;

(*
  Funkcja sprawdza czy istnieje pamiec XMS
*)
FUNCTION XMSFind : Boolean;
BEGIN
 ASM
   mov ax, $4300
   int $2f
   mov @result, FALSE
   cmp al, $80
   jne @end
   mov @result, TRUE
   @end:
 END;
END;

(*
  Zwraca adres sterownika pamieci XMS
*)
FUNCTION XMSGetAddress : Pointer;
VAR
 XMSSeg : Word;
 XMSOfs : Word;
BEGIN
 ASM
   mov ax, $4310
   int $2f
   mov XMSSeg, es
   mov XMSOfs, bx
 END;
 XMSGetAddress := Ptr (XMSSeg,XMSOfs);
END;

(*
  Zwraca wersje sterownika pamieci XMS
*)
FUNCTION XMSVersion : Word;
BEGIN
 ASM
   mov ax, $0000
   call [XMSAddress]
   mov @result, ax
 END;
END;

(*
  Sprawdza czy mozna uzywac pamiec XMS
*)
FUNCTION XMSSetup : Boolean;
BEGIN
 XMSSetup := TRUE;
 IF (XMSFind)
   THEN XMSAddress := XMSGetAddress
   ELSE XMSSetup := FALSE;
END;

(*
  Zwraca ilosc wolnej pamieci XMS w KB
*)
FUNCTION XMSMemAvail : Word;
BEGIN
 ASM
   mov ax, $0800
   call [XMSAddress]
   mov @result, dx
 END;
END;

(*
  Zwraca wielkosc najwiekszego wolnego bloku w KB
*)
FUNCTION XMSMaxAvail : Word;
BEGIN
 ASM
   mov ax, $0800
   call [XMSAddress]
   mov @result, ax
 END;
END;

FUNCTION XMSGetMem (Var Handler : Word ; Size : Word) : Boolean;
BEGIN
 ASM
   mov @result, TRUE
   mov ax, $0900
   mov dx, Size
   call [XMSAddress]
   les di, Handler
   mov [es:di], dx
   cmp ax, 1
   je @end
   mov XMSError, bl
   mov @result, FALSE
   @end:
 END;
END;

FUNCTION XMSReGetMem (Handler : Word ; Size : Word) : Boolean;
BEGIN
 ASM
   mov @result, TRUE
   mov ax, $0f00
   mov bx, Size
   mov dx, Handler
   call [XMSAddress]
   cmp al, 1
   je @end
   mov XMSError, bl
   mov @result, FALSE
   @end:
 END;
END;

FUNCTION XMSFreeMem (Handler : Word) : Boolean;
BEGIN
 ASM
   mov @result, TRUE
   mov ax, $0a00
   mov dx, Handler
   call [XMSAddress]
   cmp ax, 1
   je @end
   mov XMSError, bl
   mov @result, FALSE
   @end:
 END;
END;

FUNCTION XMSMoveMem (SrcHandler : Word ; SrcOffset : Pointer ;
                     DstHandler : Word ; DstOffset : Pointer ; Size : Longint) : Boolean;
BEGIN
 WITH XMSBlockInfo DO
 BEGIN
   Length := Size;
   SourceHandler := SrcHandler;
   SourceOffset := SrcOffset;
   DestinationHandler := DstHandler;
   DestinationOffset := DstOffset;
 END;
 ASM
   mov @result, TRUE
   mov ax, seg XMSBlockInfo
   mov ds, ax
   mov si, offset XMSBlockInfo
   mov ax, $0b00
   call [XMSAddress]
   cmp ax, 1
   je @end
   mov XMSError, bl
   mov @result, FALSE
   @end:
 END;
END;

FUNCTION XMSGetError (Error : Byte) : String;
VAR
 ErrorInfo : String;
BEGIN
 CASE Error OF
  $80 : ErrorInfo := '';
 END;
END;

BEGIN

END.