XMSDEMO.C
资源名称:C.rar [点击查看]
上传用户:qq5388545
上传日期:2022-07-04
资源大小:29849k
文件大小:5k
源码类别:

界面编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <dos.h>
  3. #include <string.h>
  4. // Note: If you want to use XMS function 0xB, this simple 
  5. // xms_access routine only works for tiny, small, or medium 
  6. // models where the value of the data segment does not change.
  7. void xms_access (union REGS *inregs, union REGS *outregs)
  8.   {
  9.      union REGS in, out;
  10.      struct SREGS segs;
  11.      unsigned segs_ds, save_bx;
  12.      unsigned flags;
  13.      void far (*xms)(void);  // pointer to the XMS services
  14.      // Get the entry point to the XMS services
  15.      in.x.ax = 0x4310;
  16.      int86x (0x2F, &in, &out, &segs);
  17.      xms = (void far *) (((long) (segs.es) << 16) + out.x.bx);
  18.      // Assign the input registers to the actual registers
  19.  
  20.      _AX = inregs->x.ax;
  21.      _CX = inregs->x.cx;
  22.      _DX = inregs->x.dx;
  23.      _SI = inregs->x.si;
  24.      _DI = inregs->x.di;    
  25.      _BX = inregs->x.bx;
  26.     xms();   // Call the XMS entry point.
  27.     // Assign the registers to the output register structure  
  28.     asm {     
  29.       pushf
  30.       push bx
  31.       pop save_bx
  32.       pop flags
  33.     }
  34.     outregs->x.ax = _AX;
  35.     outregs->x.bx = save_bx;
  36.     outregs->x.cx = _CX;
  37.     outregs->x.dx = _DX;
  38.     outregs->x.si = _SI;
  39.     outregs->x.di = _DI;
  40.     outregs->x.cflag = flags & 1;
  41.     outregs->x.flags = flags;
  42.   }
  43. void main (void)
  44.   {
  45.     union REGS inregs, outregs;
  46.     struct SREGS segs;
  47.     FILE *data;
  48.     char data_buffer[256];
  49.     struct xms_move {
  50.      long byte_count;         // Number of bytes to move
  51.      unsigned source_handle;  // Data to move
  52.      long source_offset;           
  53.      unsigned destination_handle;  
  54.      long destination_offset;
  55.     } block; 
  56.     unsigned handle;
  57.     int string_length;
  58.     long character_count = 0L;
  59.     int transfer_error = 0;   // 1 if a transfer error occurs  
  60.     int i, extra_byte;
  61.     void xms_access (union REGS *, union REGS *); 
  62.     inregs.x.ax = 0x4300;
  63.     int86 (0x2F, &inregs, &outregs);
  64.     if (outregs.h.al != 0x80)
  65.       printf ("XMS driver not installedn");
  66.     else
  67.       {
  68.  // Allocate the extended memory 
  69.  inregs.h.ah = 9;
  70.  inregs.x.dx = 64;  // Size 64Kb
  71.  xms_access (&inregs, &outregs);         
  72.  if (outregs.x.ax == 0)
  73.    printf ("Error allocating extended memory %2xHn",
  74.      outregs.h.bl);
  75.  else
  76.    {
  77.      handle = outregs.x.dx;
  78.      // Read the file into a conventional memory
  79.      // buffer and then move the data to extended memory
  80.  
  81.      if ((data = fopen ("\AUTOEXEC.BAT", "r")) == NULL)
  82.        printf ("Error opening AUTOEXEC.BATn");
  83.      else
  84.        {
  85.  segread (&segs);
  86.  while (fgets (data_buffer, sizeof(data_buffer), data))
  87.    {
  88.      // Copy data_buffer to extended memory 
  89.      string_length = strlen(data_buffer);
  90.      block.byte_count = string_length + 1; 
  91.      // transfer amount must be even
  92.      if (block.byte_count % 2)
  93.        block.byte_count++;
  94.      block.source_handle = 0; 
  95.      block.source_offset = (void far *)
  96.  MK_FP(segs.ds, data_buffer);
  97.      block.destination_handle = handle;
  98.      block.destination_offset = character_count;
  99.      character_count += string_length + 1;
  100.      inregs.h.ah = 0xB;
  101.      inregs.x.si = (unsigned) &block;
  102.      xms_access (&inregs, &outregs);
  103.      if (outregs.x.ax == 0)
  104.        {
  105.   transfer_error = 1;
  106.   break;
  107.        }                                                           
  108.    }
  109.        }
  110.      if (transfer_error)
  111.        printf ("Error in data transfern");
  112.      else
  113.        {
  114.   block.destination_handle = 0;
  115.   block.source_handle = handle;
  116.   block.destination_offset = (void far *)
  117.     MK_FP(segs.ds, data_buffer);
  118.      
  119.   block.source_offset = 0L;
  120.   block.byte_count = sizeof(data_buffer);
  121.   while (block.source_offset <
  122.      character_count)
  123.    {    
  124.      if ((block.byte_count + block.source_offset) 
  125. > character_count)
  126.        block.byte_count = character_count - 
  127.  block.source_offset;
  128.      // Transfer amount must be even
  129.      if (block.byte_count % 2)
  130.        {
  131.  block.byte_count++;
  132.  extra_byte = 1;
  133.        }
  134.      else 
  135.        extra_byte = 0;
  136.      xms_access (&inregs, &outregs);                  
  137.      if (outregs.x.ax == 0)
  138.        {
  139.  transfer_error = 1;
  140.  break; 
  141.        } 
  142.       
  143.      for (i = 0; i < (block.byte_count - 
  144.   extra_byte); i++)
  145.        if (data_buffer[i])
  146.  putchar(data_buffer[i]);
  147.  
  148.      block.source_offset += block.byte_count;
  149.   }                        
  150.        } 
  151.      if (transfer_error)
  152.        printf ("Error in data transfern");  
  153.      // Release extended memory 
  154.      inregs.h.ah = 0x0A;
  155.      inregs.x.dx = handle;
  156.      xms_access (&inregs, &outregs);
  157.      if (outregs.x.ax == 0)
  158.        printf ("Error releasing extending memory %2xHn", 
  159.  outregs.h.bl);
  160.    }  
  161.       }
  162.   }