📄 vesa编程介绍4.htm
字号:
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>CX = 想要的宽度(用像素表示)</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2><FONT lang=ZH-CN>输出:</FONT>AX = <FONT
lang=ZH-CN>状态</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BX = <FONT lang=ZH-CN>每扫描线字节数</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>CX = <FONT lang=ZH-CN>每扫描线实际像素</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>DX = <FONT lang=ZH-CN>最大扫描线数</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2><FONT lang=ZH-CN>输入:</FONT>AH = 4Fh 超级VGA支持</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>AL = 06h 逻辑扫描线长度</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BL = 01h 返回扫描线长度</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输出:AX = <FONT lang=ZH-CN>状态</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BX = <FONT lang=ZH-CN>每扫描线字节数</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>CX = <FONT lang=ZH-CN>每扫描线实际像素</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>DX = <FONT lang=ZH-CN>最大扫描线数</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
lang=ZH-CN face=宋体 size=2>注意:</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2><FONT lang=ZH-CN>所需要的按像素表示的宽度可能因为</FONT>VGA<FONT
lang=ZH-CN>硬件情况的原因而不能实现。下一个提供所需像素数的更大的值将被选中,而实际的像素数被返回到</FONT>CX<FONT
lang=ZH-CN>。当加到显存中的指针时,</FONT>BX<FONT
lang=ZH-CN>返回指向下一条扫描线的指针值。比如:在模式13,此值为320,但在模式12为80。</FONT>DX<FONT
lang=ZH-CN>返回基于新扫描线长度和装载的并在该模式下可用的总内存之上的逻辑扫描线数。此函数在文本方式下仍有效。在文本模式下,程序应通过</FONT>BIOS<FONT
lang=ZH-CN>函数找到当前字符单元宽度,并乘以每行想要的字符数,将结果送至</FONT>CX<FONT
lang=ZH-CN>寄存器。</FONT></FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>6-9、07h-设置/获取显示起点</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体
size=2>该函数从逻辑页中选出将在左上角显示的像素点。该函数能用来平移或卷动比显示屏幕更大的逻辑屏幕。它也能在两个不同的显示屏幕间快速切换从而获得双缓冲的动画效果。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输入<FONT lang=ZH-CN>:</FONT>AH = 4Fh 超级VGA支持</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>AL = 07h 显示起点控制</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BH = 00h 保留,必须为0</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=3></FONT><FONT face=宋体 size=2>BL = 00h 选择显示起点</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>CX = 扫描线中第一像素点</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>DX = 第一根扫描线</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输出:AX = 状态</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输入<FONT lang=ZH-CN>:</FONT>AH = 4Fh 超级VGA支持</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>AL = 07h 显示起点控制</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BL = 01h 返回显示起点</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输出:AX = 状态</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BH = 00h 保留为0</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=3></FONT><FONT face=宋体 size=2>CX = 扫描线中第一像素点</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>DX = 第一根扫描线</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>注意:</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体
size=2>此函数在文本模式下仍有效。在文本模式中,程序可以通过BIOS函数获得当前字符单元宽度,再乘以希望开始的字符列数,并将此值送至CX寄存器。同样地,将字符高度乘以所需行数并送至DX寄存器。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>6-10、08h-设置/获取DAC调色板控制</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体
size=2>该函数查询并选择DAC调色板的操作模式。一些DAC提供可选择的6-位、8-位或是更多的RGB色彩成分定义。在标准或是VESA设置超级VGA模式(AX
= 4F02h)调用时被默认地重设为每色6-位。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输入:AH = 4Fh 超级VGA支持</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>AL = 08h 设置/获取DAC调色板控制</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BL = 00h 设置调色板宽度</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BH = 所需的色彩位数(标准的VGA为6)</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输出:AX = 状态</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BH = 当前的色彩位数(标准的VGA为6)</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输入:AH = 4Fh 超级VGA支持</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>AL = 08h 设置/获取DAC调色板控制</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BL = 01h 获得DAC调色板宽度</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>输出:AX = 状态</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>BH = 当前的色彩位数(标准的VGA为6)</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>注意:</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>程序能通过查询由VESA返回超级VGA信息函数(AX =
4F00h)所返回的VGA信息块中兼容性字段的D0位来获知DAC是否可变换。然后程序才能尝试将DAC调色板设置为所需的宽度。如果VGA不能使用请求的调色板宽度,则会选中低一点的超级VGA能使用的值。将最终的调色板宽度返回。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>7、应用举例</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>以下依次说明程序如何与VESA BIOS扩展接口。假设程序已了解了VESA并调用了VESA
BIOS函数。但程序并不是仅仅能支持VESA定义的显示模式。所以在设置显示模式之前先要查询有那些显示模式可用。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>1、程序首先分配一个256字节的缓冲区。该区域用来存放由VESA
BIOS返回的视频环境信息。一些程序需要静态分配空间,而另一些则可通过系统调用动态地获得临时缓冲。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>2、程序然后调用VESA
BIOS函数00h(返回超级VGA信息)。如果函数调用返回后AX寄存器的值不是004Fh,则程序可确定VESA
BIOS不存在。若AX中没有任何错误码,则函数调用成功。缓冲区以被VESA
BIOS扩展填满了各种各样的信息。程序能通过判断信息块首部的字符是否为‘VESA’来确定这是否为有效的VESA信息块。程序还可侦测VESA版本字段来了解VESA
BIOS扩展是否有足够的函数。程序也可通过OEM串来定位OEM特定信息。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>最后,程序能用显示模式指针来获得超级VGA所支持的显示模式列表。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>3、然后程序创建一个新的缓冲区并调用VESA
BIOS函数01h(返回超级VGA模式信息)来获得所支持的显示模式的详细信息。利用第二步获得的显示模式指针,程序以新的模式号为参数调用此函数,直到找到一个合适的显示模式。如果没有合适的,则程序有权放弃。返回超级VGA模式信息的函数将一个程序指定的缓冲区填充为描述显示模式细节的信息。数据块包含了程序所能利用的显示模式的所有优点。程序应检查模式属性字段,来确定模式是否被支持。即检查D0位,如果D0位被清除,那么模式并不被硬件所支持。这种情况在需要一种特殊的显示器或是显示器不在的情况下可能发生。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体
size=2>4、程序选中一个显示模式后,下一步就是初始化。但是程序首先要保存现有的显示模式。只要程序还在,该模式就能被恢复。为获得现有的显示模式,可以使用VESA
BIOS函数03h(获得超级VGA模式)。如果当前模式并非VESA(标准VGA或OEM指定),则填充模式号的低字节而保留高字节。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体 size=2>5、要初始化显示模式,程序要使用VESA
BIOS函数02h(设置超级VGA显示模式)。从此程序就能完全访问VGA硬件和显存了。</FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
face=宋体
size=2>6、当程序要结束的时候,应恢复先前的显示状态。即利用第四步获得的先前的模式号,按第五步的方法设置显示模式。然后退出程序。</FONT></P><FONT
lang=ZH-CN face=宋体 size=2>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"> </P></FONT>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
lang=ZH-CN face=宋体 size=2><End></FONT></P><FONT size=3><B>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">---------------------------------------------------------------------------------</P></B></FONT>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
size=2>相关章节: </FONT> <FONT size=2> <A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-1.htm">(1):
标准<FONT face="Times New Roman">VGA BIOS</FONT>及超级<FONT
face="Times New Roman">VGA</FONT>模式号</A> <A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-2.htm"><FONT
face="Times New Roman">(2)</FONT>:CPU<FONT lang=ZH-CN>显存控制</FONT></A><FONT
lang=ZH-CN> </FONT><A
href="http://shaker.myrice.com/document/vesa-program-introduce/vesa-introduce-3.htm"><FONT
lang=ZH-CN face="Times New Roman">(3)</FONT>:<FONT lang=ZH-CN>扩展的VGA
BIOS</FONT></A></FONT> <FONT lang=ZH-CN face="Times New Roman"
size=2> </FONT></P>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%"><FONT
lang=ZH-CN face="Times New Roman"
size=2> (4):
</FONT><FONT lang=ZH-CN size=2>扩展的VGA BIOS</FONT><FONT lang=ZH-CN
face="Times New Roman" size=2>(</FONT><FONT lang=ZH-CN size=2>续</FONT><FONT
lang=ZH-CN face="Times New Roman" size=2>)</FONT><FONT lang=ZH-CN
size=2>及应用举例</FONT> </P><FONT size=3><B>
<P
style="MARGIN: 0px; WORD-SPACING: 0px; TEXT-INDENT: 0px; LINE-HEIGHT: 100%">==================================================================================</P></B></FONT></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -