В режимах 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: [di+o], es-. [di+2] и es: [di+4] содержат адреса (смещения относительно начала массива) точек входа в процедуры, дублирующие функции 4F05h, 4F07h и 4F09h для защищенного режима.
Процедуры полностью перемещаемые, они могут выполняться как непосредственно в ROM BIOS, так и в оперативной памяти, разумеется, после предварительного копирования, для чего и нужен размер массива, возвращаемый в регистре сх.
Указанные процедуры должны вызываться как ближние, т. е. без смены сегментного регистра (см. приложение В данной книги). Если задача использует простую линейную модель памяти, то доступ к области BIOS происходит без смены сегментного регистра и нет необходимости копировать процедуры в оперативную память. Если же пространство адресов сегментировано, то процедуры надо скопировать в сегмент кодов. В таком случае их вызов будет происходить без смены сегментного регистра.
Фактически процедуры не являются полными аналогами функций, выполняемых в реальном режиме. Имеются следующие различия:
Кроме перечисленных функций описываемый массив может содержать перечень номеров портов видеокарты и адресов, которые задача может использовать для ввода и вывода данных. Если такой список присутствует, то его смещение относительно начала массива указано в слове es: [di+6].
Если это слово очищено, то списка в массиве нет. Для большинства программистов этот список не представляет интереса, поскольку не известно назначение указанных в нем портов и адресов. Стандарт VBE 2.0 оговаривает только способ их хранения в таблице, но не назначение.
Замечание 2
Замечание 2
Целесообразность введения функции 4FOAh не очевидна, поэтому в версии VBE 3.0 она не относится к числу обязательных.
Программирование работы в защищенном режиме в данной книге не рассматривается. Если вас интересует этот вопрос, то советуем прочитать статьи Андрианова С. А. в журналах "Мир ПК", в них приведены простые примеры работы с описанными функциями. При наличии доступа
К Сети Internet подшивки этих журналов можно найти на www.opensystems.ru.