Информационные функции VBE
В поле videoModePtr находится адрес начала списка видеорежимов, поддерживаемых картой. Первое слово поля содержит смещение, а второе сегмент. Список расположен в области BIOS, код каждого режима занимает одно слово. Признаком конца списка является код OFFFFh.
В поле TotalMemory указан установленный на видеокарте объем памяти, выраженный в блоках размером 64 Кбайт. 1 Мбайт соответствует 16 блокам (10h). На устаревших моделях видеокарт это поле может быть очищено. В каких случаях полезна описанная функция? Например, если графическая задача рассчитана на выполнение в защищенном (32-разрядном) режиме работы микропроцессора, то обязательно надо проверять номер версии VBE. Видеокарта может работать в таком режиме, если на ней реализованы функции VBE 2.0, НО НС VBE 1. 2.
Анализ состояния разрядов поля capabilities и списка поддерживаемых режимов при выполнении задачи едва ли целесообразен. Поддержка выбранного режима обязательно проверяется в задаче, но делается это более надежным способом, чем просмотр списка, поскольку присутствие режима в списке еще не означает его поддержку. Подробно это обсуждается в Главе 2.
Целесообразно составить простую программу, которая сохраняет в файле или распечатывает результаты выполнения запроса 4FOOh, включая список видеорежимов, и учитывать эти результаты при программировании. Запрос характеристик видеорежимов. В начале выполнения любой графической задачи обязательно вызывается другая информационная функция, которая возвращает данные, необходимые для настройки на работу с конкретной видеокартой. Здесь описана структура информационного блока, а процессу настройки посвящена специальная Глава 2.
Функция 4F01h Get SuperVGA Mode Information позволяет получить информацию о любом из поддерживаемых видеорежимов независимо от того, установлен он или нет. Ее целесообразно вызывать до попытки установить режим, т. к. полученные данные позволяют определить, поддерживает видеокарта работу в нужном режиме или нет, и выполнить ряд подготовительных действий.
Перед вызовом в регистрах es:di указывается адрес массива размером в 256 байтов (как и для функции 4FOOh), а в регистр сх помещается код интересующего вас режима. Если видеокарта содержит VBE, то при возврате в регистре ах записан код 4Fh. Если режим не поддерживается, то признак ошибки не вырабатывается, просто очищаются все поля табл. 1.2.
Результатом исполнения запроса является структура данных, приведенная в табл. 1.2. В первом столбце таблицы указаны смещения полей от начала массива, адрес которого находится в регистрах es:di. Второй столбец содержит размеры полей в байтах. Для примера в трех последних столбцах показаны значения величин, формируемых видеокартой VIRGE /DX /GS семейства S3 при запросе характеристик режимов 10lh (640x480, 256 цветов), 11оh (640x480, 32К) и H2h (640x480, 16М цветов). В шести случаях последние столбцы слиты в один это означает, что данные в соответствующих полях зависят не от режима, а от характеристик видеокарты.
Таблица 1.2. Информация, возвращаемая по запросу 4F0ih.
Адрес поля | Размер поля | Что хранится в поле | Режим 101h | Режим 110h | Режим 112h |
00 | 2 | Атрибуты режима | 009ВН | OOQBh | 009Bh |
02 | 1 | Атрибуты окна А | 07 | ||
03 | 1 | Атрибуты окна в | 00 | ||
04 | 2 | Размер ячейки окна в Кбайт | 0040h | ||
06 | 2 | Размер окна в Кбайт | 0040h | ||
08 | 2 | Код видеосегмента окна А | AOOOh | AOOOh | AOOOh |
OAh | 2 | Код видеосегмента окна в | AOOOh | AOOOh | AOOOh |
OCh | 4 | Адрес подпрограммы BIOS | 556Ch COOOh | ||
10h | 2 | Размер строки в байтах | 0280h | OSOOh | OAOOh |
12h | 2 | Размер строки в точках | 0280h | 0280h | 0280h |
14h | 2 | Количество строк на экране | 01EOh | 01EOh | 01EOh |
16h | 1 | Ширина символа (текст) | 08 | 08 | 08 |
17h | 1 | Высота символа (текст) | 10h | 10h | 10h |
18h | 1 | Количество планов памяти | 01 | 01 | 01 |
19h | 1 | Количество бит на точку | 08 | OFh | 20h |
1Ah | 1 | Количество банков видеопамяти | 01 | 01 | 01 |
1Bh | 1 | Модель видеопамяти | 04 | 06 | 06 |
1Ch | 1 | Размер банка в Кбайт | 00 | 00 | 00 |