切换到VESA / VBE?

Tel*_*lno -2 x86 assembly nasm osdev vesa

因此,我目前正在使用操作系统,并且处于非常愚蠢的状态:切换到VESA / VBE

我当前的代码:

mov ax, 0x4F02
mov bx, 0x4118
int 0x10
Run Code Online (Sandbox Code Playgroud)

它改变了Qemu分辨率,但是现在我在绘制像素时遇到了问题。像素偏移的公式为:

uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;
Run Code Online (Sandbox Code Playgroud)

问题是bpp,pitch和framebuffer应该由

mov ax, 0x4F01
int 0x10
Run Code Online (Sandbox Code Playgroud)

mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)

第一,

mov ax, 0x4F00
int 0x10
Run Code Online (Sandbox Code Playgroud)

软锁qemu。即使没有,我该怎么做才能访问该信息。

我想要的是一个功能,该功能可以切换为完全用汇编语言(nasm)编写的VESA / VBE,然后可以使用我的内核编写的函数访问。

编辑:我真的不能在我的引导程序中包含任何C。我需要汇编代码。

Bre*_*dan 5

不要使用“固定模式编号”(例如,模式0x0118),因为可能不支持该模式,并且如果支持该模式,则可能与您的预期完全不同,因为“固定模式编号”已弃用了大约25多年前由VBE版本2发行。

考虑到这一点,基本步骤为:

a)使用“ BIOS Int x010,功能0x1A(获取显示组合代码)”检查计算机是否支持任何类型的视频。如果服务器是没有视频卡的服务器,那就不用费心设置视频模式了。如果视频卡是古老的EGA,那么使用VBE也没有意义。

b1)使用“ VBE功能0x00(返回VBE控制器信息)”获得有效视频模式编号的列表。如果此功能不起作用,请退回到“仅适用于VGA”或放弃(假设没有视频卡,即使有)。

b2)对于列出的每个模式号;使用“ VBE功能0x01(返回模式信息)”来确定模式是什么。理想地;您会滤除代码不支持的所有内容(例如,时髦的旧式“ 16色平面”模式,需要超过64 KiB的视频RAM但不支持LFB的任何内容,使用YUV而不是RGB的任何内容,.. 。),同时创建可能性列表。如果此功能不起作用,请跳过视频模式。注意:您还需要跟踪“ VBE版本号”(来自VBE控制器信息),并使用它来理解“ VBE功能0x01(返回模式信息)”返回的信息(例如,确定是否视频卡应该返回一些仅在VBE的更高版本中提供的信息。

b3)高级/可选步骤。在创建可能的视频模式列表时;您可能想与显示器的信息进行交叉引用,并尝试滤除显示器不支持的视频模式。请注意,视频卡可能支持VBE返回的视频模式,而显示器可能不支持;因此,除非您进行检查,否则不能保证任何内容(640 * 480视频模式除外)都将正常工作。警告:解析EDID是可怕的(主要是因为它们试图以最少的位打包尽可能多的数据,对于不同的视频时序,它们采用几种不同的格式,其中有些需要您自己的查找表);并尝试将“模式定时”(由监视器报告,包括刷新率等)与“视频模式”(由VBE使用,没有任何定时/刷新信息)匹配并不是一门精确的科学。

b4)获得完整的视频模式列表之后(根据操作系统支持的内容以及监视器支持的内容进行过滤);使用某种方式找出哪种模式是“最佳”模式。这可能比您想象的要复杂得多(例如,计算出显示器支持该模式的可能性,显示器对视频模式的喜欢程度/与显示器的原始分辨率的匹配程度,操作系统对这种模式的喜欢程度如何)。原因以及视频模式与用户的偏好之间的接近程度(如果有的话);然后进行某种计算以将所有单独的因素组合为视频模式的单个最终得分;并选择最终得分最高的视频模式)。注意:如果列表为空,请退回到可怕的旧VGA模式(例如

c)使用“ VBE功能0x02(设置模式)”设置所选的视频模式。如果此时出现错误,请在可能的视频模式列表中将所选的视频模式标记为“已中断”,然后返回到“步骤b4”。

d)成功设置视频模式后:

  • 如果它是8位索引视频模式,则使用“ VBE功能0x08(设置DAC调色板格式)”,然后使用“ VBE功能0x09(设置调色板数据)”以已知/合理的方式设置调色板(我更喜欢使用“ 2-位红色,3位绿色,2位蓝色”调色板)。注意:您要强制将视频卡的DAC设置为默认的“每通道6位”模式,因为并不总是支持更好的每通道8位,并且避免了使用2个不同的代码来构造数据的麻烦用于DAC。

  • 从“ VBE函数0x01(返回模式信息)”中获得的信息中提取细节(水平和垂直分辨率,帧缓冲区的地址,它是哪种像素格式,像素行之间的字节等),以便您可以通过有关绘制代码的信息。

注意:为了更轻松地支持许多可能的视频模式(使代码在更多不同的计算机上工作是必需的);我建议使用“适合您的标准”像素格式(例如32-bpp,ARGB)将所有图形绘制到RAM的缓冲区中,然后从RAM中的缓冲区复制数据到帧缓冲区。这样,您用于绘制内容的所有代码(线条,矩形,字符,窗户装饰,小猫的图片等等)都只需关心水平和垂直分辨率。

注意:您将需要找到我提到的所有功能的参数和说明,并确保您了解它们的所有操作以及它们返回的所有信息。您可以在线找到所有BIOS功能的列表(搜索“ Ralph Brown的中断列表”),并且可以在线找到多个版本的VBE规范。