📄 xms_demo.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)█
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 + -