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

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

Когда невозможна установка видеорежима?

Установке требуемого видеорежима могут препятствовать три причины:

  • режимы VESA вообще не поддерживаются;
  • не поддерживается конкретный видеорежим;
  • недостаточно видеопамяти для работы в этом режиме.

Возникновение первой причины может означать, что на компьютере установлена очень старая видеокарта. Кроме того, если задача была вызвана не из DOS, а из Windows З.Х, 9Х, ME или 2000, то при определенных условиях она может не получить доступ к функциям BIOS. Если же задача была вызвана из DOS и качество видеокарты не вызывает сомнений, то имеет смысл проверить состояние системного программного обеспечения, установленного на компьютере.

Возникновение второй причины означает, что предельно допустимый объем видеопамяти, поддерживаемый видеокартой, не позволяет работать в выбранном видеорежиме.

Возникновение третьей причины означает, что установленный на видеокарте объем памяти меньше предельно допустимого и того, который нужен для работы в запрашиваемом видеорежиме.

Объем видеопамяти, необходимый для работы в конкретном режиме, можно подсчитать на основании данных, приведенных в Табл. 1.1. Если окажется, что видеокарта имеет достаточный объем памяти, то имеет смысл проверить состояние системного программного обеспечения, установленного на компьютере. Разумеется, вы должны быть уверены в корректности самой задачи.

Размещение массива Info

Рассмотрим, как производится проверка возможности работы в выбранном видеорежиме. Для проверки соответствия видеокарты стандарту VESA и получения общей информации о ней предназначена функция 4FOOh прерывания int l0h (см. Главу 1). Перед ее вызовом в паре регистров es:di надо указать адрес буфера размером в 256 байтов для размещения полученных данных. Указание буфера обязательно, независимо от того, будет задача использовать эти данные или нет.

Буфер такого же размера потребуется и при следующей проверке для размещения основных данных, используемых в процессе настройки задачи. Выделять специально для него постоянное место в памяти, например, в разделе данных задачи, не целесообразно, поскольку полученная информация нужна только при выполнении подготовительных действий. В задаче наверняка должен быть предусмотрен буфер большего размера для чтения файлов, содержащих рисунки. В приложении Б данной книги описано, как создается такой буфер. При выполнении подготовительных действий этот буфер свободен и в его начало можно поместить служебную информацию. Предположим, что буфер существует и сегмент, в котором он расположен, хранится в переменной info, описанной в разделе данных задачи.

Проверка существования VBE

В примере 2.1 приведен текст фрагмента программы, проверяющего соответствие видеокарты стандарту VESA.

Пример 2.1. Проверка поддержки стандарта VESA.

test_1:push es ; сохранение содержимого es
mov es, Info ; значение сегмента буфера Info
xor di, di ; адрес начала буфера
mov ax, 4F00h ; код запрашиваемой функции
int 10h ; обращение к BIOS
cmp ax, 4Fh ; стандарт VESA поддерживается?
jz test 2 ; › да, продолжение проверок
; нет, выполнение задачи не возможно
pop es ; вывод аварийного сообщения

Выполнение примера 2.1 начинается с сохранения в стеке содержимого регистра es (если он еще не использовался и его содержимое не имеет значения, то команды push es и pop es можно исключить из текста примера). Далее в регистр es записывается значение сегмента, содержащего буфер info, a di очищается для размещения данных с начала буфера. После этого в регистр ах записывается код запрашиваемой функции и происходит обращение к прерыванию BIOS int 10h. Если видеокарта соответствует стандарту VESA, то при возврате из BIOS в ах находится код 4Fh, это и проверяет команда cmp ax, 4Fh. Если результат проверки положительный, то следующая команда jz выполнит переход на метку test_2, которая обозначает начало Примера 2.2.

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