DOS下显示真彩图像,做过的来帮忙,谢谢

D2WXJ 2005-08-20 11:30:04
欲在dos下显示一幅32位768×576的图像,考虑采取的方法是直接写显存(由于通过中断的方法不够快),在网上查了一下,似乎通过SVGA的方法比较可行,现在具体问题如下:

1,如何自动获取显存的基地址
2,如何设置显示模式
3,对于32位的显示方式,是否显存排列即为R,G,B,ALPHA,各8位

或许提的问题不够明确,但请大家多多指教,谢谢先。
...全文
450 26 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Areslee 2005-08-26
  • 打赏
  • 举报
回复
不是

base address of the default DS selector
就是指DS selector对应的GDT/LDT描述中的基地址
D2WXJ 2005-08-25
  • 打赏
  • 举报
回复
是的 我可以用31h的0800获得physical address的,但是

如何获得base address of the default DS selector所指的数据段描述符的基地址??CR3寄存器的内容吗??


多问一下;)


Areslee 2005-08-23
  • 打赏
  • 举报
回复
你是在PM还是在RM下做?
PM下设置BASE为0的SELECTOR用线性地址(就是物理地址)访问,
RM下需要启动4GB访问,然后还是用段/偏移方式访问

base address of the default DS selector是指你的数据段描述符的基地址,如果该值为0,当然可以直接使用物理地址访问
  • 打赏
  • 举报
回复
如果只是装入/保存图象的话,banking模式和linear framebuffer模式差别很小。
但是绘制图形元素的话,象圆、椭圆、多边形、区域填充等等,差别就很大了。
Areslee 2005-08-22
  • 打赏
  • 举报
回复
千万不要换页,不换页速度起码可以提高3倍
  • 打赏
  • 举报
回复
flat model是映射了一个基地址为0的4GB地址空间,并且关闭了分页机制,所以线性地址等于物理地址。
但flat model并不是“标准”的保护模式,大致可以理解为32-bit的实模式。
所以为了程序能在多段的、分页的保护模式下也可以使用,最好还是先进行物理地址映射,这是标准做法。
你说的“设置什么模式位”,是在设置VESA mode时用的。
对于VESA 2.0+
int 10 ax=4f02 set video mode
bx=new video mode
bit
15 preserve display memory on mode change
14 (VBE v2.0+) use linear (flat) frame buffer
13 (VBE/AF 1.0P) VBE/AF initializes accelerator hardware
12 reserved for VBE/AF
11 (VBE v3.0) user user-specified CRTC refresh rate values
10-9 reserved for future expansion
8-0 video mode number (0xxh are non-VESA modes, 1xxh are VESA-defined)
要设置bit14为1才行。
我以前也发现过:某些卡在Banking模式时,linear framebuffer仍然可使用;但有些则不行,必须明确设置为linear framebuffer模式才行。
D2WXJ 2005-08-22
  • 打赏
  • 举报
回复
还有疑问,我在保护模式不分页时,应该是不需要从物理到线性映射的,我在别的地方用到了31h 0800中断,结果线性地址和物理地址是一致的。
采用linear framebuffer,好像要设置什么模式位,还在继续尝试。
  • 打赏
  • 举报
回复
见我上上一个帖子里说的。
那是因为watcom c++使用的flat model的特殊性造成的。
如果在标准的保护模式(多段、页面机制)下你的程序肯定有问题。
D2WXJ 2005-08-22
  • 打赏
  • 举报
回复
成功,非常谢谢,特别是DelphiGuy() 。

但是,在看vbe文档时还有些问题
The steps involved in mapping in a linear framebuffer region are as follows(32-bit protected mode only):
1, Map the physical memory address to a linear memory
2, Find the base address of the default DS selector for your operating enviroment.
3, Subtract the base address from the linear address computed in step 1 to give you a near pointer(relative to DS) that you can use from within your code.
其实第2,3步我并没有做,但是结果出来了,是否the base address of the default DS selector可能是零呢?或许是个bug。
呵,暂时不管了,先往后赶事情吧,帖子放两天有兴趣继续,过两天来给分。

antijpn 2005-08-22
  • 打赏
  • 举报
回复
转其他技术问题
vxdll 2005-08-22
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
找一下VESA文档吧。
Int 10 functions:
ax=4f02 设置VESA显示模式
ax=4f01 获取显示模式信息,象素格式、显存基地址都有。
不过Linear Frame Buffer只是VESA 2.0+才支持,
老一些的显卡可能只支持VESA 1.2/1.1/1.0甚至不支持(还有人用这么老的显卡吗?:)。
  • 打赏
  • 举报
回复
vbe_modeinfobloak offset 28h指出的是Linear Frame Buffer的物理地址,不是当前地址空间的线性地址。
所以你需要使用Int 31h ax=0800去映射物理地址,取得在当前地址空间的线性地址。
然后就很简单了,
定义一个适合当前显示模式的结构数组,
通过Linear Frame Buffer指针来使用就可以了。
比如:
struct TRGBAQuad {
unsigned char R, G, B, A;
} *LFB; // 这个结构要根据vbe_modeinfobloak offset 1f-26的数据来确定

LFB = ...; // 取得线性地址
LFB[0].R = ... // 设置左上角象素的red值
Jagen在路上 2005-08-21
  • 打赏
  • 举报
回复
顺便问一下,你用的什么编译器,DJGPP?
Jagen在路上 2005-08-21
  • 打赏
  • 举报
回复
保护模式下的,嗯嗯,帮你找找,这个已经不能利用BIOS的功能了。不过可以直接操作显卡了,只要支持SVGA,没有问题的。
D2WXJ 2005-08-21
  • 打赏
  • 举报
回复
:0-

我已经实现了在watcom下用31h,获得vbe_infoblock 和vbe_modeinfobloak的方法。发现我的vbe driver是3.0的,当然支持我需要的800*600的真彩模式,并且我获得了其显存基址0xef000000,由于没有分页,应该就是线性地址了

:(
但是,我获得了其物理地址后,却不知道怎么使用linear framebuffer的方法来把图像打上去,直接赋值后,屏幕花花点点,闪个不停,希望指点。

非常高兴这么多人来帮忙
  • 打赏
  • 举报
回复
watcom c++的32-bit保护模式是flat model,
它本身又没有映射real mode interrupts,
所以处理起来有点麻烦。
象你那样直接调用是不行的,
real mode下ES:DI指向的地址和保护模式下的vinfo对应不起来。
应该用DPMI功能(int 31h)去处理,
基本过程就是:
int 31 0100/0101 alloc/free DOS memory,
int 31 0300 执行real mode interrupt。
分配的DOS内存会同时分配一个保护模式selector,
在保护模式下也可以访问。
其实还是BC++和wdosx对保护模式下的开发支持更好,
大多数real mode interrupts都已经映射过了,
可以直接调用。
不过watcom c++也还行,
一旦你把这些接口部分理顺了,
用起来也还算方便。
DOOM/DOOM2就是用watcom c++开发的。
Good Luck吧。:)
jixingzhong 2005-08-21
  • 打赏
  • 举报
回复
32 位用图形库好象不行,TC的库才支持到16位 嘿嘿 ...
我刚看了相关的东西...可是资料不在手头上,没有办法贴给你 ...不好意思了
Jinhao 2005-08-21
  • 打赏
  • 举报
回复
地址是0xa000,用换页的方法 就比较快,就是当写满64K数据时就换页
mov ax, 0x4f05
mov bx, 0
mov dx, page //页码
int 0x10

设置显示模式
mov ax, 0x4f02
mov bx, 模式号 //模式号你查查,我没注意32位色的是多少,还要注意分辨率
int 0x10

关于显存,就是你说的那样

inutility 2005-08-21
  • 打赏
  • 举报
回复
http://www.vesa.org/public/VBE/
加载更多回复(6)

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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