Иллюстрированный самоучитель по SVGA

Проверка поддержки видеорежима

Если результат проверки отрицательный (код отличается от 4Fh), то дальнейшее выполнение задачи не возможно. На экран надо вывести аварийное сообщение типа "Видеокарта не поддерживает режимы VESA" и прекратить выполнение задачи. Как можно подготовить текст сообщения и вывести его на экран, описано в Главе 5, посвященной работе с текстом.

В случае успешного выполнения запроса, в буфере info находится общая информация о видеокарте (см. Главу 1). Как правило, ее использует только Windows при выборе драйверов для работы с конкретной картой. Нам драйверы подбирать не надо, поэтому интерес может представлять только объем видеопамяти, указанный в слове массива info со смещением 12h. Эта величина выражена в блоках размером по 64 Кбайт, поэтому 1 Мбайт соответствует код 10h. Объем видеопамяти в случае его использования при выполнении задачи надо сохранить в области данных, т. к. уже на следующем шаге содержимое массива info изменится.

Если видеокарта соответствует стандарту VESA, то надо проверить, поддерживается выбранный вами видеорежим или нет, и одновременно прочитать в массив info информацию о нем. В примере 2.2 показано, как можно выполнить эти действия.

Пример 2.2. Чтение информации о режиме и проверка его поддержки.

test 2:mov ax, 4F01h ; код запрашиваемой функции
mov ex, NewMode; ; код нужного видеорежима
int 10h ; обращение к BIOS
pop es ; восстановление содержимого es
cmp ax, 4Fh ; нужный режим поддерживается?
jz test_3 ; › да, продолжение проверок
; нет, указанный видеорежим не поддерживается

Предполагается, что пример 2.2 выполняется после Примера 2.1, поэтому пара регистров es:di содержит адрес буфера info для записи информации о режиме и в стеке сохранено содержимое регистра es. Выполнение примера начинается с указания кодов запрашиваемой функции и нужного видеорежима, после чего происходит обращение к BIOS для выполнения запроса. После возвращения в задачу восстанавливается сохраненное в стеке исходное содержимое регистра es. Если видеокарта рассчитана на поддержку выбранного видеорежима, то в ах будет находиться код 4Fh, это и проверяет предпоследняя команда примера. Если условие выполнено, то произойдет переход на метку test_3 (начало примера 2.3) для продолжения проверок.

Если код в регистре ах отличается от 4Fh, то видеокарта не поддерживает требуемый видеорежим. В зависимости от конкретных особенностей задачи, ее выполнение может быть либо прервано, либо предпринята попытка перейти на работу в другом режиме, требующем меньший объем видеопамяти. Если вы уверены в корректности задачи и в том, что видеокарта поддерживает нужный режим, то проверьте системное программное обеспечение, установленное на компьютере. В практике автора был случай, когда драйвер манипулятора "мышь" реагировал на выполнение функции 4FOih, к которой °н не имел никакого отношения. В остальном работа этого драйвера не вызывала никаких нареканий. Ошибка была выявлена при работе задачи, в которой проверялось исполнение запросов функций VESA, и устранена путем замены драйвера.

Заключительная проверка

Если в регистре ах находится код 4Fh, то остается последний штрих – проверить достаточность реально существующего (а не предельно допустимого) объема видеопамяти для поддержки вндеорежима. При сборе информации о запрошенном режиме BIOS выполняет нужные для проверки вычисления и сравнения, результат которых помещается в нулевой разряд нулевого байта массива info. Задаче остается только проверить состояние этого разряда.

После выполнения примера 2.2 было восстановлено исходное содержимое регистра es и доступ к массиву info с использованием этого регистра уже невозможен. Для дальнейшей работы с данными о режиме надо выделить другой сегментный регистр, например, fs или gs, который не используется функциями BIOS.

Фрагмент программы, выполняющий заключительную проверку, приведен в примере 2.3. Предполагается, что он выполняется после примеров 2.1 и 2.2, поэтому регистр di очищен и указывает начало буфера, содержащего данные о режиме. Для доступа к этим данным используется сегментный регистр fs, поэтому в него записывается значение переменной info.

Пример 2.3. Заключительная проверка поддержки видеорежима.

test_3: mov fs, Info ; сегмент с данными о режиме
test byte ptr fs:[di], 1 ; объем видеопамяти достаточен?
jne stmd ; › да, конец проверок
  ; Недостаточно видеопамяти для поддержки нужного режима

В команде test запись byte ptr явно указывает, что операндом является байт. Тип операнда указывается в тех случаях, когда Макроассемблер не может его определить по записи команды. Если нулевой разряд байта установлен, то объем памяти достаточен и команда jne передаст управление на метку stmd, указанную перед первой командой примера 2.4.

Если нулевой разряд очищен, то объем видеопамяти не достаточен для поддержки выбранного режима. Что делать в подобных случаях, говорилось при описании Примера 2.2.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.