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



  

Новые возможности VBE 2.0

Уже на момент публикации VBE 1.2 выпускались микропроцессоры, поддерживающие работу в защищенном (32-разрядном) режиме и существовало соответствующее программное обеспечение. Поэтому возникла необходимость в создании следующей версии, учитывающей особенности защищенного режима. Она была опубликована в ноябре 1994 года и получила название VBE 2.0. Интересно, что в этой версии были добавлены только две новые функции и внесены некоторые дополнения в ранее существовавшие, о них говорилось в предыдущем разделе.

Линейное пространство адресов

Защищенный режим отличается от реального тем, что не только данные, но и адреса содержат 32 разряда. Соответственно, размер адресуемого в командах пространства составляет 4 294 967 296 байтов или 4 Гбайт (4 биллиона байтов). У современных ПК реальный объем оперативной памяти намного меньше указанной величины, любой адрес оперативной памяти не только помещается в 32-разрядном регистре, но и не заполняет весь регистр, часть старших разрядов остается свободной.

Оперативная память занимает младшую часть всего пространства адресов, поэтому BIOS и область ввода-вывода перенесены в его старшую часть. Самые старшие адреса отведены для BIOS, например, при перезагрузке ПК происходит обращение к адресу FFFFFFF0II.

Видеопамять, как и оперативная, образует линейное пространство адресов, которое в документации VESA называется FFB (Flat Frame Buffer) или LFB
(Linear Frame Buffer). В Защищенном режиме возможен произвольный доступ к любым адресам видеопамяти без использования механизма переключения окон. Физический (абсолютный) адрес начала LFB хранится в поле 28h (см. табл. 1.2), он не зависит от видеорежима. В качестве примера в табл. 1.2 приведено значение FS000000H.

Содержимое следующих двух полей (2Ch и 3оh) зависит от видеорежима. Эти поля заполнены не у всех видеокарт, а в VBE з.о вообще объявлены резерв-
ными потому, что их содержимое можно легко вычислить. В поле 2Ch должна храниться сумма адреса начала LFB и размера рабочей области памяти. В поле зоь должна находиться разность между общим объемом видеопамяти и размером ее рабочей области.

Замечание
Напомним, что размер рабочей области вычисляется как произведение величин, указанных в полях 10h (размер строки в байтах) и I4h (количество строк) (см. табл. 1.2).

физический адрес нельзя использовать для работы с видеопамятью, он должен быть предварительно преобразован в линейный адрес. Способ такого преобразования и сегментный регистр, указываемый при работе с LFB, зависят от используемого задачей распределения памяти. Например, если применяется простая линейная (гладкая — flat) модель, то физический адрес просто уменьшается на базовый адрес области данных, а для доступа к любым адресам используется сегментный регистр DS.

Для того чтобы видеоконтроллер поддерживал работу с LFB при установке видеорежима (функция 4F02), в регистре bx кроме указания кода режима надо установить 14-й разряд, например, bx = 4ioih для установки режима lOih и разрешения работы с LFB.

В большинстве случаев после разрешения работы с LFB исключается возможность работы с окнами видеопамяти. При этом запросы функции 4F05h отвергаются и в регистре ah возвращается код ошибки 3. Но в литературе встречаются сведения о существовании видеокарт, без уточнения их названия, одновременно допускающих оба способа работы с видеопамятью.

Следует заметить, что поддержка LFB является самым существенным нововведением VBE 2.0. При работе с LFB исключается необходимость контроля адресов видеопамяти в задачах для определения моментов, когда надо изменять текущее окно. Это значительно упрощает и ускоряет манипуляции с графическими объектами.

Работа с регистрами палитры

В режимах packed pixel graphics коды цветов точек хранятся в регистрах палитры (их 256). Эти регистры недоступны обычным командам. Для записи или чтения их содержимого необходимо обращение к внутренним регистрам видеокарты.

В VBE 1.2 отсутствует специальная функция, выполняющая чтение или изменение содержимого регистров DAC палитры. Прикладные задачи могут использовать для этой цели стандартные функции IBM VGA, примеры работы с ними описаны в главе 4 данной книги.

VBE 2.0 такая функция введена. В отличие от функций IBM VGA она использует другой формат палитры, позволяет изменять содержимое блока регистров DAC во время обратного хода луча и поддерживает работу с дополнительным набором регистров палитры, если таковой имеется.

Функция 4F09h Get/Set Block DAC Registers позволяет сохранить или изменить текущую палитру цветов (содержимое блока регистров DAC). Код выполняемого действия указывается в регистре bl. При сохранении блока регистров bl=1, а при записи bl=о. В регистре сх задается количество сохраняемых или изменяемых регистров (размер блока), а в регистре dx — номер первого сохраняемого регистра (0 — 255).

Для размещения палитры в оперативной памяти надо выделить массив размером 4*N байтов, где N — размер блока, указанный в регистре сх (напомним, что он не может быть больше чем 256). Содержимое каждого регистра занимает 4 подряд расположенных байта, в первых трех находятся коды синего, зеленого и красного цветов, а четвертый очищен. Полный адрес массива задается в регистрах es-.di (es — сегмент, di — смещение).

Такое расположение базовых цветов принято в палитре формата BMP (см. приложение А данной книги). Отметим, что в формате BMP код базового цвета занимает 8 разрядов, а у большинства видеокарт он составляет 6 разрядов. Поэтому при использовании данной функции может потребоваться преобразование хранящихся в файле кодов базовых цветов. Подробнее об этом сказано в главе 4 данной книги.

Некоторые модели видеокарт содержат дополнительную группу регистров палитры. Для работы с дополнительной группой в регистре ы указываются коды 2 или 3 (вместо 0 или 1). Если дополнительная палитра отсутствует, то при возврате из BIOS в регистре ah находится код ошибки 2.

В некоторых моделях видеокарт содержимое регистров палитры можно изменять только во время обратного хода луча, в противном случае на экране появляются помехи ("снег"). Признаком такой особенности видеокарты является установка бита 2 в поле capabilities (см. описание функции 4F00h). В таком случае вместо кода 0 в регистре ы указывается 8оь.

Интерфейс защищенного режима. Большинство функций BIOS, в том числе и функций VEE, независимо от версии, рассчитано на выполнение в реальном (16-разрядном) режиме работы микропроцессора. Если задача выполняется в защищенном (32-разрядном) режиме, то для обращения к функциям BIOS необходим временный переход в реальный режим работы микропроцессора. Это увеличивает количество вспомогательных действий при вызове функций BIOS и замедляет процесс их выполнения. Замедление становится ощутимым, если функции вызываются часто.

Разработчики VBE 2.0 предусмотрели возможность непосредственного вызова процедур, дублирующих функции 4F05h, 4F07h и 4F09h, но рассчитанных на выполнение в защищенном режиме. Прикладная задача определяет адреса точек входа в указанные процедуры следующим способом.

Функция 4FOAh Return VBE 2.0 Protected Mode Interface Возвращает адрес массива, содержащего указанные выше процедуры и некоторые дополнительные данные. Перед ее вызовом надо очистить регистр bl. После исполнения запроса в регистры возвращаются следующие величины:

  • es — сегмент массива, расположенного в области BIOS в формате для реального режима (чаще всего код соооh);
  • di — адрес (смещение) начала массива в этом сегменте;
  • сх — размер массива в байтах.

Первые три слова массива es: [di+o], es-. [di+2] и es: [di+4] содержат адреса (смещения относительно начала массива) точек входа в процедуры, дублирующие функции 4F05h, 4F07h и 4F09h для защищенного режима.

Процедуры полностью перемещаемые, они могут выполняться как непосредственно в ROM BIOS, так и в оперативной памяти, разумеется, после предварительного копирования, для чего и нужен размер массива, возвращаемый в регистре сх.

Указанные процедуры должны вызываться как ближние, т. е. без смены сегментного регистра (см. приложение В данной книги). Если задача использует простую линейную модель памяти, то доступ к области BIOS происходит без смены сегментного регистра и нет необходимости копировать процедуры в оперативную память. Если же пространство адресов сегментировано, то процедуры надо скопировать в сегмент кодов. В таком случае их вызов будет происходить без смены сегментного регистра.

Фактически процедуры не являются полными аналогами функций, выполняемых в реальном режиме. Имеются следующие различия:

  • Аналог 4F05h поддерживает работу только с одним окном д.
  • Аналог 4F07h лишь устанавливает новое начало отображаемого участка видеопамяти, причем вместо номера строки и столбца при вызове указывается полный (32-разрядный) адрес начала отображаемой области. Его старшая часть помещается в регистр dx, а младшая — в сх.
  • Аналог 4F09h поддерживает только основной набор регистров DAC.

Кроме перечисленных функций описываемый массив может содержать перечень номеров портов видеокарты и адресов, которые задача может использовать для ввода и вывода данных. Если такой список присутствует, то его смещение относительно начала массива указано в слове es: [di+6].

Если это слово очищено, то списка в массиве нет. Для большинства программистов этот список не представляет интереса, поскольку не известно назначение указанных в нем портов и адресов. Стандарт VBE 2.0 оговаривает только способ их хранения в таблице, но не назначение.

Замечание
Целесообразность введения функции 4FOAh не очевидна, поэтому в версии VBE 3.0 она не относится к числу обязательных.

Программирование работы в защищенном режиме в данной книге не рассматривается. Если вас интересует этот вопрос, то советуем прочитать статьи Андрианова С. А. в журналах "Мир ПК", в них приведены простые примеры работы с описанными функциями. При наличии доступа
К Сети Internet подшивки этих журналов можно найти на www.opensystems.ru.

Заключительные замечания

Несмотря на небольшое число функций (11), их состав оказался вполне достаточным. Авторы версии VBE 3.0, которая опубликована в сентябре 1998 года, не ввели ни одной новой функции, а только расширили возможности существующих с учетом новейших достижений разработчиков видеокарт.

В разные годы ассоциация VESA выпустила несколько небольших документов с описанием функций специального назначения. Формально они не относятся к VBE и их описание отсутствует во всех стандартах. Даже авторы VBE 3.0 ограничились их перечислением и весьма лаконичным комментарием. Вот перечень этих функций без комментариев:

  • 4FiOh — Power Management Extension (PM) для стандарта DPMS;
  • 4Fiih — Flat Panel Interface Extension (FP);
  • 4Fi3h — Audio Interface Extension (AI);
  • 4Fi4h — OEM Extension, вводимые по усмотрению разработчиков;
  • 4Fi5h — Display Data Channel (DDC).

Функции с кодами 10h, I4h и ish были обнаружены автором при исследовании зюз видеокарт с версиями VEE 1.2 и VBE 2.0. Если вы умеете восстанавливать исходные тексты BIOS, то можно проверить, какие функции поддерживает интересующая вас видеокарта.

Общая характеристика стандарта VBE закончена и мы переходим к описанию программирования работы с графикой в иидеорежимах VESA.

  
Назад Начало