Авторы стандарта VESA стремились не только облегчить работу программистов, но и не ограничивать разработчиков в выборе способов улучшения характеристик видеокарт. Компромиссным решением было включение в состав BIOS специальных информационных блоков с основными данными о видеокарте. В частности, они содержат список и характеристики всех поддерживаемых видеорежимов. В данном разделе описана структура основных информационных блоков и способ доступа к ним прикладных задач.
На любой видеокарте имеется микросхема пассивной, т. е. доступной только для чтения (ROM), памяти, в которой хранится фрагмент BIOS, содержащий структуры данных и подпрограммы, предназначенные для поддержки работы видеосистемы. В частности, к ним относятся функции, обращение к которым (вызов которых) происходит через прерывание int 10h (Video Services).
В состав группы video Services обязательно входит набор функций для
поддержки стандартных режимов IBM. Он необходим, по крайней мере, для
нормального выполнения процесса загрузки ПК. Дополнением к нему являются
Функции могут иметь входные и выходные параметры, которые передаются в регистрах общего назначения или в сегментных регистрах. Входные параметры нужны для нормального выполнения конкретной функции, а выходные содержат ее возвращаемый результат. Назначение и размещение параметров в регистрах будет описано для каждой функции. Если запрошенная задачей функция поддерживается BIOS, то в регистр ai возвращается код 4Fh.
Важно Это признак того, что функция могла быть выполнена. При успешном выполнении дополнительно очищается байт ah. В противном случае он содержит код ошибки. Таким образом, код 4Fh в регистре ах является признаком успешного выполнения запроса.
Примеры вызова информационных функций VBE и использования возвращаемых ими данных описаны в главе 2.
Запрос общих данных
Для получения общих данных о видеокарте предназначена функция 4FOOh Get SuperVGA information. Входным параметром является адрес массива размером 256 байтов, при исполнении запроса в него записываются данные о видеокарте. Полный адрес этого массива указывается в регистрах es:di. Форма записи es:di общепринята, она означает, что в регистре es находится сегмент памяти, а в регистре di — расположение (смещение) массива в этом сегменте. При исполнении запроса только первые 20 байтов массива заполняются следующими данными:
В первом столбце приведенного списка указаны смещения полей относительно начала массива, адрес которого находится в регистрах es:di. Поле VESASignature содержит ASCII-КОДЫ четырех букв, образующих слово "VESA". Вот ЭТИ КОДЫ — 56h, 45h, 53h, 41h.
Поле VESAVersion занимает 2 байта, содержащих номер версии и ее редакцию, например 0102 для VBE 1.2 или 0200 для VBE 2.0.
В поле OEMStringptr находится полный адрес (из области BIOS) начала строки текста, содержащей наименование изготовителя видеокарты. Коды символов соответствуют стандарту ASCII, а строка заканчивается пустым байтом (формат строки ASCIIZ). Полный адрес занимает два слова, в первом из них хранится смещение, а во втором — код сегмента памяти.
Поле Capabilities состоит из 32-х независимых разрядов (битов), в которых указываются специфические особенности видеокарты. Авторы стандарта явно перестарались, даже в новейшей версии VBE 3.0 описано назначение только пяти младших разрядов.
У рядовой видеокарты все 32 разряда поля capabilities очищены. Установка нулевого разряда означает возможность увеличения количества разрядов регистров DAC до 8 (см. описание функции 4F08h). Установка первого разряда означает, что видеоконтроллер не совместим с режимом IBM VGA.
Установка второго разряда означает необходимость синхронизации момента изменения содержимого регистров DAC с обратным ходом луча (см. описание фуНКЦИИ 4F09h).
Третий и четвертый разряды описаны только в VBE 3.0, они устанавливаются в тех случаях, когда видеоконтроллер или внешние устройства поддерживают работу со стереоскопическими сигналами.
В поле videoModePtr находится адрес начала списка видеорежимов, поддерживаемых картой. Первое слово поля содержит смещение, а второе сегмент. Список расположен в области BIOS, код каждого режима занимает одно слово. Признаком конца списка является код OFFFFh.
В поле TotalMemory указан установленный на видеокарте объем памяти, выраженный в блоках размером 64 Кбайт. 1 Мбайт соответствует 16 блокам (10h). На устаревших моделях видеокарт это поле может быть очищено. В каких случаях полезна описанная функция? Например, если графическая задача рассчитана на выполнение в защищенном (32-разрядном) режиме работы микропроцессора, то обязательно надо проверять номер версии VBE. Видеокарта может работать в таком режиме, если на ней реализованы функции VBE 2 . О, НО НС 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 |
Размер ячейки окна в Кбайт |
0040И |
||
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 |
Адрес поля |
Размер поля |
Что хранится в поле |
Режим 101h |
Режим 110h |
Режим 112h |
1Dh |
1 |
Номер последнем страницы |
0Bh |
05 |
02 |
1ЕЬ |
1 |
Резервный байт |
01 |
01 |
01 |
IFh |
1 |
Размер маски красного цвета |
00 |
05 |
08 |
20h |
1 |
Позиция маски красного цвета |
00 |
0Ah |
10h |
21h |
1 |
Размер маски зеленого цвета |
00 |
05 |
08 |
22h |
1 |
Позиция маски зеленого цвета |
00 |
05 |
08 |
23h |
1 |
Размер маски синего цвета |
00 |
05 |
08 |
24h |
1 |
Позиция маски синего цвета |
00 |
00 |
00 |
25h |
1 |
Размер резервного поля |
00 |
01 |
08 |
26h |
1 |
Позиция резервного поля |
00 |
0Fh |
18 |
27h |
1 |
Флаги для режимов direct color |
00 |
00 |
00 |
Следующие
3 поля заполняются при VBE 2.0 и выше |
|||||
28h |
4 |
Адрес начала видеопамяти |
0000 F800 |
||
2Ch |
4 |
Адрес свободного пространства |
00 |
00 |
00 |
30h |
2 |
Размер свободного пространства |
00 |
00 |
00 |
Часть величин, перечисленных в табл. 1.2, уже обсуждалась выше, назначение остальных будет описано по мере изложения материала, в тех случаях, когда они используются при программировании. Здесь мы ограничимся одним замечанием и опишем байт атрибутов режима.
Замечание Начиная с версии VBE 1.2, появились поля, в которых указываются количество банков видеопамяти (lAh) и размер банка в килобайтах (ich). У всех исследованных видеокарт указан один банк, а его размер равен нулю. Непонятно о каких банках идет речь, тем более, если их размер, выраженный в килобайтах, помещается в пределах одного байта. Поэтому эти поля лучше не использовать до выяснения их назначения.
Атрибуты видеорежима
Нулевое слово информационного массива, возвращаемого по запросу 4FOih, содержит характеристики видеорежима, которые называются атрибутами. Каждый разряд этого слова имеет конкретное назначение, кроме первого, который зарезервирован. Стандарты VBE 1.2 и 2.0 описывают только назначение разрядов младшего байта этого слова (его адpec в массиве 0), а старший байт зарезервирован. В табл. 1.3 показано, что обозначает 1 в каждом из разрядов.
Таблица 1.3. Назначение разрядов кода атрибутов режимов
Бит |
Код |
Что обозначает установка разряда |
0 |
1 |
Видеокарта поддерживает режим |
1 |
|
Резервный разряд (состояние безразлично) |
2 |
1 |
BIOS поддерживает вывод на экран |
3 |
1 |
Используется цветной монитор |
4 |
1 |
Режим графический |
5 |
1 |
Режим не совместим с VGA |
6 |
1 |
Невозможна работа с окнами видеопамяти |
7 |
1 |
Доступно все пространство видеопамяти (VBE 2 . 0) |
При программировании для защищенного режима надо проверять состояние бита 7. Если он установлен, то возможна непосредственная работа со всем пространством видеопамяти без переключения окон (см.