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

https://infinica.ru/kurs-dollara-na-aprel-prognoz.php


 

Функции BI0S

При рваботе в режимах PPG перед выводом рисунков на экран, как правило, приходпитсм выполнять те пли иные действия, связанные с обращением к одному или нескольким ОАС-регистрам. Способ доступа к ним зависит от техничнеских особенностей конкретной видеокарты, поэтому расположенное на вишдеокарте расширение B10S поддерживает набор функций, выполняющих во.се необходимые манипуляции с DAC-регистрми. Использование в вашей з:аадаче этих функций обеспечивает се независимость от технических особеннностей установленной на ПК видеокарты.

Общими характеристика группы функций 10h

В состав прерывания B10S int 10h входит группа функций с названием set Palette Registers (установка регистггров палитры), выполняющих разнообразные действия, связанные с обслухгживанием внутренних регистров видеокарты. Набор функций, обра-зующи их эту группу, вместе с перечнем входных и выходных параметров был разраОботан фирмой IBM для стандарта VGA и с тех пор не изменялся. Появление стандарта VESA не добавило ничего нового в способы работы с DAС-peгистрами, поскольку в этом не было необходимости.

В даннном разделе рассмотрены только те функции, которые используются при программировании для режимов PPG. Полное описание всех функций вы найдете, в книгах или в Tech Help.

В англоязычной документации на BI0S, DAC-регистры называют еще регистрами цвета (color registers). Такое название вполне соответствует их назначению, и мы будем его использовать в дальнейшем. Кроме них в составе видеооконтроллера существуют регистры палитры (palette registers). Они не нос пользуются при работе в режимах VESA и не имеют никакого отношения и к тем палитрам, о которых идет речь в настоящей книге. Их назначение описано ниже в данной главе.

Для запроса конкретной функции код группы (10h) помещается в регистр ah, а код запрашиваемой функции — в al. Расположение входных и выходных параметров в регистрах зависит от конкретной функции. B10S не проверяет допустимость значений параметров. О корректности запроса должен заботиться программист. Вызов функций B10S, как уже было сказано, выполняет прерывание int10h. Обращаем внимание на то, что совпадение кодов группы и вектора прерывания является случайным.

Работа с одним регистром

В группу 10h прерывания int 10h включены два запроса, позволяющие записать или прочитать один регистр цвета.

Запрос 1010h "Set One Color Register" Записывает нужный код в один из регистров цвета. Перед его вызовом коды базовых цветов помещаются в регистры dh, ch, cl, соответственно красный, зеленый и синий, а номер регистра цвета указывается в bx.

Замечание
Не забывайте, что при работе с регистрами цвета используется только 6 младших разрядов каждого байта. Содержимое двух старших разрядов регистров dh, ch и cl B10S просто игнорирует.

Запрос 1015h "Read One Color Register" выполняет чтоение содержимого регистра цвета. Перед вызовом в регистре bx указывается его номер, а содержимое после выполнения запроса находится в регистрах dh, ch, cl, соответственно красный, зеленый и синий. B10S возвращает шестиразрядные коды базовых цветов.

Замечание
В запросах 1010h и I015h для указания кода цвета используются одни и те же регистры общего назначения.

В примере 4.2 приведена группа команд, записывающих в последит! DAC-регпстр видеокарты (OFFh) код яркого белого цвета.

Пример 4.2. Установка содержимого последнего регистра цвета

mov dh, 3Fh интенсивность красного цвет а
mov ch, 3F'h интенсивность зеленого цвет а
mov cl, 3Fh интенсивность синего цвета
mov bx, 255 номер регистра цвета
mov ax, lOlOh код запрашиваемого действия
int ICh выполнение запроса

Работа с блоком регистров

В группу 10h прерывания int 10h включены два запроса, позволяющие записать или прочитать сразу несколько (блок) регистров цвета.

Запрос 10i2h "Set Block of color Registers" записывает коды базовых цветов в несколько (в блок) регистров цвета. Предварительно в оперативной памяти надо сформировать массив, содержащий и троек байтов, где N соответствует размеру блока. В байтах каждой тройки последовательно указываются шестиразрядные коды красного, зеленого и синего цветов. В литературе такой массив принято называть палитрой используемых цветов. Перед обращением к B10S в регистрах задаются следующие величины: bx — номер первого изменяемого DAC-регистр, сх — количество изменяемых DAC-регистров (к), es:dx — адрес оперативной памяти, соответствующий началу массива кодов устанавливаемых цветов (палитры).

Запрос 10i7h "Read Block of Color Registers" предназначен для копирова-ния содержимого блока регистров цвета в оперативную память. Входные параметры задаются так же, как для запроса 10i2h. В регистре bх указывается номер первого копируемого регистра цвета, в сх — количество копируемых регистров (N), а в es:dx — адрес начала массива, размером в зы байтов для размещении копируемых значений, где N — число, указанное в сх.

Подпрограммы сохранения и восстановления палитры

При выполнении графической задачи может возникнуть необходимость изменить уже установленную палитру, а спустя некоторое время восстановить ее. Чаше всего это делается при полном изменении находящейся на экране картинки, или при переходе к другой странице видеопамяти. В таких случаях перед изменением текущей палитры содержимое всех 256-ти регистров цвета надо сохранить в оперативной памяти. Для сохранения текущей палитры в памяти необходимо выделить пространство (буфер) размером в 3x256 = 768 байтов. Где именно будет расположен этот буфер, не имеет значения, но для возможности его использования в сегменте данных задачи надо выделить два слова и поместить в них смещение (адрес в сегменте) и значение сегмента, содержащего буфер.

Зарезервировать эти два слова можно, например, так:

BuffPal dw 0 ; для указания смещения буфера от начала сегмента
dw 0 ; для указания значения сегмента, содержащего буфер

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

В Примерах 4.3 и 4.4 приведены подпрограммы для сохранения текущей и восстановления ранее сохраненной палитры. Обе подпрограммы используют описанную выше переменную BuffPal для загрузки сегмента и смешения буфера, выделенного для храпения палитры.

Пример 4.3. Сохранение текущей палитры в буфере

SavePa 1 : pusha сохранение "всех" регистров
push es сохранение содержимого es
les dx, dword pt г Buff Pal; сегмент и смещение буфера
xor bx, bx номер первого регистра цвета
mov ex, 256 количество сохраняемых регистров
mov ax, 1017h код запрашиваемой функции
int lOh обращение к функции B10S
pop es восстановление содержимого es
popa восстановление "всех" регистров
ret возврат из подпрограммы

Пример 4.4. Восстановление исходной палитры из буфера

RstPal:pusha сохранение регистров
push es сохранение содержимого es
les dx, dword pt г Buff Pal; сегмент и смещение буфера
xor bx, bx номер первого регистра цвета
rnov ex , 256 количество записываемых регистров
mov ax, 1012h код запрашиваемой функции.
int lOh обращение к B10S
pop es восстановление содержимого es
popa восстановление "всех" регистров
ret возврат из подпрограммы

Тексты примеров 4.3 и 4.4 не требуют особых пояснений, напомним только, что команда les копирует содержимое первого слова переменной BuffPal н регистр dx. а второго слова — в регистр es. Тексты примеров различаются только кодом запроса, помещаемым в регистр ах командой mov. При желании, для сохранения или восстановления палитры можно использовать только одну подпрограмму. Из ее текста надо исключить указанную команду mov, а код запроса (ioi2h или Ю17п) задавать в регистре ах перед вызовом подпрограммы.

Что такое "регистры палитры"

В заключение несколько замечаний о назначении регистров палитры. С ними можно работать только в режимах EGA. VGA и в 16-цветных режимах VESA, а в режимах PPG они не доступны. Если вас не интересуют особенности работы в перечисленных режимах, то можно пропустить оставшуюся часть данного раздела.

Появлению стандарта EGA сопутствовала разработка мониторов, которые позволяли выводить на экран 64 цвета. Однако в стандарте EGA код точки 4-разрядный и, соответственно, доступны только 16 регистров цвета. Для более полного использования возможностей EGA-мониторов количество регистров цвета на видеокартах было увеличено до 64-х. Одновременно работать со всеми регистрами было, по-прежнему, невозможно. Поэтому они делились на четыре одинаковые группы и были введены четыре специальных регистра палитры. Хранящееся в них число (от 0 до 3) указывает помер группы из 116-ти регистров цвета, доступной в данный момент времени.

С появлением VGA-мониторов количество регистров цвета на видеокартах увеличилось до 256-ти, и появилась возможность делить их на 4x64 пли 16x16 групп. Размер кода точки в стандарте VGA IBM позволяет использовать любой из 256-ти регистров цвета. Тем не менее, для совместимости с режимом EGA и расширения его возможностей деление на группы сохранилось, а у видеоконтроллера появилось 16 регистров палитры.

При работе в режиме VGA IBM (но не VESA) восьмиразрядный код точки рассматривается как две независимые тетрады XY. Содержимое старшей тетрады х является номером регистра палитры (от о до F), в котором находится номер одной из 16-ти групп регистров цвета (тоже от о до F). Младшая тетрада Y является номером регистра в этой группе. При установке видеорежима в регистры палитры записываются их порядковые номера от о до огп, в результате регистры цвета оказываются как бы пронумерованными от 0 до 255, и присутствие регистров палитры просто не заметно. Если же принудительно изменить содержимое регистров палитры, то изменится естественный порядок нумерации регистров цвета.

Дополнение к программе визуализации

В качестве примера приведем дополнение к примеру 4.1, позволяющее увидеть на экране эффект от изменения содержимого регистров палитры. Оно приведено в примере 4.5 и должно быть включено в текст примера 4.1 между командами int 2lh и mov ax, 03.

Напомним, что программа примера 4.1 заполняет экран разноцветными вертикальными линиями, ждет ввод любого символа и прекращает свою работу. После указанных изменений вместо прекращения работы будет выполняться группа команд из примера 4.5, которая записывает в регистры палитры значения, противоположные исходным (OFh, ОЕb, ..., i, о). В результате картинка на экране окажется повернутой вокруг вертикальной оси. Например, если в исходном варианте палитра сел располагалась в первых 16-ти столбцах на экране, то теперь она будет находиться в столбцах с номерами 240—255, а расположение цветов в этих столбцах будет противоположно исходному.

После выполнения этих действий программа вновь ждет нажатия на одну из клавиш. Это сделано для того, чтобы оператор мог рассмотреть изменения, произошедшие на экране. После нажатия на клавишу выполнение программы будет закончено и произойдет возврат в DOS.

Пример 4.5. Дополнение (вставка) к программе примера 4.1

mov сх, 16 ; количество изменяемых регистров
mov bx, 0F00h ; код для записи в нулевой регистр
ip_3: mov ax,1000h коя запрашиваемой функции Bios
int lOh установка регистра палитры
inc Ы номер следующего регистра
dec bh код для следующего регистра
looj з lp_3 управление повторами цикла
mov ax, 0C0lh код функции DOS
int 21h ждет нажатия на клавишу

В примере 4.5 использован запрос 1000h, который производит запись в регистр палитры. Перед его вызовом заполняется регистр bx. В старший байт ьь записывается номер группы регистров цвета, а в младший bl — номер регистра палитры.
Содержимое регистра палитры можно прочитать с помощью запроса 1007h. Номер читаемого регистра палитры указывается в ы, а его содержимое после выполнения запроса будет помещено в bh.

В состав группы 10h входят два запроса, которые позволяют прочитать (код 1009h) или записать (код I002h) сразу все регистры палитры. Кроме того, они считывают или записывают еще один специальный регистр, который называется overscan или Border. О назначении этого регистра следует поговорить особо.

Регистр Overscan

При работе в любом видеорежиме на экране существует небольшое свободное пространство, расположенное за "пределами рабочей области. Окраска этого пространства зависит от содержимого регистра цвета, номер которого хранится в регистре overscan. Обычно не используемое пространство окрашено в черный цвет, а поскольку код черного цвета находится в нулевом регистре, то Overscan просто очищен.

Некоторые,программы, например русификатор Keyrus, изменяют содержимое Overscan для окрашивания неиспользуемого пространства экрана в разные цвета. Это позволяет различать режимы работы программы, например ввод русских или латинских букв, не используя рабочую область экрана. Существуют два запроса — 1001h и 1008h, выполняющие запись и чтение регистра Overscan.

Замечание
В заключение еще раз подчеркнем, что в видеорежимах SVGA деление на страницы действует только при работе с палитрой 16 цветов. При работе с палитрой 256 цветов регистры палитры не используются.

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