Unit: XMS
Extended memory (XMS) access via HIMEM.SYS (1992, KIV without Co).
Types
type
EMMstruct = record
Size: LongInt; { Transfer size in bytes }
SOH: Word; { Source handle (0=conventional memory) }
SOO: LongInt; { Source offset }
DSH: Word; { Destination handle (0=conventional memory) }
DSO: LongInt; { Destination offset }
end;
Globals
var
XMSerror: Byte; { Last error code }
Functions
Detection
function XMSinstalled: Boolean;
Memory Allocation
procedure GetXMSmem(var Total, Block: Word);
function AllocXMS(KB: Word): Word; { Returns handle }
function ReallocXMS(Handle: Word; KB: Word): Boolean;
procedure FreeXMS(Handle: Word);
Transfer
procedure MoveXMS(var EMM: EMMstruct); procedure Mem2Xms(var Buf; Count: Word; Handle: Word; Offset: LongInt); procedure Xms2Mem(Handle: Word; Offset: LongInt; var Buf; Count: Word);
Locking
function LockBlock(Handle: Word; var Address: LongInt): Boolean; function UnlockBlock(Handle: Word): Boolean;
Info
procedure GetXMShandleInfo(Handle: Word; var LockCount, FreeHandles, Size: Word); function XMSerrorMSG(Error: Byte): string;
HMA
function RequestHMA(Mem: Word): Boolean; procedure ReleaseHMA;
Example (Sound Bank)
uses XMS, SBDSP;
var
Handle: Word;
Buffer: array[0..16383] of Byte;
begin
if not XMSinstalled then
begin
WriteLn('HIMEM.SYS not loaded!');
Exit;
end;
{ Allocate 64KB XMS }
Handle := AllocXMS(64);
if Handle = 0 then
begin
WriteLn('XMS allocation failed: ', XMSerrorMSG(XMSerror));
Exit;
end;
{ Upload sound data }
Mem2Xms(Buffer, SizeOf(Buffer), Handle, 0);
{ Download to DMA buffer }
Xms2Mem(Handle, 0, Buffer, SizeOf(Buffer));
{ Free XMS memory }
FreeXMS(Handle);
end;
Critical: Handle=0 Convention
When Handle=0 in EMMstruct, offset is pointer (Seg:Ofs), NOT linear address:
var
EMM: EMMstruct;
Buf: array[0..1023] of Byte;
begin
EMM.Size := 1024;
EMM.SOH := 0; { Source = conventional memory }
EMM.SOO := LongInt(@Buf); { Pointer (Seg:Ofs) }
EMM.DSH := XMSHandle; { Dest = XMS memory }
EMM.DSO := 0; { Linear offset }
MoveXMS(EMM);
end;
Error Codes
| Code | Message |
|---|---|
| 0x80 | Not implemented |
| 0x81 | VDISK detected |
| 0x82 | A20 error |
| 0xA0 | All memory allocated |
| 0xA1 | All handles allocated |
| 0xA2 | Invalid handle |
| 0xA3 | Source handle invalid |
| 0xA4 | Source offset invalid |
| 0xA5 | Destination handle invalid |
| 0xA6 | Destination offset invalid |
| 0xA7 | Length invalid |
| 0xAB | Block locked |
| 0xAC | Block locked |
Requirements
- HIMEM.SYS in CONFIG.SYS:
DEVICE=C:\DOS\HIMEM.SYS
Notes
- Used by SNDBANK for large sound buffers
- Max 286/386 extended memory (above 1MB)
- Handles DMA 64KB boundary crossing automatically in SNDBANK
GetXMSmemreturns total and largest block in KB