Справочник программиста на персональном компьютере фирмы IBM. Вывод на терминал - Установка цветов для точечной графики. Часть 2

ОГЛАВЛЕНИЕ

   Высокий уровень.


   Когда цветной дисплей работает в графическом режиме, то Бейсик
обрабатывает  оператор COLOR по другому, чем в текстовом  режиме.
Сначала идет фоновый цвет, в виде  числа от 0 до 15, а затем идет
номер палетты 0 или 1.  Например, COLOR 2,1 устанавливает зеленый
фоновый цвет (#2)  для  всего  экрана  и  активизирует палетту 1.
После  этого три возможных основных цвета указываются их номерами
в палетте: 1 - циан, 2 - магента и 3 - белый (сравните с операто-
ром  PAINT).  Чтобы выключить цвет в режиме умеренного разрешения
напишите SCREEN ,1.  Отметим,  что использование только черного и
белого  цветов в режиме умеренного разрешения  не приводит к эко-
номии памяти. PCjr использует оператор COLOR таким образом только
в  режиме  SCREEN 1.  Для режимов от SCREEN 3 до SCREEN 6  формат
этого оператора COLOR основной,фоновый.  При этом основной цвет -
это число в диапазоне от 1 до 15 в 16-цветном режиме и от 1 до  3
- в 4-цветном. Он не должен быть равным 0, который всегда исполь-
зуется в качестве фонового цвета.
   Имеются специальные операторы для установки регистров палетты:
PALETTE и PALETTE USING. PALETTE устанавливает цвет соответствую-
щий любому атрибуты.  Например, PALETTE 9,11 приводит к тому, что
точки нарисованные с цветом палетты  9 (обычно светлосиний) будут
выведены в цвете 11 (светлый циан). Чтобы изменить установку всех
регистров палетты к их  первоначальному  значению, т.е. чтобы ре-
гистр 0 содержал 0, регистр 12 - 12 и т.д.  надо написать  просто
PALETTE. Отметим,  что  в  режимах  SCREEN  4 и SCREEN 6 регистры
палетты инициализируются таким образом, чтобы атрибуты цветов 1-3
были такими же, как для палетты 1 на цветном графическом дисплее.
Это делается в целях совместимости.
   Все 16 регистров палетты могут быть установлены одним операто-
ром PALETTE USING.  PALETTE  USING  направляет содержимое 16-эле-
ментного целого массива в регистры палетты.  Имея несколько таких
массивов программа может быстро переключать  различные схемы цве-
тов.   Каждый элемент массива должен быть числом в диапазоне от 0
до 15, или -1, в  последнем  случае  соответствующий  регистр  не
изменяется.   Например, для обращения привычной схемы цветов соз-
дайте массив, в котором  ARRAYNAME(0)  =  15, ARRAYNAME(1) = 14 и
т.д.  Затем напишите PALETTE USING ARRAYNAME(0) и содержимое мас-
сива ARRAYNAME будет передано в  регистры  палетты.  0 индицирует
начальную позицию в массиве, с которой надо брать данные посылае-
мые в регистры.  Могут  использоваться  более длинные массивы, из
которых  данные могут браться начиная с любой точки, при  условии
что до конца массива еще есть 16 элементов.  PALETTE USING ARRAY-
NAME(12) будет брать данные, начиная с 12-го байта массива. Отме-
тим, что оператор PALETTE USING работает как в текстовом, так и в
графическом режимах. Вот пример:

100 DEF INT A-Z         'все переменные целые
110 DIM SCHEME1(16)     'массив для схемы цветов #1
120 DIM SCHEME2(16)     'массив для схемы цветов #2
130 DATA 3,5,9,2,4,12,15,1,6,7,14,13,8,11,10,0
140 DATA 0,11,13,7,1,12,2,5,10,8,14,6,15,4,9,3
150 FOR N = 0 TO 15     'для каждого регистра палетты
160 READ Q              'прочитать код цвета
170 SCHEME1(N) = Q      'и поместить его в массив
180 NEXT                '
190 FOR N = 0 TO 15     'то же самое со вторым массивом
200 READ Q              '
210 SCHEME2(N) = Q      '
220 NEXT                '
230 PALETTE USING SCHEME1(0)  'установка регистров
 .
500 PALETTE USING SCHEME2(0)  'меняем их посреди программы

   Средний уровень.


   Функция  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           ;устанавливаем палетту

   На PCjr эта функция работает точно  так же в 4-цветном режиме,
устанавливая  регистры  1-3 в одну из схем  цветов,  используемых
цветным адаптером. В 2-цветном режиме 0 в BL соответствует белому
цвету, как цвету 1, а 1 - черному.  Эта функция не влияет на наз-
начения, используемые в 16-цветном режиме. Однако во всех случаях
фоновый цвет может быть установлен засылкой в BH 0, а в BL - кода
цвета.

   Низкий уровень.


   Для цветного адаптера  мы  можем  получить  доступ к "регистру
выбора цвета" через порт 3D9H. В графических режимах этот регистр
действует по-другому, чем в текстовых (описанных в [4.1.3]). Биты
0-3 содержат информацию о фоновом цвете в обычном формате  (соот-
ветственно синий, зеленый  икрасный  компоненты и интенсивность).
Бит 5 выбирает палетту, когда этот бит равен 0, то палетта  номер
0.  В графических режимах остальные биты не имеют значения.  Этот
регистр только для записи, поэтому Вы должны указывать информацию
и о фоновом цвете и о палетте, при изменении любого из них.

   MOV  DX,3D9H          ;адрес регистра выбора цвета
   MOV  AL,00100110B     ;цепочка битов для циана и палетты 1
   OUT  DX,AL            ;посылаем ее

   Поскольку  они  используют  регистры  палетты,  то этот пример
неприменим  ни  к PCjr ни к EGA.  Для них надо  просто  загрузить
требуемые значения в эти регистры. У PCjr эти регистры нумеруются
от 10H до 1FH. Доступ ко всем регистрам осуществляется через один
порт с адресом 3DAH. Любое новое значение принимаемое этим портом
воспринимается  адресным регистром.  Поэтому надо послать сначала
номер регистра, а затем код цвета  для этого регистра. Чтобы быть
уверенным,  что  порт ожидает номер регистра  надо  прочитать  из
него. Например, чтобы поместить  яркосиний  цвет (1001) в регистр
палетты 2:

;---помещаем код яркосинего цвета в регистр палетты 2
   MOV  DX,3DAH         ;адрес массива ворот дисплея
   IN   AL,DX           ;читаем из него
   MOV  AL,12H          ;номер регистра
   OUT  DX,AL           ;посылаем номер регистра
   MOV  AL,00001001B    ;код яркосинего цвета
   OUT  DX,AL           ;посылаем цвет

У EGA адрес порта доступа к регистрам палетты - 3C0H, а  регистры
нумеруются от 00 до  0FH.  Надо  прочитать  из  порта  3DAH (а не
3C0H), чтобы быть уверенным, что ожидается номер регистра.  Когда
к EGA  присоединен  улучшенный  цветной  дисплей  и переключатели
установлены  соответствующим  образом, то в  регистры  помещаются
6-битные значения.