因此,我目前正在开发一个操作系统,我陷入了一个非常愚蠢的境地:切换到VESA/VBE
我现在的代码是:
mov ax, 0x4F02
mov bx, 0x4118
int 0x10它改变了Qemu的分辨率,但现在我在绘制像素时遇到了问题。像素偏移的公式是:
uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;问题是bpp、音调和帧缓冲区应该由
mov ax, 0x4F01
int 0x10和
mov ax, 0x4F00
int 0x10第一,
mov ax, 0x4F00
int 0x10软锁qemu即使没有,我该怎么做才能获得这些信息。
我想要的是一个完全用程序集(nasm)编写成VESA/VBE的函数,然后用我的内核可以访问一个用c编写的函数。
编辑:我真的不能在我的引导加载程序中包含任何C。我需要装配代码。
发布于 2019-03-01 21:13:32
不要使用“固定模式号”(例如,模式0x0118),因为该模式可能不受支持,如果支持该模式,则可能与您预期的完全不同,因为“固定模式号”在25年前被VBE版本2取消。
考虑到这一点,基本步骤是:
( a)检查计算机是否支持使用"BIOS x010,函数0x1A (获取显示组合代码)“的任何视频。如果一个服务器没有任何视频卡,那么设置视频模式是没有意义的。如果视频卡是一个古老的EGA,使用VBE也是没有意义的。
( b1)使用"VBE函数0x00 (返回VBE控制器信息)“获取有效视频模式编号的列表。如果这个功能不起作用,回到“只使用古老的VGA”或者放弃(假设没有显卡,即使有)。
( b2)对于列出的每个模式编号,使用"VBE函数0x01 (返回模式信息)“来确定模式是什么。理想情况下,您可以过滤掉代码不支持的任何内容(例如,时髦的旧"16色平面“模式,任何需要超过64 KiB的视频RAM,但不支持LFB,任何使用YUV而不是RGB的模式,.)同时创建一个可能性列表。如果此功能不能工作,只需跳过视频模式。注意:您还需要跟踪"VBE版本号“(从VBE控制器信息),并使用它来理解"VBE函数0x01 (返回模式信息)”返回的信息(例如,确定视频卡是否应该返回一些仅为VBE的后期版本/s提供的信息)。
( b3)高级/可选步骤。在创建可能的视频模式列表时,您可能希望交叉引用来自监视器的信息,并尝试筛选出监视器不支持的视频模式。请注意,VBE返回的视频模式可能由视频卡支持,而不是由监视器支持;因此,除非检查,否则不能保证任何内容( 640*480视频模式除外)都能正常工作。警告:解析EDID是可怕的(主要是因为他们试图以尽可能少的比特打包,为不同的视频时间(有些需要自己的查找表)使用几种不同的格式);试图将“模式定时”(由监视器报告,包括刷新速率等)匹配到“视频模式”(由VBE使用,没有任何计时/刷新信息)并不是一门精确的科学。
( b4)在您获得完整的视频模式列表后(根据操作系统支持的内容以及监视器支持的内容进行过滤);使用某种方式来确定哪种模式是“最佳”模式。这可能比您想象的要复杂得多(例如,计算监视器支持模式的概率、监视器有多喜欢视频模式/它有多接近监视器的本机分辨率、操作系统出于性能原因喜欢该模式多少、以及如果用户有视频模式的话,视频模式与用户的偏好有多近;然后进行某种计算,将所有独立的因素组合成视频模式的单个最终得分;并选择视频模式和最佳的最终评分)。注意:如果列表是空的,回到可怕的旧VGA模式(例如320*200和256颜色)或放弃(假设计算机没有显卡,即使有,并继续引导)。
c)使用"VBE功能0x02 (Set模式)“设置选定的视频模式。如果此时出现错误,请在可能的视频模式列表中将选定的视频模式标记为“硼化”,然后返回到“步骤b4”。
( d)成功设置视频模式后:
注意:为了更容易地支持许多可能的视频模式(这是使代码在更多不同的计算机上工作所必需的);我建议使用“标准为您”的像素格式(例如32-bpp、ARGB)将所有绘图操作到RAM中的缓冲区中,然后在将数据从RAM中的缓冲区复制到框架缓冲区时,将这些数据转换为视频模式实际需要的数据。这样,你画东西的所有代码(线条、矩形、字符、窗口装饰、小猫图片等等)只需要关心水平和垂直分辨率。
注意:您需要找到我提到的所有函数的参数和描述,并确保您了解它们所做的一切以及它们返回的所有信息。您可以在网上找到所有BIOS功能的列表(搜索“拉尔夫·布朗的中断列表”),也可以在线找到VBE规范的多个版本。
https://stackoverflow.com/questions/54945084
复制相似问题