扩展内存XMS

1: DOS根目录下的“Config.Sys”文件须加载himem.Sys文件.

2:头文件是“Memory.h”,类名是“CXmsMemory”

3:主要接口有

     int      GetVersion(); //得到版本号

    BOOL     GetFreeInformation(WORD* pwMaxFreeBlock, WORD* pwTotalFreeBlock);//得到自由XMS信息

     BOOL     MallocXms(DWORD  dwCount);//分配扩展内存

     BOOL     FreeXms();//释放扩展内存

     BOOL     RemallocXms(DWORD  dwCount);//重新分配扩展内存

    BOOL     LockXms();//锁住内存块

    BOOL     UnlockXms();//内存块加锁

    BOOL     Fill(char nCh);//将已分配的XMS全部填充成指定的字符

void     SetWrite(BOOL bWrite);//将XMS置成“脏”标志

BOOL     GetWrite();//判断XMS是否是“脏”的

static BOOL     MallocHma(WORD wSize);//分配HMA内存

    static BOOL     FreeHma();//释放HMA内存

    static BOOL     MallocUmb(DWORD dwSize, WORD* pwUmbNumber);//分配UMB内存

    static BOOL     FreeUmb(WORD wUmbNumber);//释放UMB内存

     BOOL     SetSize(DWORD dwSize, DWORD dwCount = 1);//设置扩展内存的大小

     BOOL     SetSizeEx(DWORD dwSize, DWORD dwCount = 1);//得新设置扩展内存的大小

     BOOL     LoadFile(char *strFile, DWORD dwIndex = 0);//装入文件

     BYTE*    GetPoint(DWORD dwIndex, int nCount = 1);//得到指定索引字节的指针

    BYTE     GetByteData(DWORD dwIndex);//读字节类型值

     int      GetIntData(DWORD dwIndex);//读整数类型值

     long     GetLongData(DWORD dwIndex);//读长整数类型值

     float    GetFloatData(DWORD dwIndex);//读单精度浮点类型值

     double   GetDoubleData(DWORD dwIndex);//读双精度浮点类型值

     BOOL     SetByteData(DWORD dwIndex,BYTE);//写字节类型值

     BOOL     SetIntData(DWORD dwIndex,int);//写整数类型值

     BOOL     SetLongData(DWORD dwIndex,long);//写长整类型值

     BOOL     SetFloatData(DWORD dwIndex,float);//写单精度浮点类型值

     BOOL     SetDoubleData(DWORD dwIndex,double);//写双精度浮点类型值

     BYTE*    GetByteData(DWORD dwIndex, BYTE* pByte, DWORD dwCount);//读指定字节串

     BOOL     SetByteData(DWORD dwIndex, BYTE* pByte, DWORD dwCount);//写指定字节串

    int      GetXmsPageLength();//得到XMS页宽度

     CXmsMemory();//默认256字节页宽度的构造函数

    CXmsMemory(int nPageLength); //指定字节页宽度的构造函数

4:本系统的页框是分配在“常规内存”中,故请不要开辟太大的页框,默认是256字节。

 

5:设置目标主板的“扩展内存”类型

    在可执行文件的目录中,有一个“Config.Sys”文件,注意[Boot]段的“XmsStyle”键值,

它的意义如下:

      XmsStyle = 0  ;标准扩展内存

      XmsStyle = 1  ;用磁盘仿真扩展内存

XmsStyle = 2  ;PCM3486目标板专用的扩充内存卡

 

字库的XMS内存分配

系统内核有一个变量CXmsMemory  mAfxXmsFontMemory扩展内存可供调用,其帧窗口的大小是4K字节,其内部分配如下。(注:系统拥有修改内部位置的权力, 最好通过调用函数来得到其指针),如果用户想借用该XMS来多扩展Size字节的XMS内存,可以调用mAfxXmsFontMemory->SetSizeEx(mAfxXmsFontMemory->GetSize() + Size);

 

 

280K16 * 16简体或繁体字库(内核使用)

 

 

 

  40K波形测试数据(用户使用)

 

 

20K,测试项目及单位数据(用户使用)

 

 

 

 

2048K,窗口背景数据(内核使用)

 

 

 

 

 

(1) 280K,16 * 16简体或繁体字库可调用GetXms_FontBlock()函数返回以K为单位的起始索引

(2) 40K,波形测试数据可调用GetXms_FontBlock()函数返回以K为单位的起始索引

(3) 20K,测试项目及单位数据可调用GetXms_FontBlock()函数返回以K为单位的起始索引

(4) 1024K,窗口背景数据可调用GetXms_WindowBlock()函数返回以K为单位的起始索引

(4) 尾端,用户自己,GetXms_FreeBlock()函数返回以K为单位的起始索引

(5举例读写波形数据

WORD* GetWaveFromXms(int nIndex) //从字库中的XMS中获得第nIndex个波形首地址

{

    WORD *pXmsData = (WORD *)mAfxXmsFontMemory.GetPoint(

                   1024L* ::GetXms_WaveBlock() +  1L * nIndex * sizeof(WORD) * 2048);

    return(pXmsData);

}

 

void SaveWaveToXms(int nIndex, WORD *pwData, int nCount)//将波形数据写入字库中的XMS

{

    DWORD dwLocation = 1024L* ::GetXms_WaveBlock() +  1L * nIndex * sizeof(WORD) * 2048;

    mAfxXmsFontMemory.SetByteData(dwLocation, (BYTE *)pwData,  1L * sizeof(WORD) * nCount);

}

 

1.        扩充内存EMS

1:,类名是“CEmsMemory”,

2:由于整个EMS同时只有四个页框,故只能有已分配EMS的4个CEmsMemory类同时存在。

3:由于Windows2000不支持EMS,故系统内核从20004年10月起,去掉了EMS支持,请需要访问超过1M内存之外时,请改用CXmsMemory类,原来代码只需将EmsMemory改为“XmsMemory即可。