Основные функции VBE 1.2
В соответствии со стандартом VGA IBM функция lch прерывания int 10h имеет аналогичное название и выполняет аналогичные действия. В описании VBE дана ссылка на эту функцию и разработчики видеокарт приняли ее как установку к действию. Анализ восстановленного текста BIOS у нескольких видеокарт с версиями VBE 1.2 и VBE 2.0 показал, что выполнение функции 4F04h сводится к проверке кода, указанного в dx. Если он больше чем 2, то запрос отвергается, в противном случае происходит обращение к функции ich. Никакие другие действия не выполняются.
В этой связи возникает вопрос: каким действиям соответствует установка бита 3 регистра сх? Дело в том, что функция ich сохраняет только фрагменты из области данных BIOS и содержимое регистров DAC. Никакие другие величины не сохраняются и не восстанавливаются.
Возможно, что разработчики видеокарт не придали указанному факту должного значения по той причине, что функция 4F04h редко используется при программировании, без нее можно обойтись.
Переключение окон видеопамяти
Окна видеопамяти используются при работе микропроцессора в реальном режиме. В этом случае командам доступно пространство адресов размером не более 64 Кбайт. У современных карт объем видеопамяти намного (в десятки раз) превосходит указанную величину. Поэтому видеопамять делится на одинаковые сегменты размером 64 Кбайт, которые принято называть окнами.
Для доступа к видеопамяти выделяется видеобуфер (или видеосегмент). Это пространство адресов размером 64 Кбайт, в графических режимах его адрес (код) обычно, но не обязательно, равен АОООb, а в текстовых b6OOb. Код видеосегмента это не более чем признак. Обнаружив его, видеоконтроллер записывает данные в текущее окно видеопамяти или считывает их оттуда.
Текущий номер окна хранится в одном из регистров видеоконтроллера и является частью абсолютного адреса видеопамяти. BIOS поддерживает работу с этим регистром.
Функция 4F05h CPU Video Memory Control читает или изменяет номер текущего окна видеопамяти. Наличие этой функции позволяет задачам работать со всем пространством видеопамяти.
Перед вызовом функции 4F05h в регистре bх указываются номер окна и запрашиваемое действие. Нуль в регистре bh (старший байт регистра bx) означает установку нового окна с номером, указанным в dx. Единица в регистре bh означает чтение номера текущего окна, он возвращается в регистре dx. В главе 2 подробно описана техника переключения окон и формат, в котором указываются их номера.
Стандартом VESA предусмотрена возможность существования у видеокарты двух окон (А и в). Нуль в регистре bl (младшем байте регистра bх) соответствует окну А, а единица – в. Почти все исследованные автором видеокарты поддерживали работу только с окном А. Исключением являются видеокарты фирмы ATI Technologies, у которых окно А доступно только для записи данных в видеопамять, а окно в – только для чтения.
Программная реализация функции 4F05h такова, что основные действия выполняет отдельная процедура (подпрограмма), к которой задача может обращаться непосредственно, т. е. минуя прерывание int 10h. Функция 4FOih размещает адрес этой подпрограммы в выходном массиве в двойном слове со смещением ось (см. Табл. 1.2). Стандарт VESA рекомендует прямое обращение к подпрограмме вместо использования функции 4F05h.
Перемещение по видеопамяти
Сразу после установки видеорежима на экране отображается содержимое младшей части памяти. Будем называть ее рабочей или отображаемой областью. Размер рабочей области зависит от характеристик режима и равен произведению размера строки в байтах на количество строк, помещающихся на экране.
В процессе выполнения задачи может возникнуть необходимость перемещения рабочей области в другой участок видеопамяти. Например, для просмотра отдельных частей большого рисунка или текста, который полностью не помещается на экране. В англоязычной литературе в таких случаях используется специальный термин scrolling – прокрутка, перемещение, просмотр. Механизм прокрутки используют многие приложения для Windows, oн реализуется в виде горизонтального и вертикального лифтов.
Для реализации механизма прокрутки, в первую очередь должна существовать возможность размещения в видеопамяти большого изображения. Высота изображения (количество строк) может быть произвольной, лишь бы хватило видеопамяти. Но ширина ограничена величиной, которая в документации называется logical scan line. В процессе отображения видеопамяти контроллер, отсчитав указанное в ней количество байтов, начинает выводить следующую строку на экране. Если ширина рисунка больше чем scan line, то продолжение текущей строки окажется на экране в следующей строке и изображение будет искажено. Чтобы это не произошло, надо установить значение scan line равным ширине рисунка.
В Табл. 1.2 значение scan line расположено в поле 10h, оно равно произведению количества точек в строке (поле I2h Табл. 1.2) на размер кода точки в байтах. В поле I9h табл. 1.2 указано количество разрядов в коде точки. Количество байтов определяется делением количества разрядов на 8.
Функция 4F06h Get/Set Logical Scan Line Length позволяет прочитать или изменить логический размер строки, т. е. определить или изменить адрес видеопамяти, начиная с которого контроллер выводит новую строку на экран.