Проверка поддержки видеорежима
Если результат проверки отрицательный (код отличается от 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.