Графические устройства

         

Информационные функции VBE

Авторы стандарта VESA стремились не только облегчить работу программистов, но и не ограничивать разработчиков в выборе способов улучшения характеристик видеокарт. Компромиссным решением было включение в состав BIOS специальных информационных блоков с основными данными о видеокарте. В частности, они содержат список и характеристики всех поддерживаемых видеорежимов. В данном разделе описана структура основных информационных блоков и способ доступа к ним прикладных задач.

Вызов функций VВЕ

На любой видеокарте имеется микросхема пассивной, т. е. доступной только для чтения (ROM), памяти, в которой хранится фрагмент BIOS, содержащий структуры данных и подпрограммы, предназначенные для поддержки работы видеосистемы. В частности, к ним относятся функции, обращение к которым (вызов которых) происходит через прерывание int 10h (Video Services).

В состав группы video Services обязательно входит набор функций для поддержки стандартных режимов IBM. Он необходим, по крайней мере, для нормального выполнения процесса загрузки ПК. Дополнением к нему являются


функции VBE, описанные в данном и двух следующих разделах. Перед обращением к BIOS код запрашиваемой функции помещается в регистр ах. Он состоит из кодов группы и функции в группе. Код группы VBE равен 4Fh, он указывается в старшем байте регистра ах. Код функции для версии VBE 1.2 может изменяться от 0 до 8, он указывается в младшем байте регистра ах. Таким образом, содержимое регистра ах при вызове функций VBE 1.2 МОЖет ИЗМенЯТЬСЯ ОТ 4F00h ДО 4F08h.

Функции могут иметь входные и выходные параметры, которые передаются в регистрах общего назначения или в сегментных регистрах. Входные параметры нужны для нормального выполнения конкретной функции, а выходные содержат ее возвращаемый результат. Назначение и размещение параметров в регистрах будет описано для каждой функции. Если запрошенная задачей функция поддерживается BIOS, то в регистр ai возвращается код 4Fh.

Важно Это признак того, что функция могла быть выполнена. При успешном выполнении дополнительно очищается байт ah. В противном случае он содержит код ошибки. Таким образом, код 4Fh в регистре ах является признаком успешного выполнения запроса.

Примеры вызова информационных функций VBE и использования возвращаемых ими данных описаны в главе 2.

Запрос общих данных

Для получения общих данных о видеокарте предназначена функция 4FOOh Get SuperVGA information. Входным параметром является адрес массива размером 256 байтов, при исполнении запроса в него записываются данные о видеокарте. Полный адрес этого массива указывается в регистрах es:di. Форма записи es:di общепринята, она означает, что в регистре es находится сегмент памяти, а в регистре di — расположение (смещение) массива в этом сегменте. При исполнении запроса только первые 20 байтов массива заполняются следующими данными:

  • 00 4 байта — VESASignature;
  • 04 2 байта — VESAVersion;
  • 0б 4 байта — OEMStringptr;
  • 0Ah 4 байта — Capabilities;
  • 0Eh 4 байта — VideoModePtr;
  • 12h 2 байта — TotalMemory.

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

Содержание раздела