Переключиться на 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. И даже если это не так, что мне делать, чтобы получить доступ к информации.
То, что я хочу, это функция, которая переключается на VESA/VBE, написанную ПОЛНОСТЬЮ в сборке (nasm), и затем функция, написанная на c, может получить доступ к моему ядру.
РЕДАКТИРОВАТЬ: Я действительно не могу включить C в моем загрузчике. Мне нужен ассемблерный код.
1 ответ
Не используйте "номера с фиксированным режимом" (например, режим 0x0118), потому что режим может не поддерживаться, и если он поддерживается, он может быть чем-то совершенно отличным от того, что вы ожидаете, потому что "номера с фиксированным режимом" устарели около 25 лет назад VBE версии 2.
Учитывая это, основными шагами являются:
a) Проверьте, поддерживает ли компьютер какой-либо вид видео, используя "BIOS Int x010, функция 0x1A (Получить код комбинации дисплея)". Нет смысла устанавливать режим видео, если это сервер без видеокарты. Также нет смысла использовать VBE, если видеокарта является древней EGA.
b1) Используйте "функцию VBE 0x00 (возврат информации о контроллере VBE)", чтобы получить список действительных номеров режима видео. Если эта функция не работает, вернитесь к "только древнему VGA" или сдайтесь (предположим, что видеокарты нет, даже если она есть).
б2) для каждого номера режима, который был указан; используйте "VBE function 0x01 (Return Mode Information)", чтобы выяснить, что это за режим. В идеале; вы бы отфильтровали все, что ваш код не поддерживает (например, старые фанк-режимы "16 цветов", все, что требует более 64 КБ видеопамяти, но не поддерживает LFB, все, что использует YUV, а не RGB, ..).) при создании списка возможностей. Если эта функция не работает, просто пропустите режим видео. Примечание: Вы также захотите отслеживать "номер версии VBE" (из информации контроллера VBE) и использовать его для понимания информации, возвращаемой "функцией VBE 0x01 (Информация о режиме возврата)" (например, чтобы определить, является ли видеокарта должна возвращать часть информации, которая присутствует только в более поздних версиях VBE).
б3) Расширенный / необязательный шаг. При создании списка возможных режимов видео; Возможно, вы захотите сделать перекрестные ссылки на информацию с монитора и попытаться отфильтровать режимы видео, которые монитор не поддерживает. Обратите внимание, что видео режим, возвращаемый VBE, может поддерживаться видеокартой и не поддерживаться монитором; поэтому, если вы не проверите, вы не можете гарантировать, что что-либо (кроме 640*480 видеорежимов) действительно будет работать. ВНИМАНИЕ: Парсинг EDID ужасен (в основном из-за того, что они пытались упаковать как можно больше в наименьших битах, с несколькими различными форматами для разных временных интервалов видео, где некоторым требуются собственные таблицы поиска); и попытка согласовать "синхронизацию режима" (сообщаемую монитором, включая частоту обновления и т. д.) с "режимом видео" (используемым VBE, без какой-либо информации о синхронизации / обновлении) не является точной наукой.
b4) после получения полного списка режимов видео (отфильтрованных по тому, что поддерживает ваша ОС и, возможно, по тому, что поддерживает монитор); использовать что-то вроде того, чтобы выяснить, какой режим является "лучшим" режимом. Это может быть намного сложнее, чем вы думаете (например, выяснить вероятность того, что монитор поддерживает режим, насколько монитору нравится режим видео / насколько близко он соответствует собственному разрешению монитора, насколько ОС нравится режим производительности). причины и то, насколько близок режим видео к предпочтениям пользователя, если он у него есть, затем выполните какой-либо расчет, чтобы объединить все отдельные факторы в единую итоговую оценку для режима видео, и выберите режим видео с наилучшей конечной оценкой.). Примечание. Если список пуст, вернитесь к ужасным старым режимам VGA (например, 320*200 с 256 цветами) или откажитесь (предположим, что на компьютере нет видеокарты, даже если она есть, и продолжите загрузку).
c) Установите выбранный режим видео с помощью "VBE function 0x02 (Set Mode)". Если в этот момент вы получаете сообщение об ошибке, отметьте выбранный режим видео как "borked" в списке возможных режимов видео, а затем вернитесь к "шагу b4".
г) После успешной настройки режима видео:
если это был 8-битный индексированный видеорежим, используйте "функцию VBE 0x08 (установить формат палитры ЦАП)", а затем "функцию VBE 0x09 (установить данные палитры)", чтобы настроить палитру известным / разумным способом (я предпочитаю "2- немного красная, 3-битная зеленая, 2-битная синяя палитра). Примечание: Вы хотите принудительно установить ЦАП видеокарты в режим "6 бит на канал" по умолчанию, потому что не всегда поддерживается лучший 8 бит на канал, и это избавляет от необходимости иметь 2 разных куска кода для построения данных. для ЦАП.
извлеките детали (разрешение по горизонтали и вертикали, адрес буфера кадра, формат пикселя, байты между строками пикселей и т. д.) из информации, полученной ранее из "VBE function 0x01 (Return Mode Information)", чтобы вы могли передать это информация о том, что код делает ваш рисунок.
Примечание. Чтобы упростить поддержку множества возможных режимов видео (что необходимо для работы кода на более разных компьютерах); Я рекомендую выполнять все рисование в буфер в ОЗУ, используя пиксельный формат "стандартный для вас" (например, возможно 32-бит / с, ARGB), а затем преобразовывать эти данные в то, что на самом деле хочет режим видео при копировании данных из буфера в ОЗУ в кадровый буфер. Таким образом, весь ваш код для рисования (линии, прямоугольники, символы, оформление окон, изображения котят и т. Д.) Должен заботиться только о горизонтальном и вертикальном разрешении.
Примечание. Вам нужно будет найти параметры и описания всех функций, которые я упомянул, и убедиться, что вы понимаете все, что они делают, и всю информацию, которую они возвращают. Вы можете найти список всех функций BIOS онлайн (поиск "Список прерываний Ральфа Брауна"), и вы можете найти несколько версий спецификаций VBE онлайн.