首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转到VESA/VBE?

转到VESA/VBE?
EN

Stack Overflow用户
提问于 2019-03-01 12:51:50
回答 1查看 1.2K关注 0票数 0

因此,我目前正在开发一个操作系统,我陷入了一个非常愚蠢的境地:切换到VESA/VBE

我现在的代码是:

代码语言:javascript
复制
mov ax, 0x4F02
mov bx, 0x4118
int 0x10

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

代码语言:javascript
复制
uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;

问题是bpp、音调和帧缓冲区应该由

代码语言:javascript
复制
mov ax, 0x4F01
int 0x10

代码语言:javascript
复制
mov ax, 0x4F00
int 0x10

第一,

代码语言:javascript
复制
mov ax, 0x4F00
int 0x10

软锁qemu即使没有,我该怎么做才能获得这些信息。

我想要的是一个完全用程序集(nasm)编写成VESA/VBE的函数,然后用我的内核可以访问一个用c编写的函数。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)成功设置视频模式后:

  • 如果它是一个8位索引视频模式使用"VBE功能0x08 (设置DAC调色板格式)“然后"VBE功能0x09 (设置调色板数据)”以一种已知的/理智的方式设置调色板(我更喜欢“2位红色,3位绿色,2位蓝色”调色板)。注意:您希望强制显卡的DAC进入默认的“每个通道6位”模式,因为并不总是支持更好的每个通道8位,这避免了使用2段不同的代码来为DAC构造数据的麻烦。
  • 从先前从"VBE函数0x01 (返回模式信息)“获得的信息中提取详细信息(水平和垂直分辨率、帧缓冲区的地址、像素格式、像素之间的字节等),以便将这些信息传递给绘图的任何代码。

注意:为了更容易地支持许多可能的视频模式(这是使代码在更多不同的计算机上工作所必需的);我建议使用“标准为您”的像素格式(例如32-bpp、ARGB)将所有绘图操作到RAM中的缓冲区中,然后在将数据从RAM中的缓冲区复制到框架缓冲区时,将这些数据转换为视频模式实际需要的数据。这样,你画东西的所有代码(线条、矩形、字符、窗口装饰、小猫图片等等)只需要关心水平和垂直分辨率。

注意:您需要找到我提到的所有函数的参数和描述,并确保您了解它们所做的一切以及它们返回的所有信息。您可以在网上找到所有BIOS功能的列表(搜索“拉尔夫·布朗的中断列表”),也可以在线找到VBE规范的多个版本。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54945084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档