📄 xms.cpp
字号:
#include<stdio.h>
#include<dos.h>
#include"type.cpp"
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
void far (*HIMEM)();
#ifndef embtype
#define embtype
typedef struct
{ulong bl;
uint sh;
ulong sa;
uint dh;
ulong da;
}EMB;
EMB emb;
void XMSP()
{
uint t;union REGS reg;struct SREGS sreg;
reg.x.ax=0x4310;
int86x(0x2f,®,®,&sreg);
HIMEM=(void (far*)())MK_FP(sreg.es,reg.x.bx);
}
uint XA(uint kb)
{_DX=kb;_AH=9;HIMEM();
if(_AX!=1)return 0xffff;
return _DX;
}
uint XKB()
{_AH=8;HIMEM();
return _AX;
}
void XFREE(uint h)
{_DX=h;_AH=0X0A;HIMEM();}
void XMOV(EMB far *e)
{/*asm push ds;*/
uint ds;void far (*H)();
ds=_DS;H=HIMEM;
_DS=FP_SEG(e);
_SI=FP_OFF(e);
_AH=0X0B;
H();
_DS=ds;
/*asm pop ds;*/
}
uchar XMSI()
{union REGS reg,r;
reg.h.ah=0x43;reg.h.al=0;
int86(0x2f,®,&r);
if(r.h.al!=0x80)return 1;
XMSP();
return 0;
}
uint READ(uint h,uchar far *p,uint s)
{union REGS r;struct SREGS sr;
r.h.ah=0x3f;
r.x.bx=h;
r.x.cx=s;
sr.ds=FP_SEG(p);
r.x.dx=FP_OFF(p);
int86x(0x21,&r,&r,&sr);
if(r.x.cflag)return -1;
return r.x.ax;
}
class XMS
{
public:
uint xh;ulong xl;
XMS::XMS(uint kb);
void XMS::X2B(ulong xd,uchar huge*b,ulong bl);
void XMS::B2X(uchar huge*b,ulong xd,ulong bl);
XMS::~XMS(){XFREE(xh);}
};
XMS::XMS(uint kb)
{
if(XMSI()){ERR(20);return;}
xl=kb*1024;
if((xh=XA(kb))==0xffff){ERR(21);return;}
}
void XMS::X2B(ulong xd,uchar huge*b,ulong bl)
{
emb.bl=bl;emb.sh=xh;emb.sa=xd;
emb.dh=0;emb.da=(ulong)b;
XMOV(&emb);
}
void XMS::B2X(uchar huge*b,ulong xd,ulong bl)
{
emb.bl=bl;emb.dh=xh;emb.da=xd;
emb.sh=0;emb.sa=(ulong)b;
XMOV(&emb);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -