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

📄 xms.c

📁 你有没有用c语言编程时申请不到内存(申请内存太多的原因)的情况
💻 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,&regs,&regs);
  if(regs.h.al!=0x80){ xcgerrono=3; exit(3); }
  else
  {
    regs.x.ax=0x4310;
    int86x(0x2f,&regs,&regs,&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 + -