Проверка поддержки видеорежима
Установка видеорежима
После успешного выполнения трех описанных проверок можно либо сразу установить рабочий видеорежим, а затем продолжить подготовительные действия, либо, наоборот, сначала завершить всю подготовку и лишь после этого устанавливать рабочий видеорежим. Только из соображений удобства описания, мы сначала рассмотрим установку видеорежима, а затем вернемся к подготовительным действиям.
Установку режимов VESA осуществляет функция 4F02h. Если при завершении задачи должен быть восстановлен исходный видеорежим, то его значение сохраняется в разделе данных. Следующий фрагмент программы иллюстрирует способ сохранения исходного и установку нового видеорежима.
Пример 2.4. Сохранение исходного видеорежима и установка нового.
stmd: mov ax,OFOOh | код функции "Чтение видеорежима" |
int lOh BIOS | читает текущий видеорежим |
mov OldMode, al | сохранение кода видеорежима |
mov bx, NewMode | ; код одного из режимов VESA |
mov ax, 4F02h | ; код запрашиваемой функции BIOS |
int lOh BIOS | ; исполняет запрос |
cmp ax, 4Fh | ; режим установлен? |
jz succ › | ; да, на продолжение программы |
; Ошибка при установке видеорежима |
В тексте примера 2.4 использованы имена OldMode и NewMode. Первое из них может быть только именем байта, расположенного в области данных программы. Как создаются такие имена, описано в последнем разделе данной главы. NewMode может быть именем расположенного в области данных слова, или константы, которой заранее присвоено конкретное значение, скажем, NewMode = noh. Кроме того, код режима может быть указан в команде явно, например, mov bx, noh. Если при выполнении задачи видеорежим устанавливается только один раз, то выбор способа указания NewMode произволен. Тем не менее использование переменных является более универсальным и предпочтительным приемом.
Первые три команды примера 2.4 считывают текущий видеорежим и сохраняют его в байте OldMode. Следующие три команды устанавливают новый режим, в котором будет работать задача. После второго возврата из BIOS анализируется содержимое регистра ах. Если в нем записан код 4Fh, то нужный режим установлен и происходит переход на начало примера 2.5 (метка succ). Отличие кода от 4Fh означает чрезвычайную ситуацию, поскольку предварительно были выполнены проверки, показавшие, что видеокарта поддерживает нужный режим. Если ваша задача заведомо корректна, то остается только проверять общее состояние компьютера и программного обеспечения.
В примере 2.4 для определения значения исходного видеорежима издается запрос 0Fh прерывания int 10h. При его исполнении BIOS просто считывает в регистр al содержимое байта 0000:0449, относящегося к области данных BIOS. Выполнить эти действия можно непосредственно в задаче без обращения к BIOS. В таком случае исключаются примерно 30 команд, которые BIOS выполняет при расшифровке запроса, сохранении и восстановлении содержимого регистров.
Коды VESA и OEM
Размер кода режимов VESA превышает размер байта, поэтому при установке этих режимов в байт 0000:0449 записывается так называемый код OEM, т. е. код, выбираемый по усмотрению разработчиков видеокарты. В ROM BIOS имеются две таблицы соответствия для преобразования кодов видеорежимов из VESA в OEM и обратно. Никаких соглашений относительно значений кодов OEM не существует, кроме того, что его размер не превышает семи разрядов, а значения отличаются от кодов видеорежимов IBM.
Функция VBE 4F03h читает код текущего видеорежима из байта 0000:0449 и преобразует его в код режима VESA по таблице соответствия, хранящейся в ROM BIOS. Если в указанном байте находился код одного из видеорежимов IBM, то его значение не изменяется. В этом отношении функция 4F03h более универсальна, чем функция 0Fh.
Стандартная функция установки видеорежимов IBM (функция оо прерывания int 10h) установит режим VESA, если при обращении к ней в регистре al указать соответствующий код OEM. Так что коды OEM не совсем бесполезны, они, например, используются в драйверах для Windows.
Если вы владеете техникой дисассемблирования, то можно сравнительно просто найти в ROM BIOS таблицы соответствия кодов режимов VESA и OEM.
Эти таблицы используются функции VBE 4F02h и 4F03h.