MS-DOS - 可以编程24位图形吗?

时间:2013-10-18 23:23:11

标签: assembly x86 dos vga vesa

是否可以在DOS机器上以24位的颜色深度进行编程?我知道VGA支持8位颜色深度,但是有没有办法输出24位?谷歌的研究一无所获。我在FreeDOS而不是MS-DOS上编程,如果这会影响答案。

2 个答案:

答案 0 :(得分:4)

是的,有可能。您应该阅读VESAappropriate driversHere is several functions

然后你就可以做到:

  mov ax,4f02h
  mov bx,103h
  int 10h

如果设置了VESA且设置了103h(800x600x256)模式,通常会提供004fh的ax,例如可以使用11bh(1280x1024x16M)(http://www.delorie.com/djgpp/doc/rbinter/it/83/0.html

更新:我正在附上我非常古老的pascal程序中的一些代码:

{ 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);

答案 1 :(得分:1)

大多数现代视频摄像机都带有VBE2-Bios或VBE3-Bios,并且具有自己的vbe模式编号,可能分辨率高达2048x1536像素,每像素8,15或16,24或32位,长宽比为4:3,4:5,16:9和16×10。

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模式数可以与VBE2 / 3-bios不同,也可以与VBE2 / 3-bios不同。也许一些vbe-bios提供相同的分辨率,但使用不同的模式编号。从VBE版本2.0开始,我们必须使用vbe-bios中的modetable,我们可以按编号检查每个数字,以成为每个数字的模式特定信息,以便知道分辨率和每个像素我们可以使用多少位用它。

更多细节可以在vesa.org上的公共文本“vbe3.pdf”中找到(免费,但需要注册和登录)。

...

最后我写了一个基于纯DOS的演示(使用asm sourcode),演示了如何使用带有自己的CRT参数表的视频模式。 此演示使用1024x768x32的分辨率和100hz刷新率。 Addititinal这个演示使用线性framebuffe(LFB;位于4.GB)和VBE硬件三重缓冲。

要使用32位写入LFB,请将此演示切换到16位无法模式。因此它不能与EMS memorymanager一起使用,如EMM386.EXE。 经过三星的MSI Geforce 4 TI4200(64MB; AGPx4)和19“CRT以及Samtron的19”CRT测试,容量分别为96 khz和160hz。 www.alice-dsl.net/freecracmaps/Tool/Neutrip.zip

德克