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



 

Исходная цветовая палитра

Исходная палитра цветов. Для того чтобы при включенном компьютере на экране монитора было видно изображение символов или рисунков в DAc-регистры видеокарты должны быть записаны соответствующие коды. Просто очистить все регистры нельзя, поскольку очищенное состояние байтов соответствует черному цвету. Условимся называть палитрой цветов ту совокупность кодов, которая может быть записана в плс-регпстры видеокарты. Если палитра установлена, т. с. находится в DAC-регистрх, то она становится текущей палитрой и используется видеоконтроллером при отображении на экран содержимого видеопамяти.

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

Программа для визуализации палитры

Словесное описание каждого цвета едва ли позволит наглядно представить, как выглядит эта палитра, целесообразнее составить программу, позволяющую увидеть все 256 цветов на экране монитора. Для упрощения программы надо использовать стандартный графический режим VGA IBM (его код I3h). В таком случае потребуется минимум вспомогательных действий, а сравнительно низкое разрешение позволит получить более наглядное изображение. Текст программы приведен в примере 4.1.
Для получения завершенной задачи надо выполнить следующие действия:

  1. 1. Создать исходный файл, содержащий текст примера 4.1. Имя файла вы можете выбрать по своему усмотрению, а тип должен быть asm.
  2. 2. Обработать исходный файл Макроассемблером (произвести компиляцию) для получения объектного модуля, имеющего тип obj.
  3. 3. Обработать объектный модуль с помощью компоновщика (LINK), в результате чего будет получен файл задачи, имеющий тип ехе.

Конкретный способ выполнения перечисленных действий зависит от того, используете вы пакет PWB иди нет. Начиная с версии 6.0, Макроассемблер MASM поставляется в комплекте с пакетом PWB (programmer's workBench— инструментальные средства для программирования). В случае использования пакета все перечисленные в списке действия выполняются непосредственно в рабочей среде, которую поддерживает PWB. Если же он не используется, то сначала создается исходный файл с помощью любого текстового редактора. Затем для его обработки вызывается MASM, который создает объектный модуль. Наконец, для построения задачи из объектного модуля вызывается компоновщик. В любом случае при построении задачи примера 4.1 будет выдано сообщение об отсутствии сегмента, содержащего стек. Это простое предупреждение, а не признак ошибки.

Пример 4.1. Программа для визуализации стандартной палитры

Code SEGMENT начало сегмента "code"
ASSUME CS:code связь регистра CS с сегментом "code"
start: mov ax, 13h код установки видеорежима 13h int lOh установка видеорежима
outscr: mov ax, OAOOOh AOOO — сегмент видеопамяти
mov es, ax пишем его в регистр ES
xor di, di 0 — начальный адрес видеопамяти
mov ex, 200 количество строк на экране
1р_1: push ex сохраняем счетчик повторов
mov ex, 320 указываем размер строки
xor al, al код первой точки (0)
1р_2: stosb рисуем точку
inc al увеличиваем код точки на 1
loop lp_2 управление выводом строки
pop ex восстанавливаем счетчик строк
loop iP..1 управление выводом строк
mov ax, OCOlh код функции ожидания ввода
int 21h DOS ждет нажатия на клавишу
mov ax, 03 код установки видеорежима 3
int lOh установка видеорежима
mov ax, 4COOh код функции завершения задачи
int 21h DOS завершает выполнение задачи
ends конец сегмента "code"
end start конец текста программы
code

Суть выполняемых в программе действий заключается в следующем. На экран последовательно выводится 200 строк. При выводе каждой строки в видеопамять последовательно записывается содержимое регистра ai, которое в исходе равно 0 и после вывода каждой точки увеличивается на 1. Может показаться, что ai изменяется от 0 до 319, но это не так. Регистр al содержит восемь разрядов, поэтому его содержимое будет монотонно нарастать от 0 до 255, на 256-м шаге оно окажется равным нулю, затем будет снова нарастать и в конце строки достигнет значения 63. Все строки заполнены одинаково, поэтому при выполнении программы на экране возникнут разноцветные полосы ("занавес"), каждая из них показывает, какой цвет закодирован в конкретном оде-регистре. Прежде чем обсуждать получаемую картину, завершим описание программы.

Две первые и две последние строчки программы содержат информацию, относящуюся к ее оформлению. Точка входа в программу имеет метку start. Выполнение программы начинается с установки видеорежима VGA IBM, его код 13h, разрешение составляет 320x200 точек, размер палитры 256 цветов.

Далее в регистр es записывается код сегмента видеобуфера АОООЬ. Прямая запись значений в сегментные регистры невозможна, поэтому используется регистр-посредник ах. В регистре di устанавливается нулевой адрес, соответствующий началу строки. Пара регистров es:di выбрана для того, чтобы записывать коды точек командой stosb.
На экране переход с одной строки на другую выполняет видеоконтроллер при достижении конца очередной строки. Программа же просто выводит в цикле 1р_2 количество точек, совпадающее с размером строки для данного режима. Измените 320 на 319 или 321 и картинка "рассыпается", поскольку начало нового цикла вывода не будет совпадать с началом строки на экране.

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

Построенная задача выведет на экран интересующие нас цвета при условии, что палитра установлена. Дело в том, что загрузку палитры при смене режимов работы видеокарты можно запретить, записав 1 в третий разряд слова с адресом оооо:С48Э из области данных BIOS. Обычно этот разряд очищен, и палитра загружается при любых изменениях режимов (как текстовых, так и графических). Одна из функций прерывания int юъ, относящихся к группе i2h, предназначена для разрешения или запрещения загрузки палитры. При ее вызове в регистре ы указывается код 3ih, а в регистре ai — 0 или 1.

Устанавливаемая DOS палитра в книге описана примерно так (это не цитата, а скорее вольный перевод оригинала). Первые 16 DAC-регистров содержат палитру для режима CGA, в следующих 16-ти регистрах записаны коды разных оттенков серого цвета. Затем располагаются три основные группы, занимающие по 72 регистра и содержащие коды цветов высокой, средней и низкой интенсивности. Каждая группа делится на 3 одинаковых подгруппы, содержащие коды цветов высокого, среднего и низкого насыщения. Последние восемь регистров просто очищены, им соответствует черная полоса. Тут автор книги допустил неточность, — фактически при установке палитры последние 8 регистров не заполняются. После включения компьютера они очищаются, но их содержимое могут изменить программы, работающие в графических режимах. Поэтому вместо черной полосы, соответствующей последним восьми линиям, вы можете увидеть другой цвет.

Описанная программа позволяет получить качественное представление о цветах палитры, установленной по умолчанию. Если вас интересуют точные значения, т. е. коды этих цветов, то придется составить собственную программу для распечатки содержимого базовых регистров. В следующем разделе рассмотрены функции BIOS, позволяющие определить содержимое любого DAC-регпстра. Здесь мы опишем младшую часть устанавливаемой BIOS палитры, которая является палитрой CGA.

Стандартная палитра CGA

Установка и поддержка BIOS стандартной палитры CGA вызвана требованием совместимости с устаревшим программным обеспечением.

Программы, создававшиеся для IBM PC/XT и IBM PC/AT, должны выполняться на современных моделях ПК без каких-либо ограничений. Кроме того, палитра CGA нужна при работе в текстовых режимах, которые устанавливаются при первоначальной загрузке компьютера и DOS. Наконец, при описании функций BIOS очень часто приводятся коды цветов палитры CGA. В этом отношении рассматриваемые в данной книге примеры не являются исключением.

Содержимое первых 16-ти DAC-регистров (палитра CGA) показано в табл. 4.2. В ней перечислены коды, названия цветов и содержимое байтов соответствуюших DAC-регмстров. По интенсивности цвета делятся на две группы -, средняя и высокая интенсивность, соответственно таблица разделена па две половины (серый цвет является исключением). Коды — это шестнадшгге-ричные числа. Соответствие между ними и уровнями интенсивности в процентах такое: 3F - 100%, 2А - 67%, 15 -33%.
Поскольку цвет точки зависит от содержимого соответствующего ее коду DAC-регистра, то в дальнейшем, говоря о конкретном цвете, мы будем приводить коды трех базовых цветов (г, д, ь), хранящихся в указанной последовательности в байтах ода-регистра. Например, черному цвету соответствуют коды 0, 0, 0, а белому — коды 3F, 3F, 3F.

Таблица 4.2. Названия и коды цветов палитры CGA
Код точки
Название цвета
Коды базовых цветов
Красный
Зеленый
Синий
0
Черный
00
00
00
1
Синий
00
00
2
Зеленый
00
2А '
00
3
Циан
00
4
Красный
00
00
5
Фиолетовым
00
6
Коричневый
15
00
7
Белый
8
Серый
15
15
15
9
Синий
15
15
3F
А
Зеленый
15
3F
15
В
Циан
15
3F
3F
С
Красный
3F
15
15
D
Фиолетовый
3F
15
3F
Е
Желтый
3F
3F
15
F
Белый
3F
3F
3F

Сравните вторую половину табл. 4.2 с табл. 4.1. Вы увидите, что одноименным цветам в них соответствуют разные значения базовых цветов. Например- красному цвету высокой интенсивности в табл. 4.2 соответствует тройка кодов в 3F, 15, 15, а в табл. 4.1 — зг, оо, оо. Какой из них считать красным. 5 какойи не совсем красным? Еще один пример. В таблицах редактора CorelDrаw фиолетовому цвету средней интенсивности соответствуют коды 26, 00, 2б, а высокой интенсивности — 3F, 26, 3F. В табл. 4.2 для этих же названий цветов указаны другие значения.

Эти примеры иллюстрируют тот факт, что наше восприятие цвета весьма субъективно. То, что одному кажется фиолетовым цветом, другой склонен считатьо пурпурным. Кроме того, наша способность различать близкие цвета весьма индивидуальна. Разница в интенсивности двух близких цветов с кодами 26,00, 26 и 2А, 00, 2А составляет всего 4/64 = 6.25% и вполне возможно, что» она будет неразличима для глаза.

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