Основные функции VBE 1.2
Перед обращением к BIOS в регистры помещается код подфункции: 0 для установки (записи) и 1 для чтения логического размера строки, который указывается или возвращается в регистре сх в виде количества точек.
В обоих случаях после исполнения функции в регистрах находятся следующие величины: bx – количество байтов в строке, сх – количество точек в строке, dx – максимально возможное количество строк указанного размера. Процедура BIOS вычисляет содержимое dx путем деления объема памяти, установленной на видеокарте, на размер строки в байтах. На практике содержимое dx используется крайне редко.
Начиная с VBE 2.0, введены еще два варианта запроса функции 4F06h. Код 2 в регистре bl отличается от кода 0 только тем, что в регистре сх указывается размер строки в байтах, а не в точках. Код 3 позволяет определить максимально возможный логический размер строки для установленного видеорежима. Процедура BIOS вычисляет его исходя из характеристик режима и установленного на видеокарте объема памяти.
Проверка трех видеокарт, соответствующих VBE 2.0, показала, что BIOS видеокарты VIRGE /DX /GX содержит ошибку и при указании кода 3 в регистре bl функция 4F06h выдает совершенную чушь. При кодах 0, 1 и 2 функция выполняется правильно.
Предположим, что при работе в видеорежиме с разрешением 640x480 точек установлен логический размер строки 736 точек. В таком случае при обработке каждой строки видеоконтроллер выводит на экран первые 640 точек, а остальные 96 просто пропускает. На экране будет видна левая верхняя часть изображения размером 640x480 точек. Для того чтобы увидеть его остальную часть, надо переместить рабочую область видеопамяти.
Функция 4F07h Get/Set Display start устанавливает или читает координаты левого верхнего угла видимой области видеопамяти, выраженные в виде номеров строки и столбца.
Перед обращением к BIOS в регистре bl указывается 0 для установки новых значений координат или 1 – для чтения ранее установленных (текущих) координат. Для установки в регистре сх указывается номер столбца, а в регистре dx – номер строки (номера строк и столбцов начинаются с нуля).
При чтении в сх и dx возвращаются текущие значения указанных величин.
Начиная с VBE 2.0, появилась возможность синхронизировать установку новых значений координат рабочей области с моментом обратного хода луча. Для этого в регистре bl указывается код 80h.
Таким образом, функция 4F06h позволяет создать условия для прокрутки в горизонтальном направлении, а функция 4F07h выполняет указанную прокрутку.
Регистры цвета видеокарты
На видеокартах имеется 256 регистров DAC, в которых хранятся коды базовых цветов. Они применяются только при работе в видеорежимах packed pixel graphics и не используются в режимах direct color. Базовых цветов три – красный, зеленый и синий. В соответствии со стандартом IBM VGA код базового цвета занимает 6 двоичных разрядов. У некоторых современных видеокарт, например Matrox, появилась возможность увеличения размера кода до 8 разрядов. В таком случае в поле capabilities будет установлен нулевой разряд (см, описание функции 4F00h).
Функция 4F08h Get/set DAC Palette Control предназначена для определения или изменения размера кода базовых цветов, хранящихся в регистрах цвета. Для установки нового размера регистр ы очищается (код 0), а в регистр bh записывается нужный размер кода базового цвета в битах. Для чтения установленного размера базовых цветов в регистр ы записывается код 1, а текущий размер возвращается в регистре bh.
Если видеокарта не позволяет изменить размер кода, то при попытке установки указанная в bh величина заменяется на 6.
Таков полный перечень функций VBE 1.2. Возможно, вы обратили внимание на отсутствие в нем функций, выполняющих запись кодов точек в видеопамять или их чтение. Такие функции просто не нужны, поскольку возможны непосредственные запись и чтение содержимого байтов, слов или двойных слов видеопамяти, т. е. в ней могут находиться операнды команд.
В расположенной на видеокарте BIOS сохранились функции записи и чтения кодов точек во всех графических стандартах IBM. Их вызов осуществляется через прерывание int 10h, коды запросов ось для записи точки и ODh для чтения. Эти функции нужны только в тех случаях, когда при работе с видеопамятью используются внутренние регистры видеокарты. Уже с появлением режима VGA IBM необходимость в их использовании при программировании отпала.
В заключение следует отметить, что последующие версии VBE совместимы сверху вниз с VBE 1.2, поэтому описанные функции выполняют все современные видеокарты. Вероятность массового выпуска видеокарт, рассчитанных только на 32-разрядный режим работы, маловероятна из соображений совместимости.