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

📄 xms_demo.c

📁 操作系统实验教程核心技术与编程实例书中地例子代码
💻 C
字号:
#include<\tc\include\stdio.h>
#include<\tc\include\dos.h>
int xms_demo();
void main(void)
{
	xms_demo();
	exit();
}
int xms_demo()
{
	union REGS inregs,outregs;
	struct SREGS segs;
	unsigned XMS_handle;
	 /*Data structure about moving File :  */
	FILE *fp;
	char buffer[256];
	struct xms_move
	{
		unsigned long int byte_count;        /*Number of bytes to move*/
		unsigned int source_handle;
		unsigned long int source_offset;
		unsigned int destination_handle;
		unsigned long int destination_offset;
	}block;
	int string_length;
	long character_count=0L;
	int transfer_error =0; /*1 if a transfer error occurs */
	int i,extra_byte;
	unsigned long int pp;
	unsigned int block_seg;
	void call_xms(union REGS * ,union REGS *,unsigned int );
	block_seg=FP_SEG(&block);
	/*buffer=(char far *)malloc(sizeof(char));*/
	/************check if XMS driver not installed** start*/
									  /* 2f interrupt 43 function*/
	inregs.x.ax=0x4300;
	int86(0x2f,&inregs,&outregs);
	if(outregs.h.al!=0x80)
	{printf("\nXMS driver not installed");exit(0);};
	/*************Get available XMS size           ** start*/
					 /* function 8 of XMS*/
  inregs.h.ah=8;
  call_xms(&inregs,&outregs,block_seg);
  if (outregs.x.ax==0)
  {  printf("\nError querying free extended memory %2xH",
	  outregs.h.bl);
	  return 1;
  };
  printf("Largest available XMS block %dKB",outregs.x.ax);
  printf("\nTotal free XMS %dKB",outregs.x.dx);
	/*************Allocate the extended memory     ** start*/
					 /* function 9 of XMS*/
  inregs.h.ah=9;
  inregs.x.dx=32000;  /*Size 32000KB */
  call_xms(&inregs,&outregs,block_seg);
  if (outregs.x.ax==0)
  {  printf("\nError allocateing extende memory %2xH",
	  outregs.h.bl);
	  return 1;
  };
  XMS_handle=outregs.x.dx;
  inregs.h.ah=8;
  call_xms(&inregs,&outregs,block_seg);
  if (outregs.x.ax==0)
  {  printf("\nError querying free extended memory %2xH",
	  outregs.h.bl);
	  return 1;
  }
  printf("\n32000KB Extende memory are alocated, ");
  printf("largest available XMS block %dKB",
	  outregs.x.ax);
  printf("\nTotal free XMS %dKB\n",outregs.x.dx);

  /****Read the file into a conventional memory buffer */
  /****and then move the data to extended memory */
  if ((fp=fopen("\\tc\\g\\mode.TXT","r"))==NULL)
  {
	  printf("\nError opening CONFIG.SYS");
	  return 1;
  }
  segread(&segs);
  segs.ds=block_seg;
  while (fgets(buffer,sizeof(buffer),fp))
  {
	  /***Copy buffer to extended momory */
	  string_length=strlen(buffer);
	  block.byte_count=string_length+1;
	  /***Transfer amount must be even */
	  if (block.byte_count%2) block.byte_count++;
	  block.source_handle=0;
	  pp=(void far *)MK_FP(segs.ds,buffer);
	  block.source_offset=pp;
	  block.destination_handle=XMS_handle;
	  block.destination_offset=character_count;
	  character_count+=string_length+1;
	  inregs.h.ah=0xB;
	  inregs.x.si=(unsigned int)&block;
	  call_xms(&inregs,&outregs,block_seg);
	  if (outregs.x.ax==0){transfer_error=1;break;}
  }
  if (transfer_error) {printf("\nError in data transfer11");
		return 1;};
  /****Move the data from extended memory to */
  /**** the conventional memory buffer and display     */
  block.destination_handle=0;
  block.source_handle=XMS_handle;
  block.destination_offset=(void far *)MK_FP(segs.ds,buffer);
  block.source_offset=0L;
  block.byte_count=sizeof(buffer);
  while (block.source_offset<character_count)
  {
	  if ((block.byte_count+block.source_offset)>character_count)
		  block.byte_count=character_count -block.source_offset;
	  if (block.byte_count%2) {block.byte_count++;extra_byte=1;}
	  else extra_byte=0;
	  call_xms(&inregs,&outregs,block_seg);
	  if (outregs.x.ax==0){transfer_error=1;break;}
	  for(i=0;i<(block.byte_count-extra_byte);i++)
	  if (buffer[i]) putchar(buffer[i]);
	  block.source_offset+=block.byte_count;
  }
  if (transfer_error) {printf("\nError in data transfer2");
	  return 1;};
	/**************Release the extended memory     ** start*/
										  /* function 0A of XMS*/
  inregs.h.ah=0x0A;
  inregs.x.dx=XMS_handle;
  call_xms(&inregs,&outregs,block_seg);
  if (outregs.x.ax==0)
  {  printf("\nError releasing extende memory %2xH",
	  outregs.h.bl);
	  return 1;
  };
  inregs.h.ah=8;
  call_xms(&inregs,&outregs,block_seg);
  if (outregs.x.ax==0)
  {  printf("\nError querying free extended memory %2xH",
	  outregs.h.bl);
	  return 1;
  };
  printf("32000KB Extende memory are released, ");
  printf("largest available XMS block %dKB",
	  outregs.x.ax);
  printf("\nTotal free XMS %dKB",outregs.x.dx);
}
void call_xms(union REGS * inregs,union REGS * outregs,unsigned int block_seg)
{
	union REGS in,out;
	struct SREGS segs;
	unsigned segs_ds,save_bx,flags;
	void far (*xms)(void); /*Pointer to the XMS servers */
  /***************Get the entry point to the XMS servers */
	in.x.ax=0x4310;
	int86x(0x2f,&in,&out,&segs);
	xms = (void far *)(((long)(segs.es)<<16)+out.x.bx);
  /**Assign the input registers to the actual registers **/
  _AX=inregs->x.ax;
  _CX=inregs->x.cx;
  _DX=inregs->x.dx;
  _SI=inregs->x.si;
  _DI=inregs->x.di;
  _BX=inregs->x.bx;
  _DS=block_seg;
  xms();  /* Call the XMS entry point */
  /**Assign the registers to the output register structure **/
  asm pushf
  asm push bx
  asm pop save_bx
  asm pop flags
  outregs->x.ax=_AX;
  outregs->x.bx=save_bx;
  outregs->x.cx=_CX;
  outregs->x.dx=_DX;
  outregs->x.si=_SI;
  outregs->x.di=_DI;
  outregs->x.cflag=flags&1;
  outregs->x.flags=flags;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -