![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-14 23:49 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » TSR程序中"保存","恢复"技术的应用 |
| 可打印版本 1,212 / 0 |
| 第1楼 ko20010214 | 发表于 2003-06-01 00:00 |
| 版主 发帖 1,628 积分 7,296 | |
|
TSR程序中"保存","恢复"技术的应用 发信人: 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数据等的例子. 以下的一些程序片断,仅供分析借鉴,如有不妥或需要补充的,敬请提出. ![]() >>-=============================程序实例: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文章拷贝脚本拷贝) ================================================== |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |