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

         

Перемещение по видеопамяти



Перемещение по видеопамяти

Сразу после установки видеорежима на экране отображается содержимое младшей части памяти. Будем называть ее рабочей или отображаемой областью. Размер рабочей области зависит от характеристик режима и равен произведению размера строки в байтах на количество строк, помещающихся на экране.

В процессе выполнения задачи может возникнуть необходимость перемещения рабочей области в другой участок видеопамяти. Например, для просмотра отдельных частей большого рисунка или текста, который полностью не помещается на экране. В англоязычной литературе в таких случаях используется специальный термин 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 позволяет прочитать или
изменить логический размер строки, т. е. определить или изменить адрес видеопамяти, начиная с которого контроллер выводит новую строку на экран.

Перед обращением к BIOS в регистр ы помещается код подфункции: 0 для установки (записи) и 1 для чтения логического размера строки, который указывается или возвращается в регистре сх в виде количества точек.

В обоих случаях после исполнения функции в регистрах находятся следующие величины: bx — количество байтов в строке, сх — количество точек в строке, dx — максимально возможное количество строк указанного размера. Процедура BIOS вычисляет содержимое dx путем деления объема памяти, установленной на видеокарте, на размер строки в байтах. На практике содержимое dx используется крайне редко.

Начиная с VBE 2.0, введены еще два варианта запроса функции 4F06h. Код 2 в регистре ы отличается от кода 0 только тем, что в регистре сх указывается размер строки в байтах, а не в точках. Код 3 позволяет определить максимально возможный логический размер строки для установленного видеорежима. Процедура BIOS вычисляет его исходя из характеристик режима и установленного на видеокарте объема памяти.

Проверка трех видеокарт, соответствующих VBE 2.0, показала, что BIOS видеокарты VIRGE /DX /GX содержит ошибку и при указании кода 3 в регистре ы функция 4F06h выдает совершенную чушь. При кодах 0, 1 и 2 функция выполняется правильно.

Предположим, что при работе в видеорежиме с разрешением 640x480 точек установлен логический размер строки 736 точек. В таком случае при обработке каждой строки видеоконтроллер выводит на экран первые 640 точек, а остальные 96 просто пропускает. На экране будет видна левая верхняя часть изображения размером 640x480 точек. Для того чтобы увидеть его остальную часть, надо переместить рабочую область видеопамяти.
функция 4F07h Get/Set Display start устанавливает или читает координаты левого верхнего угла видимой области видеопамяти, выраженные в виде номеров строки и столбца.

Перед обращением к BIOS в регистре bl указывается 0 для установки новых значений координат или 1 -- для чтения ранее установленных (текущих) координат. Для установки в регистре сх указывается номер столбца, а в регистре dx — номер строки (номера строк и столбцов начинаются с нуля).

При чтении в сх и dx возвращаются текущие значения указанных величин.
Начиная с VBE 2.0, появилась возможность синхронизировать установку новых значений координат рабочей области с моментом обратного хода луча. Для этого в регистре ы указывается код 80h.

Таким образом, функция 4F06h позволяет создать условия для прокрутки в горизонтальном направлении, а функция 4F07h выполняет указанную прокрутку.



Содержание раздела