簡體   English   中英

切換到 VESA/VBE?

[英]Switch to VESA/VBE?

所以,我目前正在開發一個操作系統,我陷入了一個非常愚蠢的境地:切換到 VESA/VBE

我目前的代碼:

mov ax, 0x4F02
mov bx, 0x4118
int 0x10

它改變了 Qemu 分辨率,但現在我在繪制像素時遇到了問題。 像素偏移的公式為:

uint32 pixel_offset = y * pitch + (x * (bpp/8)) + framebuffer;

問題是 bpp、pitch 和 framebuffer 應該由

mov ax, 0x4F01
int 0x10

mov ax, 0x4F00
int 0x10

第一的,

mov ax, 0x4F00
int 0x10

軟鎖 qemu。 即使沒有,我該怎么做才能訪問這些信息。

我想要的是一個可以切換到完全用匯編(nasm)編寫的 VESA/VBE 的函數,然后我的內核可以訪問一個用 c 編寫的函數。

編輯:我真的不能在我的引導加載程序中包含任何 C。 我需要匯編代碼。

不要使用“固定模式編號”(例如模式 0x0118),因為該模式可能不受支持,如果支持,它可能與您期望的完全不同,因為“固定模式編號”已棄用約 25幾年前通過 VBE 版本 2。

考慮到這一點,基本步驟是:

a) 使用“BIOS Int x010, function 0x1A (Get Display Combination Code)”檢查計算機是否支持任何類型的視頻。 如果它是一個沒有任何顯卡的服務器,那么設置視頻模式是沒有意義的。 如果顯卡是古老的 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 模式(例如 320*200 和 256 色)或放棄(假設計算機沒有顯卡,即使有,並繼續啟動)。

c) 使用“VBE 功能 0x02(設置模式)”設置選定的視頻模式。 如果此時出現錯誤,請在可能的視頻模式列表中將所選視頻模式標記為“borked”,然后返回“步驟 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 規范。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM