📄 xms.cpp
字号:
#include "xms.h"
#include <stdio.h>
#include <sys\segments.h>
XMS::XMS()
{
Init();
}
XMS::XMS(WORD length)
{
Init();
if(status != 0)
return;
Allocate(length);
}
XMS::~XMS()
{
if(xms_handle != NULL)
{
Free();
}
}
void XMS::Init()
{
phys_addr = NULL;
xms_handle = NULL;
regs.x.ax = 0x4300;
__dpmi_int(0x2f, ®s);
if(regs.h.al != 0x80) {
status = 1;
return;
}
regs.x.ax = 0x4310;
__dpmi_int(0x2F, ®s);
xmsEntry[1] = regs.x.es;
xmsEntry[0] = regs.x.bx;
status = 0;
}
WORD XMS::GetXMSVersion()
{
int return_value;
regs.x.cs = xmsEntry[1];
regs.x.ip = xmsEntry[0];
regs.x.ax = 0;
regs.x.ss = 0;
regs.x.sp = 0;
return_value = __dpmi_simulate_real_mode_procedure_retf(®s);
if(return_value == -1) {
status = 2;
return 0;
}
status = 0;
return regs.x.ax;
}
void XMS::Allocate(DWORD len)
{
int return_value;
len = (len + 0xfff) / 0x1000 * 4;
regs.x.cs = xmsEntry[1];
regs.x.ip = xmsEntry[0];
regs.x.ax = 0x900;
regs.x.dx = len;
regs.x.ss = 0;
regs.x.sp = 0;
return_value = __dpmi_simulate_real_mode_procedure_retf(®s);
if(return_value == -1) {
status = 2;
return;
}
if(regs.x.ax != 1) {
status = 3;
return;
}
xms_handle = regs.x.dx;
regs.x.cs = xmsEntry[1];
regs.x.ip = xmsEntry[0];
regs.x.ax = 0x0c00;
regs.x.dx = xms_handle;
regs.x.ss = 0;
regs.x.sp = 0;
return_value = __dpmi_simulate_real_mode_procedure_retf(®s);
if(return_value == -1) {
status = 2;
return;
}
if(regs.x.ax != 1) {
status = 4;
return;
}
phys_addr = (((DWORD)regs.x.dx << 16) |
((DWORD)regs.x.bx & 0xffff) + 0x3ff) >> 12 << 12;
status = 0;
}
void XMS::Free()
{
int return_value;
regs.x.cs = xmsEntry[1];
regs.x.ip = xmsEntry[0];
regs.x.ax = 0x0d00;
regs.x.dx = xms_handle;
regs.x.ss = 0;
regs.x.sp = 0;
return_value = __dpmi_simulate_real_mode_procedure_retf(®s);
if(return_value == -1) {
status = 2;
return;
}
if(regs.x.ax != 1) {
status = 5;
return;
}
regs.x.cs = xmsEntry[1];
regs.x.ip = xmsEntry[0];
regs.x.ax = 0x0a00;
regs.x.dx = xms_handle;
regs.x.ss = 0;
regs.x.sp = 0;
return_value = __dpmi_simulate_real_mode_procedure_retf(®s);
if(return_value == -1) {
status = 2;
return;
}
if(regs.x.ax == 0) {
status = 6;
return;
}
}
DWORD XMS::GetPhysicalAddress()
{
return phys_addr;
}
char* XMS::ErrString()
{
char* str[]={
"",
"XMS is absent.",
"simulate real mode error.",
"memory not allocated.",
"memory not locked.",
"memory not unlocked.",
"memory not free."
};
sprintf(buf, "XMS error %d: %s", status, str[status]);
return (char*)buf;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -