showems.c

本文介绍了一个利用EMS内存的示例程序,演示了如何检查EMS驱动是否安装、分配EMS内存、映射物理页面到逻辑页面,并展示了如何通过改变映射来更新页面内容。

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>

int check_for_ems(void)
  {
     union REGS inregs, outregs;
     struct SREGS segs;
 
     int major, minor;   // DOS version

     struct DeviceHeader
   {
       struct DeviceHeader far *link;
       unsigned attributes;
       unsigned strategy_offset;
       unsigned interrupt_offset;
       char name_or_number_of_units[8];
     } far *dev;

     int i;
     char driver_name[9];

     // Get the DOS version
     inregs.x.ax = 0x3001;
     intdos (&inregs, &outregs);
     major = outregs.h.al;
     minor = outregs.h.ah;

     if (major < 2)
       return(0);     // Requires DOS 2.0
     else
       {
   // Get the list of lists
   inregs.h.ah = 0x52;
   intdosx (&inregs, &outregs, &segs);

   if (major == 2)
    dev = (struct DeviceHeader far *)
     MK_FP(segs.es + 1, outregs.x.bx + 7);       
   else if ((major == 3) && (minor == 0))
    dev = (struct DeviceHeader far *)
     MK_FP(segs.es + 2, outregs.x.bx + 8);
   else
    dev = (struct DeviceHeader far *) 
     MK_FP(segs.es + 2, outregs.x.bx + 2);

   while (FP_OFF(dev) != 0xFFFF)
    {
     if (dev->attributes & 0x8000)
   {  // Character device
    for (i = 0; i < 8; i++)
     driver_name[i] = dev->name_or_number_of_units[i];
    driver_name[8] = NULL;      
   }
   
     if (! strcmp(driver_name, "EMMXXXX0"))
   return(1);   // Found driver
  
     dev = dev->link;
    }
     }

  return(0);
}

void main(void)
  {
    union REGS inregs, outregs;
    struct SREGS segs;

    unsigned handle;
    unsigned page;
    unsigned index, page_number;

    unsigned page_frame_address;

    char far *data;

    if (check_for_ems())
      {
 inregs.h.ah = 0x40;
 int86 (0x67, &inregs, &outregs);

 // Make sure EMS is functional
 if (outregs.h.ah == 0)        
   {
     // Allocate a handle for 5 pages
     inregs.h.ah = 0x43;
     inregs.x.bx = 5;
     int86 (0x67, &inregs, &outregs);

     if (outregs.h.ah == 0)
       { 
   handle = outregs.x.dx;

   // Get the page frame address
   inregs.h.ah = 0x41;
   int86 (0x67, &inregs, &outregs);
  
   if (outregs.h.ah == 0)
     {                
       page_frame_address = outregs.x.bx;

       // map the first 4 pages
       for (page_number = 0; page_number < 4; page_number++)
         {
     inregs.h.ah = 0x44;
     inregs.h.al = page_number;  // Physical page
     inregs.x.bx = page_number;  // Logical page
     inregs.x.dx = handle;

     int86 (0x67, &inregs, &outregs);
 
     if (outregs.h.ah != 0)
       {
          printf ("Error mapping pages %xH/n",
     outregs.h.ah);

          // Release the handle
          inregs.h.ah = 0x45;
          inregs.x.dx = handle;
          int86 (0x67, &inregs, &outregs);           
          exit(0);
       }
         }       
       // Fill the first four pages
       data = (char far *) MK_FP(page_frame_address, 0);
    
       for (index = 0; index < 16384; index++)
         data[index] = 'A';

       for (index = 16384; index < 32768; index++)
         data[index] = 'B';

       for (index = 32768; index < 49152; index++)
         data[index] = 'C';

       for (index = 49152; index != 0; index++)
         data[index] = 'D';

       // Map logical page 4 into physical page 1
       inregs.h.ah = 0x44;
       inregs.h.al = 1;  // Physical page
       inregs.x.bx = 4;  // Logical page
       inregs.x.dx = handle;

       int86 (0x67, &inregs, &outregs);
 
       if (outregs.h.ah != 0)
         {
     printf ("Error mapping page %xH/n",
       outregs.h.ah);

     // Release the handle
     inregs.h.ah = 0x45;
     inregs.x.dx = handle;
     int86 (0x67, &inregs, &outregs);           
     exit(0);
         }

       // Fill page 4 which resides in page 1
       for (index = 16384; index < 32768; index++)
         data[index] = 'E';
       
       // Display the first 20 bytes of each page
       printf ("Physical Page Zero/n");
       for (index = 0; index < 20; index++)
         printf ("%c ", data[index]);

       printf ("/nPhysical Page One/n");
       for (index = 16384; index < 16404; index++)
         printf ("%c ", data[index]);

       printf ("/nPhysical Page Two/n");
       for (index = 32768; index < 32788; index++)
         printf ("%c ", data[index]);

       printf ("/nPhysical Page Three/n");
       for (index = 49152; index < 49172; index++)
         printf ("%c ", data[index]);

       // Map logical page 1 into physical page 3
       inregs.h.ah = 0x44;
       inregs.h.al = 3;  // Physical page
       inregs.x.bx = 1;  // Logical page
       inregs.x.dx = handle;

       int86 (0x67, &inregs, &outregs);
 
       if (outregs.h.ah != 0)
         {
     printf ("Error mapping page %xH/n",
       outregs.h.ah);

     // Release the handle
     inregs.h.ah = 0x45;
     inregs.x.dx = handle;
     int86 (0x67, &inregs, &outregs);           
     exit(0);
         }

       printf ("/nMapping logical page 1 to physical page 3");
       printf ("/nPhysical Page Three/n");
       for (index = 49152; index < 49162; index++)
         printf ("%c ", data[index]);

     }
   else
     printf ("Error getting base address %xH/n",
       outregs.h.ah);
     
   // Release the handle
   inregs.h.ah = 0x45;
   inregs.x.dx = handle;
   int86 (0x67, &inregs, &outregs);           
       }
     else
       printf ("Error allocating 5 pages %xH/n",
  outregs.h.ah);
   }
 else
  printf ("EMM not functional/n");
      }
    else
      printf ("EMS driver not present/n");

  }


MATLAB主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性内容概要:本文主要介绍了一种在MATLAB环境下实现的主动噪声和振动控制算法,该算法针对较大的次级路径变化具有较强的鲁棒性。文中详细阐述了算法的设计原理与实现方法,重点解决了传统控制系统中因次级路径动态变化导致性能下降的问题。通过引入自适应机制和鲁棒控制策略,提升了系统在复杂环境下的稳定性和控制精度,适用于需要高精度噪声与振动抑制的实际工程场景。此外,文档还列举了多个MATLAB仿真实例及相关科研技术服务内容,涵盖信号处理、智能优化、机器学习等多个交叉领域。; 适合人群:具备一定MATLAB编程基础和控制系统理论知识的科研人员及工程技术人员,尤其适合从事噪声与振动控制、信号处理、自动化等相关领域的研究生和工程师。; 使用场景及目标:①应用于汽车、航空航天、精密仪器等对噪声和振动敏感的工业领域;②用于提升现有主动控制系统对参数变化的适应能力;③为相关科研项目提供算法验证与仿真平台支持; 阅读建议:建议读者结合提供的MATLAB代码进行仿真实验,深入理解算法在不同次级路径条件下的响应特性,并可通过调整控制参数进一步探究其鲁棒性边界。同时可参考文档中列出的相关技术案例拓展应用场景。
基于PhasorDetect手持NIRS设备多光谱反射数据的组织氧饱和度实时监测研究(Matlab代码实现)内容概要:本文围绕基于PhasorDetect手持近红外光谱(NIRS)设备的多光谱反射数据,开展组织氧饱和度(StO2)的实时监测研究,并提供了完整的Matlab代码实现方案。研究聚焦于利用NIRS技术采集生物组织的多光谱反射信号,通过光传输理论模型(如修正的朗伯-比尔定律)反演出组织中氧合血红蛋白与脱氧血红蛋白的浓度,进而实时计算氧饱和度。文中详细阐述了信号预处理、光谱特征提取、参数标定及实时计算算法的设计与实现过程,展示了如何将硬件数据采集与软件算法处理相结合,构建一套完整的实时监测系统。; 适合人群:具备一定信号处理和生物医学工程背景,熟悉Matlab编程,从事近红外光谱技术、生理参数监测或相关领域研究的研发人员和研究生。; 使用场景及目标:① 实现基于手持式NIRS设备的便携式组织氧饱和度实时监测;② 学习和掌握多光谱数据处理、生理参数反演算法的Matlab编程实现;③ 为开发同类医疗监测设备提供算法参考和技术验证原型。; 阅读建议:此资源以Matlab代码为核心,紧密结合理论与实践,建议读者在阅读时同步运行和调试提供的代码,重点关注数据预处理流程、光谱分析模型和实时计算逻辑的实现细节,并可根据具体硬件参数进行相应调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值