DOS TC下16MB扩展内存的实现
点击次数:38 次 发布日期:2008-12-01 11:59:45 作者:源代码网
|
源代码网推荐
/*-------------------------------------------------------- 扩展内存(XM)基本功能的使用。 作者:李红伟 网址:http://huaigong.myrice.com QQ:86608635 (有问题请访问我的主页)--------------------------------------------------------*/#include void far (*FunctionXMS)() = 0L; /* XMS服务程序入口地址 */int LargestXMS = 0; /* 最大自由扩充内存块尺寸 */int AmountOfXMS = 0; /* 自由扩充内存总量 */int ErrorNo = 0;/*- 通过XMS规范使用扩充内存所用的数据结构和全局变量的定义 -*/struct /* 扩充内存移动结构定义 */{ unsigned long len; /* 需传输的数据字节数(32位) */ unsigned sour_han; /* 源数据块句柄 */ unsigned long sour_off; /* 源偏移量(32位) */ unsigned dest_han; /* 目标数据块句柄 */ unsigned long dest_off; /* 目标偏移量(32位) */} Emb; /* 扩充内存移动结构变量 */void SizeofXMS(void){ if(FunctionXMS) { _AH = 8; (*FunctionXMS)(); /* 调用XMS服务程序 */ LargestXMS = _AX; AmountOfXMS = _DX; ErrorNo = _BL; }}void InitXMS(void){ /*-- 检查XMS驱动程序是否已经安装 ------*/ _AX = 0x4300; geninterrupt(0x2f); if(_AL==0x80) { /*-- 取得XMS服务程序的入口地址 ----*/ _AX = 0x4310; geninterrupt(0x2f); FunctionXMS = MK_FP(_ES,_BX); /*-- 最大自由扩充内存的大小 -------*/ SizeofXMS(); }}int GetXMS(int size){ int handle = 0; if(FunctionXMS) { _DX = size; /* 扩充内存块大小,单位为K字节 */ _AH = 0x09; (*FunctionXMS)(); /* 调用XMS服务程序 */ if(_AX) { handle = _DX; SizeofXMS(); } else ErrorNo = _BL; } return handle;}void FreeXMS(int handle){ if(FunctionXMS) { /*-- 释放扩充内存块 ---------------*/ _DX = handle; _AH = 0x0a; (*FunctionXMS)(); /*-- 修改扩充内存块的长度 ---------*/ if(_AX) SizeofXMS(); else ErrorNo = _BL; }}void MoveDataXMS(void){ if(FunctionXMS) { _DS = FP_SEG(&Emb); _SI = FP_OFF(&Emb); _AH = 0x0b; (*FunctionXMS)(); if(_AX) ErrorNo = 0; else ErrorNo = _BL; }} 源代码网供稿. |