BOOL input(char far *buf, unsigned long offset, unsigned long len); //len must not be odd?
BOOL output(char far *buf, unsigned long offset, unsigned long len); //len must be even?
BOOL input(CXMSBlock *mem, unsigned long offset1, unsigned long offset, unsigned long len);
BOOL output(CXMSBlock *mem, unsigned long offset1, unsigned long offset, unsigned long len);
BOOL loadFile(const char *fname, unsigned long from, unsigned long length);
};
class far TXmsMem
{
public:
typedef struct
{
unsigned long Size; //must be EVEN number
int SourHandle; //0: Conventional Memory
unsigned long SourOffset; //Offset/Conv. Mem. Address
int DestHandle; //0: Conventional memory
unsigned long DestOffset; //Offset/Conv. Mem. Address
}XMMStrcut;
int far DriverAvailable(void); //return true if xms driver installed
int far ExtendedVersion(void); //return true if > 64M memory supported
unsigned far GetVersion(void); //return BCD XMS Version
unsigned far GetRevision(void); //return BCD XMS Driver Revision
unsigned long far GetBlockFreeXMS(void); //(kb) ErrCode -> _XMS_Err
unsigned long far GetTotalFreeXMS(void); //(kb) ErrCode -> _XMS_Err
int far AllocXMS(int far *XMSHandle, unsigned long kbyte); //(kb) 0:error, ErrCode -> _XMS_Err
int far FreeXMS(int XMSHandle); //0:error, ErrCode -> _XMS_Err
//Size must be an EVEN number
//return 0 -> Error, ErrCode -> _XMS_Err
int far MemCpy(int hD, unsigned long oD, int hS, unsigned long oS, unsigned long Size);
int far LockXMSBlock(int Handle, long *Addr);
int far UnLockXMSBlock(int Handle);
far TXmsMem();
private:
static void far (*_XMS_Proc)(void);
static unsigned far _XMS_Version;
int far fXMSDriverInstalled(void);
void far fInitXMSProc(void);
};
extern TXmsMem far xms;
#endif
//--- xms.cpp
#include "xms.h"
void far (*TXmsMem::_XMS_Proc)(void) = 0;
unsigned far TXmsMem::_XMS_Version = 0x0000;
TXmsMem far xms;
int far TXmsMem::MemCpy(int hD, unsigned long oD, int hS, unsigned long oS, unsigned long Size)
{
//Size must be an EVEN number //return 1 -> Success, 0 -> Error, ErrCode -> _XMS_Err
XMMStrcut XMSS;
int XMSSSgmt, XMSSOfst;
void far (*XMS_Proc)(void)=_XMS_Proc;
XMSS.Size=Size; //must be EVEN number
XMSS.SourHandle=hS;
XMSS.SourOffset=oS;
XMSS.DestHandle=hD;
XMSS.DestOffset=oD;
XMSSSgmt=GetSeg(&XMSS);
XMSSOfst=GetOfs(&XMSS);
asm push ds
asm push es
asm mov si,XMSSSgmt
asm mov ds,si
asm mov si,XMSSOfst
asm mov ah,0x0b
XMS_Proc();
asm pop es
asm pop ds
//asm mov _XMS_Err,bl
return _AX;
}
int far TXmsMem::LockXMSBlock(int Handle, long *Addr)
{
unsigned int HighWord,LowWord,ErrCode;
asm mov ah,0x0c
asm mov dx,Handle
_XMS_Proc();
asm mov ErrCode,ax
asm mov HighWord,dx
asm mov LowWord,bx
//asm mov _XMS_Err,bl
*Addr=((unsigned long)HighWord<<16)+(unsigned long)LowWord;
return ErrCode;
}
int far TXmsMem::UnLockXMSBlock(int Handle)
{
asm mov ah,0x0d
asm mov dx,Handle
_XMS_Proc();
//asm mov _XMS_Err,bl
return _AX;
}
//-- 使用:
int XmsHandle;
if(!xms.AllocXMS(&XmsHandle,260)) //分配内存
{
//错误
}