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

маленький член спиды найти гашишь тюмень


  

Основные функции VBE 1.2

BIOS, соответствующая стандарту VBE 1.2, кроме двух информационных, поддерживает еще семь функций, которые описаны в данном разделе.

Установка и чтение режима

Любая графическая задача устанавливает тот видеорежим, на работу с которым она рассчитана. Для этой цели в состав VBE включена специальная функция. Перед ее вызовом целесообразно выполнить функцию 4F01H и проверить возможность работы в выбранном вами режиме, способ проверки описан в главе 2.

Функция 4F02h Set SuperVGA video Mode устанавливает видеорежим VESA, его код перед вызовом функции помещается в регистр bх. Обычно при установке режимов видеопамять очищается и экран оказывается черным. Если в регистре bх установить старший (15-й) разряд, то видеопамять не очищается. Сохранение содержимого видеопамяти может быть полезным (и применяется) в некоторых специальных случаях, но не забывайте, что при смене видеорежима картинка на экране изменяется до неузнаваемости.

Начиная с VBE 2.0, используется 14-й разряд регистра bx. Он должен быть очишен, если задача выполняется в реальном (16-разрядном) режиме работы микропроцессора, и установлен, если задача выполняется в защищенном (32-разрядном) режиме. При установке 14-го разряда возможность работы с окнами обычно исключается, поскольку доступно все пространство видеопамяти. Подробнее об этом сказано в разделе далее.

Функция универсальна в том отношении, что позволяет устанавливать не только режимы VESA, но и режимы IBM. Коды режимов VESA имеют значения от lOOh и выше. Обнаружив в регистре bx код с меньшим значением, функция 4F02h вызывает стандартную процедуру BIOS, предназначенную для установки режимов IBM (обычно ее использует функция 0 прерывания int 10h).

Как уже говорилось ранее, при установке режима код VESA заменяется кодом OEM, который записывается в байт с абсолютным адресом 449h, относящимся к области данных BIOS.

Специальная функции для завершения работы в режиме VESA не предусмотрена — она просто не нужна. В этом случае либо устанавливается новый видеорежим (стандартный или VESA), либо завершается выполнение задачи и DOS выполняет все необходимые действия по восстановлению исходного (текстового) видеорежима.

Функция 4F03h Get Current video Mode позволяет определить код установ-ленного (текущего) режима VESA, который возвращается в регистре bx. Функция введена по той причине, что в байте 44вь хранится код OEM. Исполнение запроса 4F03 сводится к чтению кода OEM из указанного байта и преобразованию его в код VESA по таблице соответствия, которая обязательно входит в состав BIOS.

Сохранение и восстановление состояния

Имеется в виду сохранение текущего содержимого регистров цвета видеокарты (DAC) и некоторых величин, хранящихся в области данных BIOS. Напомним, что регистры DAC используются только при работе В режимах packed pixel graphics.

Функция 4F04h Save/Restore Video State выполняет Копирование вышеназванных званных величин в указанный массив или, наоборот, из указанного массива в регистры DAC и в область данных BIOS. Кроме того, она позволяет определить размер массива, необходимый для размещения сохраняемых величин. Перед вызовом функции заполняется несколько регистров, каких — это зависит от запрашиваемого действия.

Обязательно заполняются регистры сх и dx. В регистре сх используются 4 младших разряда, установка каждого из которых определяет группу сохраняемых или восстанавливаемых величин:

  • бит 0 — характеристики оборудования из области данных BIOS;
  • бит 1 — характеристики видеорежима из области данных BIOS;
  • бит 2 — содержимое регистров DAC;
  • бит 3 — содержимое регистров.

В регистре dx указывается код запрашиваемого действия:

  • 0 — определить размер буфера для размещения сохраняемых величин;
  • 1 — сохранить состояние;
  • 2 — восстановить ранее сохраненное состояние.

Если регистр dx очищен, то регистры их и еs не заполняются. После исполнения запроса в их находится количество байтов памяти, которое надо выделить для сохранения указанных в сх групп величин. Теперь можно выбрать расположение массива в памяти и запросить сохранение состояния.
Если в dx задан код 1 или 2, то в паре регистров es:bx указывается полный адрес массива, в котором надо сохранить или из которого нужно восстановить ранее сохраненные величины.

В соответствии со стандартом 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 Кбайт, в графических режимах его адрес (код) обычно, но не обязательно, равен АОООЬ, а в текстовых вбооь. Код видеосегмента это не более чем признак. Обнаружив его, видеоконтроллер записывает данные в текущее окно видеопамяти или считывает их оттуда.
Текущий номер окна хранится в одном из регистров видеоконтроллера и является частью абсолютного адреса видеопамяти. 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 позволяет прочитать или
изменить логический размер строки, т. е. определить или изменить адрес видеопамяти, начиная с которого контроллер выводит новую строку на экран.

Перед обращением к 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 выполняет указанную прокрутку.

Регистры цвета видеокарты

На видеокартах имеется 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-разрядный режим работы, маловероятна из соображений совместимости.

  
Назад Начало Вперед