是否可以在 DOS 机器上以 24 位的颜色深度进行编程?我知道 VGA 支持 8 位颜色深度,但有没有办法解决 24 位?对谷歌的研究一无所获。如果这会影响答案,我正在使用 FreeDOS 而不是 MS-DOS 进行编程。
2 回答
对的,这是可能的。您应该阅读有关VESA和相应驱动程序的信息。这里有几个函数
然后你就可以做到:
mov ax,4f02h
mov bx,103h
int 10h
如果启动 VESA 并设置 103h (800x600x256) 模式,这通常会为 ax 提供 004fh,例如,您可以使用 11bh (1280x1024x16M) ( http://www.delorie.com/djgpp/doc/rbinter/it/83/0 .html )
更新:我从我非常非常古老的帕斯卡程序中附上了一些代码:
{ preserve space for vesa info structure, in asm it will look like sets of db, dw }
tmodes=array[0..0] of word;
tvesainfo=
record
abSignature:array[1..4] of char;
lwVersion,hwVersion:byte;
pfszOEMStr:pchar;
rAbilities:longint;
{$F+}
pfawModes:^tmodes;
{$F-}
abData:array[1..238] of byte;
end;
{ just pascal function, which calls ax 4f00 int 10h, passes address of structure above to fetch information from vesa driver, can be just simplified to asm block in it }
function vesatest(var vi:tvesainfo):boolean;
var
os,sg:word;
res:word;
begin
os:=seg(vi);
sg:=ofs(vi);
asm
mov ax,4f00h
mov es,os
mov di,sg
int 10h
mov res,ax
end;
if res=$004f then vesatest:=true
else vesatest:=false;
end;
{ call function above and display basic information about vesa driver installed }
if vesatest(vesainfo)=false then
begin
writeln('This computer doesn''t have VESA');
halt(254);
end;
writeln('VESA signature - ',vesainfo.abSignature);
writeln('VESA version - ',vesainfo.hwVersion,'.',vesainfo.lwVersion);
writeln('VESA manufacturer - ',vesainfo.pfszOEMStr);
大多数现代视频卡都带有 VBE2-Bios 或 VBE3-Bios,并带有自己的 vbe 模式编号模式表,分辨率可能高达 2048x1536 像素,每像素 8、15 或 16、24 或 32 位,并带有一个方面比例为 4:3、4:5、16:9 和 16x10。
Note: Starting with VBE version 2.0, VESA will no longer define new VESA mode
numbers and it will no longer be mandatory to support these old mode numbers
(....from the older VBE 1.x modelist).
所以 VBE-modenumber 可以从 VBE2/3-bios 到 VBE2/3-bios 不同。也许某些 vbe-bios 提供相同的分辨率,但使用不同的模式编号。从 VBE 版本 2.0 开始,我们必须使用 vbe-bios 中的模式表,我们必须逐个检查每个数字,以成为每个数字的模式特定信息,以了解我们可以使用的分辨率和每个像素的位数用它。
更多详细信息可以在 vesa.org 上的公共文档“vbe3.pdf”中找到(免费,但需要注册和登录)。
...
最后,我编写了一个基于纯 DOS 的演示(带有 asm 源代码),展示了如何使用带有自己的 CRT 参数表的视频模式。此演示使用 1024x768x32 的分辨率和 100hz 刷新率。另外这个演示使用线性帧缓冲(LFB;位于 4.GB)和 VBE 硬件三重缓冲。
为了使用 32 位地址写入 LFB,此演示切换到 16 位虚模式。所以它不能和像EMM386.EXE这样的EMS内存管理器一起使用。使用 MSI Geforce 4 TI4200 (64MB; AGPx4) 和三星的 19" CRT 和 Samtron 的 19" CRT 进行测试,容量分别为 96 khz 和 160hz。www.alice-dsl.net/freecracmaps/Tool/Neutrip.zip
短剑