📄 xms.c
字号:
#ifndef XCGXMSH
#define XCGXMSH
#pragma inline
#include<dos.h>
#include<stdio.h>
#include<stdlib.h>
#include"myerro.c"
static void far *XMSaddr=NULL;
static struct XMSEMB
{
unsigned long leng;
unsigned int shandle;
unsigned long soffset;
unsigned int dhandle;
unsigned long doffset;
}xmsemb;
struct XMS
{
unsigned int xms_handle;
unsigned long xms_offset;
unsigned int xms_blocksize;
};
void xms_init(void)
{
union REGS regs;
struct SREGS sregs;
regs.x.ax=0x4300;
int86(0x2f,®s,®s);
if(regs.h.al!=0x80){ xcgerrono=3; exit(3); }
else
{
regs.x.ax=0x4310;
int86x(0x2f,®s,®s,&sregs);
XMSaddr=MK_FP(sregs.es,regs.x.bx);
}
}
struct XMS * xms_alloc(unsigned int Ksize)
{
struct XMS *xp;
unsigned int handle,erroNo;
xp=(struct XMS *)malloc(8);
if(xp==NULL) { xcgerrono=11; exit(11); }
asm MOV AH,9
asm MOV DX,Ksize
asm CALL XMSaddr
asm MOV handle,DX
asm MOV erroNo,AX
if (erroNo==1)
{
xp->xms_handle=handle; xp->xms_offset=0; xp->xms_blocksize=Ksize;
return (xp);
}
else { xcgerrono=12; exit(12); } return(0);
}
void xms_free(struct XMS *p)
{
unsigned int handle;
handle=p->xms_handle;
asm MOV AH,0AH
asm MOV DX,handle
asm CALL XMSaddr
free(p);
}
void xms_move()
{
unsigned int xseg,xoff,result;
xseg=FP_SEG(&xmsemb); xoff=FP_OFF(&xmsemb);
asm MOV AH,0BH
asm PUSH DS
asm POP ES
asm PUSH DS
asm MOV DS,xseg
asm MOV SI,xoff
asm CALL XMSaddr
asm POP DS
asm MOV result,AX
if(result!=1){ xcgerrono=13; exit(13); }
}
void xms_seek(struct XMS *p,unsigned long off)
{
p->xms_offset=off;
}
void xms_read(void *p,unsigned long leng,struct XMS *xp)
{
xmsemb.leng=leng;
xmsemb.shandle=xp->xms_handle;
xmsemb.soffset=xp->xms_offset;
xmsemb.dhandle=0;
xmsemb.doffset=(unsigned long)p;
xms_move(); xp->xms_offset+=leng;
}
void xms_write(struct XMS *xp,unsigned long leng,void *p)
{
xmsemb.leng=leng;
xmsemb.shandle=0;
xmsemb.soffset=(unsigned long)p;
xmsemb.dhandle=xp->xms_handle;
xmsemb.doffset=xp->xms_offset;
xms_move(); xp->xms_offset+=leng;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -