没办法了,这两天生病,周一交东西,200分求助!

houzy 2003-08-20 11:18:00
dos6.22下,

tc2.0,

标准c,tsr程序

原本运行的是一个图形菜单界面的程序,现在的tsr程序要在该程序中热键弹出,而该tsr程序是文本菜单(基本内存只有640k,节约起见,现在也是刚好够用而已)。

问题就在于,我只知道怎么保护原本是文本菜单的程序。而现在 需要做两步,一是保护原来的显存和状态,二是切换到文本状态 。

现在切换状态我已经搞定,而保护图形菜单程序的显存始终没有成功。
我参照的是如下程序(是c++的,只是参考,我需要标准c的):

/**************************下面是本程序的一些数据定义************************/
const unsigned long VGA_VRAMG=0xa0000000L; //图形模式显存地址首址
const unsigned long VGA_VRAMT=0xb8000000L; //文本模式显存地址首址
static char vga_buf1[2048]; //保存VGA状态数据
static char vga_buf2[0x3000]; //保存显存数据2K+2K+8K

/************************下面是几个有关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< outport(0x3c4,_AX); //AL先送0x3c4,AH后送0x3c5
}

/***********************上面是几个有关VGA操作的辅助函数**********************/


/************************下面是几个保存和恢复屏幕的函数**********************/

/* 由于使用了VESA调用,对Super VGA的模式也可以成功地保存和恢复.
但相应地,显示卡也必须支持有关VESA调用 */

void vga_save(char far* buffer1,char far* buffer2)
//保存VGA状态到buffer1,保存被文本模式03H破坏的显存到buffer2,并切换到模式03H
{
_ES=FP_SEG(buffer1);
_BX=FP_OFF(buffer1); //ES:BX=buffer1,缓冲区的首址
_AX=0x4f04; //BIOS INT 10H的4F04号VESA功能调用
_CX=0xffff; //表示要保存所有的状态数据
_DL=0x1; //子功能1,保存VGA状态到ES:BX
geninterrupt(0x10);

vga_set_mode(0x92); //切换到模式12H,0x92的最高位是1表示保留显存数据
vga_rplane_sel(0x2); //选择页面2读取
_fmemcpy(buffer2,(void far*)VGA_VRAMG,0x2000);
//页面2的开头8K将被模式03H的字模覆盖,故保存到buffer2

vga_set_mode(0x83); //切换到模式03H,0x82的最高位是1表示保留显存数据
_fmemcpy(buffer2+0x2000,(void far*)VGA_VRAMT,0x1000);
//显存头上的4K(页面0的2K是字符,页面1的2K是属性,CPU地址交替)
//将被模式03H的屏幕数据覆盖,故保存到buffer2+0x2000
}

void vga_restore(char far* buffer1,char far* buffer2)
//用buffer2的数据恢复显存,用buffer1的数据恢复VGA状态
{
_fmemcpy((void far*)VGA_VRAMT,buffer2+0x2000,0x1000);
//恢复显存头上的4K(页面0开头的2K,页面1开头的2K)
vga_set_mode(0x92);
vga_wplane_sel(0x2);
_fmemcpy((void far*)VGA_VRAMG,buffer2,0x2000);
//恢复显存页面2的开头8K

_ES=FP_SEG(buffer1);
_BX=FP_OFF(buffer1);
_AX=0x4f04;
_CX=0xffff;
_DL=0x2; //子功能2,用ES:BX的数据恢复VGA状态
geninterrupt(0x10);
}

/************************上面是几个保存和恢复屏幕的函数**********************/


有用的主要就是就是 vga_save 和 vga_restore两个函数,分别在tsr执行前和执行后调用。里面的 vga_set_mode 证实可用,而保存显存的总是失败,请大家看看,谢谢了!
...全文
31 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
houzy 2003-08-28
  • 打赏
  • 举报
回复
谢谢卡拉!
tsr,热键激活,文本菜单,串口中断的发送,接收我都已经搞定了。不过今天晚上发现一个搞笑的事情,原来的程序把两个串口都占用了,555。主任下任务的时候说的很肯定,com2可以给我用的。结果今天我才拿到原来的那个程序安装起来调试我的程序,发现com2不可用了。还不知道怎么办呢!明天去了再看了。
不过还有关键的一个大问题,原来的程序是图形菜单,需要保护阿,而现在我都不得其法。
看了“C高级实用程序设计”的目录,这本书里面有图形模式显存的保护,准备后面去搞一本。就算项目明天决定改了,我也要搞定这个东西,完善这个东西。呵呵!
希望卡拉能继续热心指教。
Meyer 2003-08-26
  • 打赏
  • 举报
回复
一般现存都有好几页
你可以考虑切换显存页,那样就不用你保存了
xyxym 2003-08-26
  • 打赏
  • 举报
回复
C语言常用算法与子程序

看看这本书有没有帮助
csj6214499 2003-08-26
  • 打赏
  • 举报
回复
这个问题我不知道!以后有机会一顶告诉你
idontlikenickname 2003-08-26
  • 打赏
  • 举报
回复


以前写过TSR,中断方式下的串口通信也做过,可是两者的结合却没做过,只能给你一些粗略的建议:
对于TSR的编写,一般的TSR要接管int 9h也就是键盘中断,通过端口0x60和0x61截取键盘的按下和释放信号,这样可以实现热键的设定,通过热键可以设置一些全局的标志变量,用这些变量可以控制是否开放串口发送功能;至于串口部分,以中断方式发送和接收的程序在网上比较好找,前边说的第一个网站上就有,你可以参考一下.TSR和串口两者结合到一起时,你可以先初始化串口,包括中断处理程序的替换,发送和接收缓冲区的建立,然后安装键盘中断处理程序,设定一些全局标志变量,这些标志控制着是否开放串口,然后就可以驻留了.程序中的一些热键弹出界面还没有考虑,不过最好使用直接写屏的方式完成,至于发送什么数据(可能来自磁盘文件,也可能是键盘输入)就看你的需要了,如果要用到磁盘文件就要小心int21h的重入问题~~

houzy 2003-08-26
  • 打赏
  • 举报
回复
对楼上我不想说什么。你根本不了解一些大企业内部的情况。我做了一年java,现在叫我在2个星期内搞这么个东西出来,dos下的资料现在也难买,难查,难问。用的着你浪费口舌来说风凉话嘛。何况现在我靠自己也弄得差不多了,有什么嘛。只是如果大家都象你这样,csdn也不用办了,你还来这里干什么。
playboyxp 2003-08-26
  • 打赏
  • 举报
回复
楼主是临时抱佛脚,
自己种的荫自己解决
davidwoo 2003-08-26
  • 打赏
  • 举报
回复
我在精神上支持你
keiven 2003-08-26
  • 打赏
  • 举报
回复
哎,有心无力!偶只有帮你顶一下啦!!!
ljfwarrior 2003-08-22
  • 打赏
  • 举报
回复
也只有up一下了!
houzy 2003-08-22
  • 打赏
  • 举报
回复
难道原来在dos下摸爬滚打过来的老鸟们都不在了吗?帮帮小弟阿,我现在是睡觉都在想着这个问题。其实做不出来也不会下岗,但我就是不服气啊!这些东西,按理说,都是以前程序员最爱玩的阿!
panpass 2003-08-22
  • 打赏
  • 举报
回复
up
houzy 2003-08-21
  • 打赏
  • 举报
回复
救命啊!
jack_wq 2003-08-21
  • 打赏
  • 举报
回复
看了头大如斗……,帮你顶一下,下面的高手,你上,都靠你了!
98440622 2003-08-21
  • 打赏
  • 举报
回复
呵呵, 楼主真幽默
houzy 2003-08-20
  • 打赏
  • 举报
回复
谢谢,串口发送已经可以了,就差中断方式的接受了。何况串口可用程序很多,旁边也还有高人。
模式保护,切换阿!头大!
idontlikenickname 2003-08-20
  • 打赏
  • 举报
回复


你做的这个还挺有难度~
编TSR遇到的困难可能只是冰山一角,串口编程才是最烦的,尤其是调试的时候.去下面的网站看看,也许有帮助~
http://www.gjwtech.com
http://skygray.ee.tokushima-u.ac.jp/~wangfei/research/interface/interface_rs232c.html

houzy 2003-08-20
  • 打赏
  • 举报
回复
能够给出可用的在tsr下的串口中断方式收发程序,再给200。我正在调试,但是生病了,很惨阿 !以后再也不出去吃喝了!程序员的体质真的普遍较差,以前最多半天就好,现在闹了三天了。
还有就是我一直搞java一年了,现在来搞这个东东简直郁闷死了。还好框架做的差不多了,就差上面这个东西和串口收发了!

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧