标题:[讨论]讲一下DOS下SVGA视频模式的设置问题
只看楼主
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 

测试代码很多人应该都很熟悉的。

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.h>

// SuperVGA CRTCInfoBlock structure
struct
{
short HTotal;
short HSyncStart;
short HSyncEnd;
short VTotal;
short VSyncStart;
short VSyncEnd;
char Flags;
long PixelClock;
short RefreshRate;
char Reserved[40];

} CRTCInfoBlock;
/* Set a VBE video mode */
void setVBEMode()
{
char far *CRTCInfo = (char far *)&CRTCInfoBlock;
union REGS in,out;
struct SREGS segs;


in.x.ax = 0x4F02;
//in.x.bx = mode;
in.x.bx = 0x905;


// 1024*768 @ 60Hz
CRTCInfoBlock.HTotal=1328;
CRTCInfoBlock.HSyncStart=1048;
CRTCInfoBlock.HSyncEnd=1184;
CRTCInfoBlock.VTotal=806;
CRTCInfoBlock.VSyncStart=771;
CRTCInfoBlock.VSyncEnd=777;
CRTCInfoBlock.Flags=0xa;
CRTCInfoBlock.PixelClock=96333120;
CRTCInfoBlock.RefreshRate=6000;

/*// 1024*768 @ 70Hz
CRTCInfoBlock.HTotal=1328;
CRTCInfoBlock.HSyncStart=1048;
CRTCInfoBlock.HSyncEnd=1184;
CRTCInfoBlock.VTotal=806;
CRTCInfoBlock.VSyncStart=771;
CRTCInfoBlock.VSyncEnd=777;
CRTCInfoBlock.Flags=0x8;
CRTCInfoBlock.PixelClock=75000000;
CRTCInfoBlock.RefreshRate=7007;
*/
/*
// 1024*768 @ 75Hz
CRTCInfoBlock.HTotal=1312;
CRTCInfoBlock.HSyncStart=1040;
CRTCInfoBlock.HSyncEnd=1136;
CRTCInfoBlock.VTotal=800;
CRTCInfoBlock.VSyncStart=769;
CRTCInfoBlock.VSyncEnd=772;
CRTCInfoBlock.Flags=0xa;
CRTCInfoBlock.PixelClock=78750000;
CRTCInfoBlock.RefreshRate=75.03;
*/
in.x.di = FP_OFF(CRTCInfo);
segs.es = FP_SEG(CRTCInfo);
int86x(0x10, &in, &out, &segs);
//int86(0x10,&in,&out);
printf("%x : %d", out.h.al, out.h.ah);
}
/* Initialize the specified video mode. Notice how we determine a shift
* factor for adjusting the Window granularity for bank switching. This
* is much faster than doing it with a multiply (especially with direct
* banking enabled).
*/
void main()
{
setVBEMode();
getch();
_AX = 0x4f02;
_BX = 0x13;
geninterrupt(0x10);
}


2007-07-12 13:09
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 

根据VBE3.0的技术文档,这个程序返回0就证明设置成功;其他值说明不成功。
我用WIN-TC编译后直接运行,显示1;
在XP的DOS窗口下先运行SDD,生成DRV文件,然后运行univbe。
最后运行vesa.exe(就是上面那段代码),结果显示0,并且从字体上看,应该是设置成功的

另外,在845g的主板上(我测试用的是nforce2),直接运行后花屏,而且不知道为什么SDD安装失败,郁闷


2007-07-12 13:14
jig
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
帖 子:530
专家分:242
注 册:2005-12-27
得分:0 

定了~~藏了哦,追风兄。


个人网站 -  http://.h001.
2007-07-12 13:17
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 
需要注意的是,测试的时候要显示器要选择110mhz带宽的,否则超过带宽容易烧显示器的。
我用的是150mhz的

2007-07-12 13:18
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
XP 的 DOS Box 毕竟是软件模拟的东西,声卡、显卡、时钟(8253)、DMA控制器(8237)、中断控制器(8259),等等许多硬件相关的东西,在 DOS Box 里面都是由软件模拟实现的。
从目前的表现看来,微软做的不是很好,声卡似乎只能支持到 SB2.0,时钟不准确并且不能提供真正的中断、DMA控制器似乎也有问题、中断控制器还好,显卡部分的支持也不好。目前主流的显卡都是 VBE3.0 了,但是 XP 的 DOS Box 要告诉你他只支持 VBE2.0,你也是没有办法。
SDD 是何东西,还没有听说过。

[此贴子已经被作者于2007-7-12 14:12:14编辑过]

2007-07-12 14:04
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 
SDD:SciTech Display Doctor 6.53

2007-07-12 14:10
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 

刚才利用电脑公司版GHOST XP附带的DOS系统测试了,跟在XP下测试的结果一样。


2007-07-12 14:15
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 
原来如此,搜索了一下,好像有7.0版本的了
2007-07-12 14:16
kk4868
Rank: 1
等 级:新手上路
帖 子:77
专家分:0
注 册:2007-6-3
得分:0 

要找dos版的


2007-07-12 14:20
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
得分:0 

VBE跟主扳有很大关系,因为VBE多数情况下是放在BIOS中的。但是不能排除其他的实现方式,比如说DOS下的TSR,这在VBE3.0的文档中也有指出。
因此,即便是在纯DOS下,也有可能出现问题,这就是因为BIOS中没有实现VBE3.0,或者说VBE3.0是以TSR或其他方式提供的,而我们的机器中却没有安装相应的TSR程序。因此需要向主板厂商或者实显卡厂商寻求技术支持。
为什么Windows就可以呢?因为Windows下装了那么多驱动,说不定某一个就提供了对VBE3.0的支持。如果硬件都是一样的,就是软件实现上的问题。如果微软都能做到,就说明是可以实现的,只是目前我们还没有找到办法。

[此贴子已经被作者于2007-7-12 15:47:28编辑过]

2007-07-12 15:07



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-150119-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026829 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved