Новые возможности 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. |