📄 xmsarray.h
字号:
//////////////////////////////////////////////////
//提供使用扩展内存完成大数组的类,
//用法:CXmsArray<类型> 变量名(数组大小);
//注意:数组类型的大小必须是偶数
//编制人:张洪波 云南师范大学数学学院
//时间2004年09月27日
//#include "XmsArray.h"
/////////////////////////////////////////////////
#if (!__LARGE__)
#error You must choose Large Memory Model at compile time(选择大模式编译)
#endif
#ifndef _CLASS_CXmsArray_H_
#define _CLASS_CXmsArray_H_
#include<dos.h>
#include <stdlib.h>
template<class TYPE> class CXmsArray
{
public:
CXmsArray(unsigned short int uSize=0);
~CXmsArray();
unsigned short int SetSize(unsigned short int uSize);
unsigned short int GetSize();
TYPE &operator[](long int nIndex);
private:
unsigned short int AllocXMS(unsigned short int sizeKB);
void InitXMS();
void FreeXMS();
void (far *m_FunctionXMS)(); //XMS服务程序入口地址 */
unsigned short int m_XmsHandle; //页句柄
unsigned short int m_nMaxSize; //数组元素的个数
TYPE m_pData;
long int m_lOldIndex;
};
template<class TYPE> CXmsArray<TYPE>::CXmsArray(unsigned short int uSize=0)
{
//数组基本元素的类型必须是偶数,否则不能运行,
short int TypeSize= sizeof(TYPE);
if(TypeSize&0x1)
{
printf("\nProgram Code have Error!!!!!\nthe Size of Type must is Even Number.");
exit(0);
}
m_FunctionXMS=0L;
m_XmsHandle=0;
m_nMaxSize=0;
m_lOldIndex=-1;
InitXMS();
if(uSize) SetSize(uSize);
}
template<class TYPE> CXmsArray<TYPE>::~CXmsArray()
{
FreeXMS();
}
template<class TYPE> void CXmsArray<TYPE>::InitXMS(void)
{
m_FunctionXMS=0L;
//检查XMS驱动程序是否已经安装
_AX = 0x4300;
geninterrupt(0x2f);
if(_AL==0x80)
{
//取得XMS服务程序的入口地址
_AX = 0x4310;
geninterrupt(0x2f);
m_FunctionXMS =(void (far *)())(((unsigned long)(_ES)<<16)+_BX);
}
else
{
printf("\nXMS Not Found!!!!!");
}
}
template<class TYPE> void CXmsArray<TYPE>::FreeXMS()
{
if(m_XmsHandle)
{
//释放扩充内存块
_DX =m_XmsHandle;
_AH = 0x0a;
(*m_FunctionXMS)();
m_XmsHandle=0;
}
}
template<class TYPE> unsigned short int CXmsArray<TYPE>::AllocXMS(unsigned short int sizeKB)
{
if(m_XmsHandle) FreeXMS();
if(m_FunctionXMS)
{
_DX = sizeKB; //扩充内存块大小,单位为K字节
_AH = 0x09;
(*m_FunctionXMS)(); //调用XMS服务程序
if(_AX) m_XmsHandle =_DX;
}
return m_XmsHandle;
}
template<class TYPE> unsigned short int CXmsArray<TYPE>::SetSize(unsigned short int uSize)
{
m_nMaxSize=0;
m_lOldIndex=-1;
if(m_XmsHandle) FreeXMS();
if(m_FunctionXMS)
{
m_nMaxSize=uSize;
if(AllocXMS((unsigned short int)((1L*m_nMaxSize*sizeof(TYPE)+1023)/1024L))==0)
{
m_nMaxSize=0;
printf("\nMemory Not Enough!!!!!");
}
}
return m_nMaxSize;
}
template<class TYPE> unsigned short int CXmsArray<TYPE>::GetSize()
{
return m_nMaxSize;
}
template<class TYPE> TYPE & CXmsArray<TYPE>::operator[](long int nIndex)
{
#define ULongInt(s) (*(unsigned long int *)(s))
#define UShortInt(s) (*(unsigned short int *)(s))
static char Emb[18];//XMS_Move_Data
//要移动的字节数(必须是偶数)+0
//源句柄(0 表示常规内存) +4
//源块中的偏移量 +6
//目的句柄(0 表示常规内存) +10
//目的块中的偏移量 +12
if((nIndex<0)||(nIndex>m_nMaxSize))
{
printf("\nnIndex=%ld,m_nMaxSize=%ld,Error!!!",nIndex,m_nMaxSize);
return m_pData;
}
if(m_XmsHandle==0)
{
printf("\nUse Xms Handle =0,ERROR!!!");
return m_pData;
}
if(m_lOldIndex>=0)
{
//写回XMS
ULongInt(Emb+0)=sizeof(TYPE); //要移动的字节数(必须是偶数)
UShortInt(Emb+4)=0; //源句柄(0 表示常规内存)
ULongInt(Emb+6)=(long)&m_pData; //源块中的偏移量
UShortInt(Emb+10)=m_XmsHandle; //目的句柄(0 表示常规内存)
ULongInt(Emb+12)=1L*sizeof(TYPE)*m_lOldIndex; //目的块中的偏移量
_DS =(unsigned short int)(((unsigned long)(&Emb))>>16);
_SI =(unsigned short int)(((long)(&Emb))&0xFFFF);
_AH = 0x0b;
(*m_FunctionXMS)();
}
if(m_lOldIndex!=nIndex)
{
m_lOldIndex=nIndex;
ULongInt(Emb+0)=sizeof(TYPE); //要移动的字节数(必须是偶数)
UShortInt(Emb+4)=m_XmsHandle; //目的句柄(0 表示常规内存)
ULongInt(Emb+6)=1L*sizeof(TYPE)*m_lOldIndex; //目的块中的偏移量
UShortInt(Emb+10)=0; //源句柄(0 表示常规内存)
ULongInt(Emb+12)=(long)&m_pData; //源块中的偏移量
_DS =(unsigned short int)(((unsigned long)(&Emb))>>16);
_SI =(unsigned short int)(((long)(&Emb))&0xFFFF);
_AH = 0x0b;
(*m_FunctionXMS)();
}
return m_pData;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -