Проверка поддержки видеорежима
Когда невозможна установка видеорежима?
Установке требуемого видеорежима могут препятствовать три причины:
- режимы 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.