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

界面编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dos.h>
  4. #include <string.h>
  5. int check_for_ems(void)
  6.   {
  7.      union REGS inregs, outregs;
  8.      struct SREGS segs;
  9.  
  10.      int major, minor;   // DOS version
  11.      struct DeviceHeader {
  12.        struct DeviceHeader far *link;
  13.        unsigned attributes;
  14.        unsigned strategy_offset;
  15.        unsigned interrupt_offset;
  16.        char name_or_number_of_units[8];
  17.      } far *dev;
  18.      int i;
  19.      char driver_name[9];
  20.      // Get the DOS version
  21.      inregs.x.ax = 0x3001;
  22.      intdos (&inregs, &outregs);
  23.      major = outregs.h.al;
  24.      minor = outregs.h.ah;
  25.      if (major < 2)
  26.        return(0);     // Requires DOS 2.0
  27.      else
  28.        {
  29.  // Get the list of lists
  30.  inregs.h.ah = 0x52;
  31.  intdosx (&inregs, &outregs, &segs);
  32.  if (major == 2)
  33.    dev = (struct DeviceHeader far *) 
  34.      MK_FP(segs.es + 1, outregs.x.bx + 7);        
  35.  else if ((major == 3) && (minor == 0))
  36.    dev = (struct DeviceHeader far *)
  37.      MK_FP(segs.es + 2, outregs.x.bx + 8);
  38.  else
  39.    dev = (struct DeviceHeader far *)  
  40.      MK_FP(segs.es + 2, outregs.x.bx + 2);
  41.  while (FP_OFF(dev) != 0xFFFF)
  42.    {
  43.       if (dev->attributes & 0x8000)
  44. {  // Character device
  45.   for (i = 0; i < 8; i++)
  46.     driver_name[i] = dev->name_or_number_of_units[i];
  47.   driver_name[8] = NULL;       
  48. }
  49.   
  50.       if (! strcmp(driver_name, "EMMXXXX0"))
  51. return(1);   // Found driver
  52.    
  53.       dev = dev->link; 
  54.    }
  55.        }
  56.   return(0);
  57. }
  58. void main (void)
  59.   {
  60.     union REGS inregs, outregs;
  61.     struct SREGS segs;
  62.     unsigned handle;
  63.     unsigned page;
  64.     unsigned index, page_number; 
  65.     unsigned page_frame_address;
  66.     char far *data;
  67.     if (check_for_ems())
  68.       {
  69. inregs.h.ah = 0x40;
  70. int86 (0x67, &inregs, &outregs);
  71. // Make sure EMS is functional
  72. if (outregs.h.ah == 0)         
  73.   {
  74.     // Allocate a handle for 5 pages
  75.     inregs.h.ah = 0x43;
  76.     inregs.x.bx = 5;
  77.     int86 (0x67, &inregs, &outregs);
  78.     if (outregs.h.ah == 0)
  79.       {  
  80.  handle = outregs.x.dx; 
  81.  // Get the page frame address
  82.  inregs.h.ah = 0x41;
  83.  int86 (0x67, &inregs, &outregs);
  84.  
  85.  if (outregs.h.ah == 0)
  86.    {                 
  87.      page_frame_address = outregs.x.bx;
  88.      // map the first 4 pages
  89.      for (page_number = 0; page_number < 4; page_number++)
  90.        {
  91.   inregs.h.ah = 0x44;
  92.   inregs.h.al = page_number;  // Physical page
  93.   inregs.x.bx = page_number;  // Logical page
  94.   inregs.x.dx = handle;
  95.   int86 (0x67, &inregs, &outregs);
  96.  
  97.   if (outregs.h.ah != 0)
  98.     {
  99.        printf ("Error mapping pages %xHn",
  100.  outregs.h.ah);
  101.        // Release the handle
  102.        inregs.h.ah = 0x45;
  103.        inregs.x.dx = handle;
  104.        int86 (0x67, &inregs, &outregs);            
  105.        exit(0); 
  106.     } 
  107.        }        
  108.      // Fill the first four pages
  109.      data = (char far *) MK_FP(page_frame_address, 0);
  110.     
  111.      for (index = 0; index < 16384; index++)
  112.        data[index] = 'A';
  113.      for (index = 16384; index < 32768; index++)
  114.        data[index] = 'B';
  115.      for (index = 32768; index < 49152; index++)
  116.        data[index] = 'C';
  117.      for (index = 49152; index != 0; index++)
  118.        data[index] = 'D';
  119.      // Map logical page 4 into physical page 1
  120.      inregs.h.ah = 0x44;
  121.      inregs.h.al = 1;  // Physical page
  122.      inregs.x.bx = 4;  // Logical page
  123.      inregs.x.dx = handle;
  124.      int86 (0x67, &inregs, &outregs);
  125.  
  126.      if (outregs.h.ah != 0)
  127.        {
  128.   printf ("Error mapping page %xHn",
  129.     outregs.h.ah);
  130.   // Release the handle
  131.   inregs.h.ah = 0x45;
  132.   inregs.x.dx = handle;
  133.   int86 (0x67, &inregs, &outregs);            
  134.   exit(0); 
  135.        } 
  136.      // Fill page 4 which resides in page 1
  137.      for (index = 16384; index < 32768; index++)
  138.        data[index] = 'E';
  139.       
  140.      // Display the first 20 bytes of each page
  141.      printf ("Physical Page Zeron");
  142.      for (index = 0; index < 20; index++)
  143.        printf ("%c ", data[index]);
  144.      printf ("nPhysical Page Onen");
  145.      for (index = 16384; index < 16404; index++)
  146.        printf ("%c ", data[index]);
  147.      printf ("nPhysical Page Twon");
  148.      for (index = 32768; index < 32788; index++)
  149.        printf ("%c ", data[index]);
  150.      printf ("nPhysical Page Threen");
  151.      for (index = 49152; index < 49172; index++)
  152.        printf ("%c ", data[index]);
  153.      // Map logical page 1 into physical page 3
  154.      inregs.h.ah = 0x44;
  155.      inregs.h.al = 3;  // Physical page
  156.      inregs.x.bx = 1;  // Logical page
  157.      inregs.x.dx = handle;
  158.      int86 (0x67, &inregs, &outregs);
  159.  
  160.      if (outregs.h.ah != 0)
  161.        {
  162.   printf ("Error mapping page %xHn",
  163.     outregs.h.ah);
  164.   // Release the handle
  165.   inregs.h.ah = 0x45;
  166.   inregs.x.dx = handle;
  167.   int86 (0x67, &inregs, &outregs);            
  168.   exit(0); 
  169.        } 
  170.      printf ("nMapping logical page 1 to physical page 3"); 
  171.      printf ("nPhysical Page Threen");
  172.      for (index = 49152; index < 49162; index++)
  173.        printf ("%c ", data[index]);
  174.    }
  175.  else
  176.    printf ("Error getting base address %xHn",
  177.      outregs.h.ah);
  178.   
  179.  // Release the handle
  180.  inregs.h.ah = 0x45;
  181.  inregs.x.dx = handle;
  182.  int86 (0x67, &inregs, &outregs);            
  183.       }
  184.     else
  185.       printf ("Error allocating 5 pages %xHn", 
  186. outregs.h.ah); 
  187.   }
  188. else 
  189.  printf ("EMM not functionaln");
  190.       }
  191.     else
  192.       printf ("EMS driver not presentn");
  193.   }