DOS DM&P XMS库参考手册

2002/04/18 Version 0.10

DOS XMS库

DOS XMS库是一个DOS系统实模式下大型记忆体模型的C语言库。DOS系统运行在实模 式下,开发人员仅仅可以访问1M以下的RAM;用户可用容量是640KB,剩余384KB保留 用于ROM BIOS或者其它卡。借助XMS驱动器,XMS库可以帮助M6117D开发人员轻松 访问DOS系统1M以上的RAM。对于X-DOS系统,配置文件“CONFIG.SYS”中加入 “DOS=HIGH”,X-DOS系统将会激活XMS驱动器。

注意: 调用XMS函数时,内存大小务必为偶数。 例如,文件“DEMO.C”中字符串“szStr” 包含15个字符,它的长度是16(15+1‘\0’);如果将它的长度修改为奇数,程序出错。

如果你有任何问题,请联系我们,邮件地址:tech@dmp.com.cn


int XMS_Init();

说明: 初始化XMS驱动器
参数:
返回参数; 0:失败;其它:成功
举例:

/* Initialize XMS driver */
if(XMS_Init() == 0)
{
  printf("Unable to find XMS driver.\n");
  return;
}

unsigned int XMS_GetVer();

说明: 获取XMS驱动器版本号
参数:
返回参数; XMS驱动器版本号
举例:

/* Show XMS version */
printf("XMS Version: %x\n", XMS_GetVer());

void XMS_GetFree(unsigned int *pnMax, unsigned int *pnTotal);

说明: 查询空闲内存,统计最大可用空间
参数:
pnMax 指向保存最大可用空间(单位: KBytes)的指针
pnTotal 指向保存总内存空闲空间(单位:KBytes)的指针
举例:

unsigned int  nMax, nTotal;
XMS_GetFree(&nMax, &nTotal);
printf("Free memory: max=%u KB, total=%u KB.\n", nMax, nTotal);

int XMS_Allocate(unsigned int nSize, unsigned int *pHandle);

说明: 分配XMS内存
参数:
返回参数; 0:失败;其它:成功
nSize 希望分配内存的大小(单位:KBytes)
pHandle 指向保存句柄的指针
举例:

unsigned int  Handle;
if(XMS_Allocate(1, &Handle) == 0)
{
  printf("failed!\n");
  return;
}

int XMS_Free(unsigned int Handle);

说明: 释放已分配的XMS内存
参数:
返回参数; 0:失败;其它:成功
Handle 内存句柄
举例:

/* Free XMS we allocated */
XMS_Free(Handle);

int XMS_GetInfo(unsigned int Handle, unsigned char *pcLockCounter,unsigned char *pcAvailHandle, unsigned int *nSize);

说明: 获取句柄信息
参数:
返回参数; 0:失败;其它:成功
Handle 内存句柄
pcLockCounter 句柄锁定计数器
pcAvailHandle 可用句柄
nSize 句柄内存大小
举例:

/* Show handle information */
XMS_GetInfo(Handle, &cLockCounter, &cAvailHandle, &nSize);
printf("Block info: ");
printf("lock counter=%u, ", cLockCounter);
printf("available handle=%u, ", cAvailHandle);
printf("size=%u KB.\n", nSize);

int XMS_Copy(struct XMMS *pXMMS);

说明: 拷贝内存数据
参数:
返回参数; 0:失败;其它:成功
pXMMS 指向移动扩展内存结构(XMMS)的指针

XMMS结构如下:

struct XMMS
{
  unsigned long lLen;       /* length */
  unsigned int  SrcHandle;  /* source handle */
  unsigned long lSrcOffset; /* source offset */
  unsigned int  DstHandle;  /* destination handle */
  unsigned long lDstOffset; /* destination offset */
};
举例:

XMMS XMMS;
XMMS.lLen = lLen;
XMMS.SrcHandle = SrcHandle;
XMMS.lSrcOffset = lSrcOffset;
XMMS.DstHandle = 0;
((unsigned int *)(&XMMS.lDstOffset))[0] = FP_OFF(pDst);
((unsigned int *)(&XMMS.lDstOffset))[1] = FP_SEG(pDst);
XMS_Copy(&XMMS);

int XMS_CopyToXMS(unsigned int DstHandle, unsigned long lDstOffset,const void far *pSrc, unsigned long lLen);

说明: 拷贝内存缓冲区数据到XMS
参数:
返回参数; 0:失败;其它:成功
DstHandle 目的句柄
lDstOffset 目的地址偏移量
pSrc 指向源内存数据的指针
lLen 希望拷贝的数据长度
举例:

XMS_CopyToXMS(Handle, 0, pcBuf, BUF_SIZE);

int XMS_CopyFromXMS(void far *pDst, unsigned int SrcHandle,unsigned long lSrcOffset, unsigned long lLen);

说明: 拷贝XMS数据到内存缓冲区
参数:
返回参数; 0:失败;其它:成功
pDst 指向内存缓冲区的指针
SrcHandle XMS句柄
lSrcOffset 源内存地址偏移量
lLen 拷贝数据长度
举例:

XMS_CopyFromXMS(pcBuf, Handle, 0, BUF_SIZE);

Jan Yin Chan Electronics Co., LTD.保留所有权利。 邮件地址:tech@dmp.com.cn