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