『楼 主』:
 TSR程序中"保存","恢复"技术的应用
 
使用 LLM 解释/回答一下
  
发信人: broom (木头), 信区: DOS 
标  题: TSR程序中"保存","恢复"技术的应用 
发信站: BBS 水木清华站 (Tue May  9 16:45:24 2000) 
 
很老的文章了,不过很有效.不是我写的. 
 
Wei Min Luo 整理于1997.9 
 
                      TSR程序中"保存","恢复"技术的应用 
 
    TSR编程常常要遇到DOS重入,屏幕保护等许多烦人的事情.但只要采用适当的 
  方法,这些事情可以变得很轻松. 
    我的经验就是:保存!--尽情破坏--恢复!! 
    只要把一切可能被TSR破坏的东西(数据,硬件状态等)保存好,TSR内部就不必 
  再顾虑重重了.到TSR退出激活态时,把所有东西一一复原,被中断的程序就可以 
  安全地运行下去. 
    保存CPU的寄存器就不必说了,因为用interrupt关键字说明的函数会自动保存 
  所有寄存器.下面主要给出保存屏幕,鼠标,DOS数据等的例子. 
 
    以下的一些程序片断,仅供分析借鉴,如有不妥或需要补充的,敬请提出. <img src="images/smilies/face-laugh.png" align="absmiddle" border="0"> 
 
 
>>-=============================程序实例:BEGIN=============================-<< 
 
/*  程序在Borland C++ 3.1下编译通过,由于涉及行内汇编,其他编译器产 
    生的结果可能有所不同,还望注意检查.                             */ 
 
/*  由于程序涉及较多未公开的DOS调用和内部数据结构,以及较多VGA寄存 
    器操作,对运行环境可能有一定的要求.                             */ 
 
 
#include  
#include  
#include  
#include  
 
/**************************下面是本程序的一些数据定义************************/ 
 
const unsigned PSP_ENV=0x2c;  //PSP中保存环境段段址的偏移 
const unsigned PSP_DTA=0x80;  //PSP中用于磁盘传输区DTA的内存区首址 
const unsigned long VGA_VRAMG=0xa0000000L;  //图形模式显存地址首址 
const unsigned long VGA_VRAMT=0xb8000000L;  //文本模式显存地址首址 
 
static char vga_buf1;    //保存VGA状态数据 
static char vga_buf2;  //保存显存数据2K+2K+8K 
stactic chat mouse_buf;  //保存鼠标驱动程序状态数据 
static char sda_buf;     //保存DOS的SDA数据 
  //以上预先分配了一些缓冲区,其大小是经验值 
 
static void far* sda_addr;     //DOS的SDA数据区首址 
static unsigned sda_size;      //DOS的SDA数据区大小 
static void far* indos_addr;   //DOS的INDOS标志地址 
  //以上是DOS的一些参数,必须由main()在驻留前取得 
 
/**************************上面是本程序的一些数据定义************************/ 
 
 
 
/************************下面是几个有关VGA操作的辅助函数*********************/ 
 
inline void vga_set_mode(unsigned modenum)  //把VGA显示模式设置为modenum 
{ 
_AX=modenum; 
_AH=0x0; 
geninterrupt(0x10);          //AH=0,AL=modenum,调用BIOS INT 10H 
} 
inline void vga_rplane_sel(char planenum)  //选中VGA页面planenum读取 
{ 
_AH=planenum;           //AH=planenum将被送到I/O地址0x3cf 
_AL=0x4;                //AL=4送0x3ce,选中"读页面选择寄存器" 
outport(0x3ce,_AX);     //AL先送0x3ce,AH后送0x3cf 
} 
inline void vga_wplane_sel(char planenum)  //选中VGA页面planenum写入 
{ 
_AX=0x0102;             //AL=2送0x3c4,选中"彩色页面写允许寄存器" 
_AH<<=planenum;         //AH=(0x01<>-==============================程序实例:END==============================-<< 
 
 
 
                                               Wei Min Luo 
 
                                                   整理于1997.9 
 
 
 
-- 
      木木木木木木木木木木木木     头  @^ ^@  头 
      木木木木木木木木木木木木     头  □Q Q □ 头 
      木木木木木木木木木木木木     头  (  *  )  头 
 
※ 来源:·BBS 水木清华站 smth.org· 
 
(本文采用S-Term文章拷贝脚本拷贝) 
================================================== 
 
 
    
 
  
  |