如何在汇编中获得高级视频模式?

How do I get advanced Video Modes in assembly?

我知道获取视频模式的 int 10h 风格。但我发现更高质量的视频模式需要 16 位寄存器(fxp.110h = 标准 VGA 24 位颜色)。有它的功能还是我需要中断。顺便提一句。我正在做我的例子 OS。 (这是针对图形界面的)

首先,视频 BIOS(INT 10h,AH=0)通过使用 "in" 和 "out" 汇编程序指令将值写入视频控制器来对视频硬件进行内部编程。

通过直接对视频控制器进行编程(通过使用 "in" 和 "out" 写入值),您可以创建 "self-defined" 根本没有任何数字的视频模式。

BIOS 定义的所有视频模式都有编号 0-0FFh,因此不存在编号 110h。

然而,支持特殊模式(例如 640x480x24 位)的显卡 BIOS 不会为此模式使用相同的视频模式代码(因此可能在一个显卡上为 AL=50h,在另一个显卡上为 AL=60h一个).

因此 "VESA extensions" 被定义为使用不同的视频模式设置方法。他们使用 100h-1FFh 范围内的不同数字来表示标准化模式,在 200h-3FFh 范围内表示供应商定义的模式。并非所有 BIOS 都支持这些扩展。我认为大多数现代 "real" BIOS 都支持它们,但也许某些仿真器(如 DOSbox)不支持这些功能。在这种情况下,您将无法获得此视频模式。

顺便说一句:110h是640x480x15bits; 24 位将是 112h。

用于访问这些模式的函数是INT 10h,AX=4F00h-4F0Ch。对于大多数 BIOS 和 MS-DOS 中断,您可以在 "Ralph Brown's interrupt list" 中找到很好的描述:有关 INT 10h 的页面的 link 是:http://www.ctyme.com/intr/int-10.htm.

视频模式设置如下(各个功能的使用方法见上文link):

  • 使用 AX=4F00h 检查是否存在 VESA 扩展并获取功能
  • 使用 AX=4F01h 获取有关视频模式的信息(例如内存段、页面粒度和页面大小)
  • 使用AX=4F02h实际设置视频模式
  • 访问显存时使用AX=4F05h改变视频页

视频页面(有页面大小和页面粒度)是必要的,因为从0A000h:0000h到0A000h:0FFFFh的内存区域只代表64KiB,但这种模式所需的内存远远超过64KiB .使用函数 AX=4F05h,您可以定义要访问的更大视频内存中的哪个 64KiB。