unit XMS;
{ XMS Unit, procedures to access XMS functions }
{ }
{ Copyright (c) 1994-95 Balazs Scheidler }
{ }
{ }
{ You can freely use this piece of code as long as }
{ you credit my name, if you use it in a commercial }
{ or shareware product. }
{ }
{ I can be reached at }
{ e-mail: bazsi@vekoll.saturnus.vein.hu }
{ or bazsi@hal2000.vein.hu }
{$G+,S-,V-,R-}
interface
var
XMSHandler: Pointer;
XMSInstalled: Boolean;
XMSErr: Byte;
function XMSGetVersion: Longint;
function XMSAllocHMA(Size: Word): Boolean;
function XMSFreeHMA: Boolean;
function XMSGlobalA20Enable: Boolean;
function XMSGlobalA20Disable: Boolean;
function XMSLocalA20Enable: Boolean;
function XMSLocalA20Disable: Boolean;
function XMSA20Enabled: Boolean;
function XMSMaxEMBAvail: Word;
function XMSMemEMBAvail: Word;
function XMSAllocEMB(Size: Word): Word;
function XMSFreeEMB(Handle: Word): Boolean;
function XMSCopyBlock(DestOfs: Longint; DestHandle: Word; SrcOfs: Longint; SrcHandle:Word;
CopyLen: Longint): Boolean;
function XMSLockEMB(Handle: Word): Longint;
function XMSUnLockEMB(Handle: Word): Boolean;
function XMSGetHandleInfo(Handle: Word; var LockCnt, FreeHandles: Byte; var BlkSize: Word): Boolean;
function XMSResizeEMB(Handle: Word; NewSize: Word): Boolean;
function XMSAllocUMB(Size: Word): Word;
function XMSFreeUMB(Segm: Word): Boolean;
function XMSMemUMBAvail: Word;
implementation
procedure XMSCall; near; assembler;
asm
PUSH SEG @DATA
POP ES
CMP ES:[XMSInstalled],1
JNE @@2
CALL DWORD PTR ES:[XMSHandler]
OR AX,AX
JNE @@1
PUSH DS
PUSH ES
POP DS
MOV XMSErr,BL
POP DS
@@2:
XOR AX,AX
@@1:
end;
function XMSGetVersion: Longint; assembler;
asm
XOR AX,AX
XOR DX,DX
MOV AH,0
CALL XMSCall
XCHG DX,BX
end;
function XMSAllocHMA(Size: Word): Boolean; assembler;
asm
MOV AH,1
CALL XMSCall
end;
function XMSFreeHMA: Boolean; assembler;
asm
MOV AH,2
CALL XMSCall
end;
function XMSGlobalA20Enable: Boolean; assembler;
asm
MOV AH,3
CALL XMSCall
end;
function XMSGlobalA20Disable: Boolean; assembler;
asm
MOV AH,4
CALL XMSCall
end;
function XMSLocalA20Enable: Boolean; assembler;
asm
MOV AH,5
CALL XMSCall
end;
function XMSLocalA20Disable: Boolean; assembler;
asm
MOV AH,6
CALL XMSCall
end;
function XMSA20Enabled: Boolean; assembler;
asm
MOV AH,7
CALL XMSCall
end;
function XMSMaxEMBAvail: Word; assembler;
asm
MOV AH,8
CALL XMSCall
end;
function XMSMemEMBAvail: Word; assembler;
asm
XOR DX,DX
MOV AH,8
CALL XMSCall
MOV AX,DX
end;
function XMSAllocEMB(Size: Word): Word; assembler;
asm
MOV AH,9
MOV DX,Size
CALL XMSCall
OR AL,AL
JZ @@1
MOV AX,DX
@@1:
end;
function XMSFreeEMB(Handle: Word): Boolean; assembler;
asm
MOV DX,Handle
MOV AH,0AH
CALL XMSCall
end;
function XMSCopyBlock(DestOfs: Longint; DestHandle: Word; SrcOfs: Longint; SrcHandle:Word;
CopyLen: Longint): Boolean;
begin
asm
PUSH DS
PUSH SS
POP DS
LEA SI,CopyLen
MOV AH,0BH
CALL XMSCall
MOV @Result,AL
POP DS
end;
end;
function XMSLockEMB(Handle: Word): Longint; assembler;
asm
MOV AH,0CH
MOV DX,Handle
CALL XMSCall
MOV AX,BX
end;
function XMSUnLockEMB(Handle: Word): Boolean; assembler;
asm
MOV AH,0DH
MOV DX,Handle
CALL XMSCall
end;
function XMSGetHandleInfo(Handle: Word; var LockCnt, FreeHandles: Byte; var BlkSize: Word): Boolean; assembler;
asm
MOV DX,Handle
MOV AH,0EH
CALL XMSCall
LES DI,LockCnt
MOV BYTE PTR ES:[DI],BH
LES DI,FreeHandles
MOV BYTE PTR ES:[DI],BL
LES DI,BlkSize
MOV WORD PTR ES:[DI],DX
end;
function XMSResizeEMB(Handle: Word; NewSize: Word): Boolean; assembler;
asm
MOV AH,0FH
MOV BX,NewSize
MOV DX,Handle
CALL XMSCall
end;
function XMSAllocUMB(Size: Word): Word; assembler;
asm
MOV AH,10H
MOV DX,Size
CALL XMSCall
MOV AX,BX
end;
function XMSFreeUMB(Segm: Word): Boolean; assembler;
asm
MOV AH,11H
MOV DX,Segm
CALL XMSCall
end;
function XMSMemUMBAvail: Word; assembler;
asm
MOV AH,10H
MOV DX,0FFFFH
CALL XMSCall
MOV AX,DX
end;
begin
asm
MOV AX,4300H
INT 2FH
CMP AL,80H
JNE @@1
MOV AX,4310H
INT 2FH
MOV WORD PTR XMSHandler[0],BX
MOV WORD PTR XMSHandler[2],ES
MOV XMSInstalled,1
JMP @@2
@@1:
MOV XMSInstalled,0
@@2:
end;
end.
               (
geocities.com/SiliconValley/2926)                   (
geocities.com/SiliconValley)