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

📄 xms.cpp

📁 djgpp bt878 capture for DOS
💻 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, &regs);
    
    if(regs.h.al != 0x80) {
        status = 1;
        return;
    }

    regs.x.ax = 0x4310;
    __dpmi_int(0x2F, &regs);
    
    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(&regs);
    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(&regs);
    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(&regs);
    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(&regs);
    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(&regs);
    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 + -