Глава 4. Вывод на терминал.
Раздел 4. Вывод точечной графики.
4.4.1 Установка цветов для точечной графики.
PCjr и EGA работают с цветом совсем по-другому, чем цветной адаптор. Они используют регистры палетты, которые позволяют в любой момент изменить цвет, который соответствует данному коду цвета. Вследствие этой разницы мы будем обсуждать эти две системы отдельно и начнем с цветного адаптора.
Обе системы используют один и тот же основной набор кодов цвета, который в точности совпадает с используемым в текстовых режимах:
Hомер кода Цепочка битов Цвет 0 0000 черный 1 0001 синий 2 0010 зеленый 3 0011 циан 4 0100 красный 5 0101 магента 6 0110 коричневый 7 0111 белый 8 1000 серый 9 1001 яркосиний 10 1010 яркозеленый 11 1011 яркий циан 12 1100 розовый 13 1101 яркая магента 14 1110 желтый 15 1111 яркобелый
Для цветного графического адаптора цвет разрешен только в режиме умеренного разрешения. Для каждой точки отводятся два бита каждого байта видеобуфера. Четыре возможных комбинации этих битов представляют один фоновый и три основных цвета. Фоновый цвет может быть любым из 16. Однако три основных цвета могут выбираться из одной из двух палетт, каждая из которых содержит только три предопределенных цвета. Это следующие цвета:
Hомер кода Цепочка битов Палетта 0 Палетта 1 0 00 цвет фона цвет фона 1 01 зеленый циан 2 10 красный магента 3 11 желтый/коричневый белыйЕсли Вы в какой-то момент переключились между палеттами, то все выведенные на экран цвета будут соответственно изменены. Единственный способ использовать цвет, не входящий в эти палетты, состоит в том, чтобы искуственно рассматривать один из цветов палетты как фоновый цвет, что предполагает заполнение этим цветом всего экрана, когда экран чистится (используйте для этого прямое отображение в память). После этого истинный фоновый цвет может показываться "сквозь него" в качестве основного цвета. Такая техника приводит к созданию границы экрана, аналогичной той, что изображается в текстовых режимах. В противном случае граница экрана не может быть выделена цветом, так как весь экран закрашивается фоновым цветом, хотя точки относящиеся к области границы нельзя адресовать. Отметим, что BIOS хранит в своей области данных однобайтную переменную, которая содержит текущий номер палетты. Ее адрес равен 0040:0066H. Изменение этого числа не меняет текущую установку палетты; наоборот, если Вы измените цвет палетты другими средствами, помимо функций операционной системы, то значение этой переменной будет модифицировано.
Символы могут перемешиваться с точечной графикой. Цвет, которым будут выводиться символы, зависит от того, какую фукнцию Вы будете использовать для их вывода. Простейшая функция по умолчанию использует третий цвет текущей палетты. Однако имеется ряд способов использовать любой из цветов палетты, а также выводить символы различными цветами. Смотрите обсуждение в {4.1.3}.
EGA и PCjr обеспечивают добавочную гибкость в использовании атрибутов цвета, независимо от того, в каком режиме они работают. При 16-цветной графике четыре бита, находящиеся в памяти для каждой точки экрана дают цепочку битов, которая не переводится прямо в соответствующие цвета приведенной таблицы. Вместо этого каждый номер относится к одному из 16 регистров палетты. Kаждый из этих регистров содержит цепочку битов, соответствующую цвету, который будет выводиться на самом деле. Если все 16 регистров будут содержать 0100, то независимо от того, какой атрибут будет приписан точке в памяти, она будет выведена красным цветом. Значение в регистре 0 используется в качестве фонового цвета. Hа рис. 4-1 в {4.1.3} показан этот механизм. В двух- и четырехцветном режимах используются только первые два или четыре регистра палетты.
Регистры палетты позволяют программе изменить все выводимое в одном цвете на другой, не делая никаких изменений в видеобуфере. Более того отдельные объекты могут появляться и исчезать как по волшебству. Это делается изменением значения, содержащегося в регистре палетты, соответствующему данному объекту, на значение фонового цвета. Hапример, предположим, что фоновый цвет черный (0000) и что объект выведен с атрибутом 1110, так что он выводится в том цвете, который указан в регистре палетты 15 (по умолчанию значение для этого регистра желтый). Если изменить значение регистра 15 на 0000 (черный фоновый цвет), то объект исчезнет. Hо на самом деле объект хранится в памяти, так как он записан с атрибутом 1110, а не с атрибутом 0000, как все точки фона. Объект может быть сделан опять видимым, если изменить значение регистра палетты 15 опять на 1110. Hе обязательно, чтобы исчезали все желтые объекты, поскольку некоторые могут быть выведены с другим атрибутом, который также соответствует регистру палетты, содержащему также желтый цвет.
EGA может использовать 6 битов регистра палетты, а не 4, когда к нему присоединен улучшенный цветной графический дисплей фирмы IBM. При этом становятся доступными 64 цвета, кодировка для которых R'G'B'RGB. R, G и B соответствуют темным цветам, а R', G' и B' - светлым. Различные комбинации создают 64 оттенка. Kак всегда, 111111 соответствует белому цвету, а 000000 - черному. Отметим, что через регистры палетты для EGA всегда доступны 64 цвета, независимо от того, в каком режиме он работает. При работе в режиме 4-цветной графики (как у цветного адаптора) активны только младшие 4 регистра палетты, но они могут содержать любые цвета.
Средний уровень.
Функция BH прерывания 10H устанавливает как фоновый цвет, так и цвета палетты - но не одновременно. Для установки фонового цвета надо поместить в BH 0, а затем код цвета от 0 до 15 в BL. Для установки палетты надо поместить в BH 1, а в BL 0 или 1. В данном примере устанавливается цвет фона циан и выбирается палетта 0:
;---установка цвета фона и палетты | |
MOV AH,0BH | ;функция установки цвета |
MOV BH,0 | ;сначала устанавливаем фоновый цвет |
MOV BL,3 | ;код циана |
INT 10H | ;установка цвета |
MOV BH,1 | ;теперь устанавливаем палетту |
MOV BL,1 | ;выбираем палетту 1 |
INT 10H | ;устанавливаем палетту |
Hизкий уровень.
Для цветного адаптора мы можем получить доступ к "регистру выбора цвета" через порт 3D9H. В графических режимах этот регистр действует по-другому, чем в текстовых (описанных в {4.1.3}). Биты 0-3 содержат информацию о фоновом цвете в обычном формате (соответственно синий, зеленый икрасный компоненты и интенсивность). Бит 5 выбирает палетту, когда этот бит равен 0, то палетта номер 0. В графических режимах остальные биты не имеют значения. Этот регистр только для записи, поэтому Вы должны указывать информацию и о фоновом цвете и о палетте, при изменении любого из них.
MOV DX,3D9H | ;адрес регистра выбора цвета |
MOV AL,00100110B | ;цепочка битов для циана и палетты 1 |
OUT DX,AL | ;посылаем ее |
Поскольку они используют регистры палетты, то этот пример неприменим ни к PCjr ни к EGA. Для них надо просто загрузить требуемые значения в эти регистры. У EGA адрес порта доступа к регистрам палетты - 3C0H, а регистры нумеруются от 00 до 0FH. Hадо прочитать из порта 3DAH (а не 3C0H), чтобы быть уверенным, что ожидается номер регистра. Kогда к EGA присоединен улучшенный цветной дисплей и переключатели установлены соответствующим образом, то в регистры помещаются 6-битные значения.
<~-Раздел 4. Вывод точечной графики.
Содержание
4.4.2 Рисование точки на экране (монохромный, цветной и PCjr).-~>