⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmsarray.h

📁 提供使用扩展内存XMS完成大数组的类
💻 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 + -