阅读:1869回复:10
求助VGA/SVGA编程高手、显示器/显示卡硬件专家,快来帮帮忙!
由于工作需要,我需要开发一个直接控制显示卡(符合VESA标准)绘图的图形库,
万事具备就只差一个控制显示器刷新频率的功能未能实现,致使图形画面闪烁严重, 虽然从VESA的官方网站上下载了一个VBE3.0标准,但是E文水平有限不能完全理解其 精髓致使该功能一直无法实现,真是头疼!如果有那位仁兄有这方面的编程经验或 能提供一些中文资料本人将不胜感激,若能实现本功能,本人将会把所有的可用分 顷囊相增!拜托!拜托! |
|
沙发#
发布于:2004-11-05 09:50
DOS / WINDOWS?
做过DOS下用VESA编程,也涉足过一点点Windows下用DirectX拿到显存地址后直接刷屏。 也许可以和你讨论一下。请发email给我:galiu@21cn.com |
|
|
板凳#
发布于:2004-11-05 15:44
使用双缓存页面翻转就不会闪烁啦。这种技术在一些专业的vc网站都有例子找找吧
|
|
地板#
发布于:2004-11-12 14:46
使用双缓存页面翻转就不会闪烁啦。这种技术在一些专业的vc网站都有例子找找吧 VC... 仔细看一下楼主的问题吧。显然是DOS下用C直接对VESA进行操作。 |
|
|
地下室#
发布于:2004-11-12 14:53
楼主还是要努力加强E文啊。
这个东东,不啃原文是一定搞不定的。 [编辑 - 11/12/04 by grant] |
|
|
5楼#
发布于:2004-11-12 14:53
搞定了。还真有点难,花了俺大概5个Hour...好久没编程了(现在都是让手下编),忽然自己编,有点累哦。 :D
加分吧。你说倾囊... 可是你总共发了这么点帖子,囊里会有多少东西呢? :D 问题的关键是,VBE上有些事没有说清楚。建议先去搞清楚屏幕上几种显示的关系(HTotal / HSyncStart / HSyncEnd / VTotal / VSyncStart / VSyncEnd), http://www.hut.fi/Misc/Electronics/faq/vga2rgb/timings.html 然后再去这里算一下你相应的分辩率与更新率下的相应数字, http://www.hut.fi/Misc/Electronics/faq/vga2rgb/calc.html 就可以开工了。 例子程序中的关键代码及注释: // 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; 很简单,就是按VBE中所说的做了个结构。 void setVBEMode(int mode) { union REGS in,out; struct SREGS segs; char far *CRTCInfo; in.x.ax = 0x4F02; //in.x.bx = mode; in.x.bx = 0x905; // --------------------- Note 1 // 1024*768 @ 70Hz CRTCInfoBlock.HTotal=1328; CRTCInfoBlock.HSyncStart=1048; CRTCInfoBlock.HSyncEnd=1184; CRTCInfoBlock.VTotal=806; CRTCInfoBlock.VSyncStart=771; CRTCInfoBlock.VSyncEnd=777; CRTCInfoBlock.Flags=0xa; // -------------- Note 2 CRTCInfoBlock.PixelClock=75000000; CRTCInfoBlock.RefreshRate=70.07; CRTCInfo = (char far *)&CRTCInfoBlock; // ----------------------------------------- Note 3 in.x.di = FP_OFF(CRTCInfo); segs.es = FP_SEG(CRTCInfo); int86x(0x10, &in, &out, &segs); //int86(0x10,&in,&out); } Note 1: 我跟踪调试,如果不自己设置Refresh rate,这里imode=0x105 ==> 0000 0001 0000 0101 简单地将D11置1,变成: 0000 1001 0000 0101 ==> 0x905。实际上可以支持1024*768*16bit色的(0x917),但是这个例程中的显示会不正常。要直接改imode,懒得改了。你自己试吧。 Note 2: 网页版的计算工具无法设置Sync Polarity的+/-,一律用-的。 1100 ==> 0xa Note 3: 以上数据用网页版计算工具算得。 测试: HW: Pentium M 1.6G, 512MB RAM, Build-in display SW:DOS 6.22, Borland C++ 3.1 结果: 在我的测试机上,可以用到1024*768@60Hz, 1024*768@70Hz, 当设到1024*768@75Hz时,显示器报错:超出同步范围。 [编辑 - 11/12/04 by grant] |
|
|
6楼#
发布于:2004-11-12 15:09
将例子程序传上来。
实际上就是VBE中附的例子,我改了初始化图形的部分。 |
|
|
7楼#
发布于:2004-11-12 15:31
再发一个计算GTF参数的C源程序。
原来是Linux下的,我改了一下,在DOS下也可以用。 已测试过它算的数据,是可以用的。 |
|
|
8楼#
发布于:2004-11-25 13:04
请问用VESA能否访问大于64M的显存。
|
|
9楼#
发布于:2004-11-29 20:09
能!但要使用VESA提供的保护模式接口功能,具体的去研究VESA标准吧!
|
|
10楼#
发布于:2004-11-30 01:03
那么是否要分页访问呢?
|
|