4.1.3 Установка атрибутов/цветов символов.

Error message

Notice: Undefined index: add term path in hansel_get_breadcrumbs() (line 524 of /data/sites/msdosworld.ru/www/sites/all/modules/hansel/hansel.module).

  Когда  дисплей  установлен в текстовый режим в любой из  видео
систем, то каждой позиции  символа  на экране отводится два байта
памяти.   Первый байт содержит номер кода ASCII кода  символа,  а
второй - атрибуты символа.  Цветной адаптор и PCjr могут выводить
в  цвете,  как сам символ, так и всю область, отведенную  данному
символу (фоновый  цвет).   Монохромный  адаптор  ограничен только
черным  и  белым цветом, но он  может  генерировать  подчеркнутые
символы, чего не могут делать  цветной  адаптор  и PCjr.  Все три
системы могут выдавать мигающие символы и негативное изображение.
Все три системы могут также создавать символы с высокой интенсив-
ностью,  хотя для цветного адаптора и PCjr  повышенная  интенсив-
ность символа на  самом  деле  приводит  к  другому цвету (восемь
основных  цветов  имеют версии с повышенной  интенсивностью,  что
дает набор 16 цветов).  EGA  умеет  делать все, что могут все ос-
тальные системы и многое другое. В частности, на улучшенном дисп-
лее он может  выводить  подчеркнутые  цветные  символы, поскольку
матрица изображения символов 8*14 дает такую возможность.

   Атрибуты цвета:
   Для  указания цветов экрана одни и те же номера кодов  исполь-
зуются в Бейсике и прерываниями операционной системы. Они такие:

          0 - черный                  8 - серый
          1 - синий                   9 - голубой
          2 - зеленый                10 - светлозеленый
          3 - циан                   11 - светлый циан
          4 - красный                12 - светлокрасный
          5 - магента                13 - светлая магента
          6 - коричневый             14 - желтый
          7 - белый                  15 - яркобелый

Младшие четыре бита  байта  атрибутов  устанавливают  цвет самого
символа  (бит 3 включает высокую интенсивность).   Следующие  три
бита устанавливают фон  символа.   И  при обычных обстоятельствах
старший бит включает и выключает мигание. Таким образом:

когда бит 0 = 1, синий включается в основной цвет
          1 = 1, зеленый включается в основной цвет
          2 = 1, красный включается в основной цвет
          3 = 1, символ выводится с высокой интенсивностью
          4 = 1, синий включается в фоновый цвет
          5 = 1, зеленый включается в фоновый цвет
          6 = 1, красный включается в фоновый цвет
          7 = 1, символы мигают

   Биты  0-2  и 4-6 содержат одни и те же компоненты  цветов  для
самих символов и фона.  Эти трехбитные группы позволяют 8 возмож-
ных  комбинаций.  Когда включается бит высокой интенсивности,  то
добавляются еще 8 цветов. Шестнадцать возможных цветов получаются
из этих установок битов следующим образом:


   Красный  Зеленый  Синий  Низкая интенсивность  Высокая

      0        0       0        черный            серый
      0        0       1        синий             светлосиний
      0        1       0        зеленый           светлозеленый
      0        1       1        циан              светлый циан
      1        0       0        красный           светлокрасный
      1        0       1        магента           светлая магента
      1        1       0        коричневый        желтый
      1        1       1        белый             яркобелый

Можно  иметь 16 цветов и для фонового цвета.  В этом случае бит 7
должен служить указателем  высокой  интенсивности  для фона, а не
указателем мигания символов.  Для цветного адаптора надо изменить
бит 5 порта с адресом 3D8H в 0, как показано ниже. Поскольку этот
порт  доступен  только для записи, то все остальные  биты  должны
быть  переустановлены.  Эта  возможность  доступна  только в двух
случаях:  текстовых режимов с 40 и с 80 символами в строке.   Для
режима с 80 символами надо послать в порт число 9, а для режима с
40  символами  - число 8.  Чтобы вернуть мигание надо добавить  к
обоим этим значениям 32. Для PCjr надо сбросить в 0 бит 1 регист-
ра 3 массива ворот дисплея.  Все остальные биты должны быть равны
нулю, кроме номера 3, который  должен  быть установлен для режима
двухцветной графики. Кроме этого режима, для установки бита мига-
ния надо сначала прочитать порт с адресом 3DAH, чтобы подготовить
массив  ворот дисплея, затем послать в него 3, чтобы указать  ре-
гистр, и затем послать 0, чтобы  установить  бит мигания. При за-
вершении  программы всегда надо восстанавливать мигание, так  как
следующая программа может полагаться на это.
   EGA также может  разрешать/запрещать мигание, хотя в этом слу-
чае  адрес  порта 3C0H.  Сначал надо прочитать порт  3DAH,  чтобы
получить доступ к адресному регистру в 3C0H. затем надо послать в
3C0H  10H, чтобы указать соответствующий регистр.  Наконец,  надо
послать данные по тому же адресу.   Поскольку этот регистр только
для записи, то все биты должны быть правильно установлены.  Мига-
ние включается установкой  бита  3,  а  выключается сбросом этого
бита.   Все остальные биты в цветном текстовом режиме должны быть
равны 0.
   Для цветного адаптора, когда  символы  выводятся  на дисплей в
цветном графическом режиме, то они изображаются в текущем фоновом
цвете.  Операторы, которые выводят на экран, как в Бейсике, так и
в  MS DOS (прерывание 21H) ограничены выводом символов в  третьем
цвете используемой палетты  (имеются две палетты из трех цветов -
см.  [4.4.1]). В палетте 0 символы желтые/коричневые, а в палетте
1 они белые.  Процедуры  вывода  символов  BIOS (прерывание 10H),
однако,  могут  указать любой из трех цветов палетты.   С  другой
стороны, для PCjr, цвет назначенный  определенной позиции палетты
может быть изменен, поэтому для вывода символов могут использова-
ны любые цвета.
   Для  PCjr  цвета соответствующие данным кодовым номерам  могут
быть изменены.  Каждый кодовый номер связан с регистром палетты в
массиве ворот дисплея [4.1.1].  Эти регистры пронумерованы от 10H
до 1FH, что соответствует кодам  от  0 до 15. Каждый 4-битный ре-


гистр  содержит  число  в диапазоне  0-15,  которое  представляет
реальный цвет, выводимый когда  оператор программы встречает один
из  кодовых номеров.  Например, если в каком-то  месте  программы
указано, что символ  должен  выводиться  с  кодовым номером 0, то
цвет  выводимого символа определяется кодом цвета,  хранящемся  в
регистре палетты 0. Начальное  значение этого регистра 0000, поэ-
тому будет выводиться черный цвет.  Но содержимое этого  регистра
может быть изменено,  скажем,  на  0001,  а в этом случае кодовый
номер  0 приведен к выводу синим цветом.  Кодовые номера, исполь-
зуемые в регистрах палетты такие же,  как и в операторах програм-
мы.  На рис.  4-1 показана начальная установка регистров  палетты
для всех регистров,  кроме  регистра  для зеленого цвета, который
изменен так, чтобы выводился цвет магента.
   Чтобы  запрограммировать  регистр палетты PCjr  нужно  сначала
послать его номер (от 10H до  1FH)  в массив ворот дисплея, адрес
порта которого 3DAH.  Затем нужно послать данные по тому же адре-
су. Чтобы быть уверенным, что  массив готов принять номер регист-
ра,  а не данные, надо сначала прочитать из порта 3DAH,  отбросив
прочитанное.
   EGA также использует 16 регистров  палетты.  Они расположены в
порте  с  номером 3C0H, а номера их меняются от 00 до 0FH.   Надо
сначала прочитать из порта  3DAH,  чтобы  переключить порт на его
адресный регистр, затем послать номер регистра палетты в 3C0H,  а
затем послать данные. Когда  переключатели  на EGA установлены на
улучшенный  режим (для улучшенного цветного дисплея IBM), то  па-
летта может быть выбрана из 64  цветов.  В  этом случае установка
регистра  палетты имеет длину 6 битов в формате  R'G'B'RGB.  Биты
RGB дают темные цветы, а биты R'G'B'  - цвета повышенной яркости.
Когда  установлены  и R' и R, например, то это  приводит к  очень
яркому красному цвету.  Биты могут смешиваться давая новые оттен-
ки. Если регистры палетты, предназначенные для 64 цветов, исполь-
зуются не в улучшенном режиме, то 4-й и 5-й биты регистра игнори-
руются  и  содержимое регистров рассматривается по обычной  схеме
RGB.  Поскольку PCjr и EGA  используют регистры палетты, то выбор
фонового цвета не ограничен использованием бита 7 байта атрибутов
в качестве бита мигания.

Монохромные символы:

   Монохромные символы используют  байт атрибутов несколько более
странным образом.  Как и с атрибутами цвета, биты 0-2  устанавли-
вают основной цвет, а биты 4-6  -  фоновый.  Эти цвета могут быть
только белым и черным, со следующим соответствием битам:

   Бит      Бит     Бит     Основной атрибут        Фоновый
 6 или 2  5 или 1 4 или 0

    0        0       0      черный                  черный
    0        0       1      подчеркнутый белый      белый
    0        1       0      белый                   белый
    0        1       1      белый                   белый
    1        0       0      белый                   белый
    1        0       1      белый                   белый
    1        1       0      белый                   белый
    1        1       1      белый                   белый


Нормальный  режим  белый на черном, когда биты 0-2 установлены  в
111, а биты 4-6 установлены в  000.  Негативное  изображение соз-
дается обратными значениями битов. Символы выводятся с повышенной
яркостью, когда бит 3 установлен в  1; не существует способа при-
дать повышенную яркость фону, когда символы выводятся в  негатив-
ном изображении, а также недоступно подчеркивание в негативе.  Во
всех случаях, установка в 1 бита  7 дает мигание символов.  Всего
возможно  только  10 комбинаций, когда символы видны.  Они  могут
быть реализованы различными установками битов. Ниже приводятся по
одной из возможных установок для каждого случая:

   Атрибут                 Цепочка битов       Гекс    10-ное

   нормальный                00000111            7         7
   интенсивный               00001111            F        15
   нормальный подчеркнутый   00000001            1         1
   интенсивный подчеркнутый  00001001            9         9
   негативный                01110000           70       112
   нормальный мигающий       10000111           87       135
   интенсивный мигающий      10001111           8F       143
   нормальный мигающий подч. 10000001           81       129
   яркий мигающий подчерк.   10001001           89       137
   яркий негативный          11110000           F0       240

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

   Бейсик  устанавливает  цвета  и атрибуты  символов  оператором
COLOR.  Все операторы PRINT  и  WRITE,  которые следуют за данным
оператором  COLOR,  выполняются с атрибутами,  указанными в  этом
операторе. Цвет фона меняется только для выодимых символов, но не
для всего экрана.  Новый оператор COLOR не влияет на то, что было
выведено ранее.
   Кроме случая монохромного  адаптора,  COLOR  3,4 устанавливает
основной цвет символа циан (#3), а фоновый - красный (#4). Диапа-
зон кодов основных цветов 0-31,  причем  числа 0-15 соответствуют
цветам,  перечисленным  в вышеприведенной таблице, а числа  16-31
получаются прибавлением к любому из этих кодов числа 16, что дает
тот же самый цвет, но с миганием символов.  (При мигании основной
цвет периодически меняется  на  фоновый,  в  то время как фоновый
цвет остается неизменным.)
   Операторы PRINT и WRITE могут также выводить символы на графи-
ческий экран.  При этом  цвет  символов  - это всегда третий цвет
текущей палетты, т.е.  желтый/коричневый для палетты 0 и белый  -
для палетты 1.
   Отметим, что когда Вы  начинаете  работать в цветном текстовом
режиме,  то весь экран черно-белый.  Чтобы закрасить весь экран в
фоновый цвет, необходимо  указать  оператором COLOR ,2, например,
зеленый цвет и затем очистить экран командой CLS. Когда Вы чисти-
те экран по ходу выполнения  программы, то необходимо, чтобы пос-
ледний  оператор  COLOR  установил фоновый цвет таким,  каким  Вы
хотите закрасить весь экран.
   Для монохромного дисплея атрибуты  устанавливаются аналогичным
образом.   0  соответствует черному цвету, а любое из  чисел  1-7
соответствует белому. Таким  образом COLOR 0,7 устанавливает чер-
ное изображение на белом фоне (негатив), в то время как COLOR 7,0


дает вывод белых символов  на  черном  фоне  (обычная установка).
Имеется одно исключение: если в качестве основного цвета  исполь-
зовать код 1, то будут выводиться подчеркнутые символы.  Прибавив
8  к любому из кодов основного цвета, получим яркое  изображение.
Прибавив 16 к любому из  кодов  0-15,  получим  мигающие символы.
Таким  образом  7+8+16=31 дает яркое мигающее белое  изображение.
Для фонового цвета допустимы только значения от 0 до 7.
   Если Вы используете прямое  отображение  в  память [4.3.1], то
оператор COLOR не влияет на вывод. Вместо этого Вы должны выбрать
требуемую установку атрибутов из таблиц  и прямо присвоить значе-
ние  соответствующего байта атрибутов оператором POKE.   Помните,
что байты атрибутов всегда занимают нечетные позиции в видеобуфе-
ре.  Отображение в память позволяет Вам иметь 16 фоновых цветов в
Бейсике (при условии, что  Вам  не  нужны  мигающие символы). Для
графического  адаптора  введите  OUT &H3D8,8, чтобы  старший  бит
каждого атрибута действовал как бит яркости для фоновых цветов. В
следующем  примере в центре экрана печатается яркокрасный "!"  на
светлокрасном фоне.

100 DEF SEG = &HB800   'указываем на буфер цветного дисплея
110 OUT &H3D8,8        'используем 16 фоновых цветов
120 POKE 1000,33       'печатаем ! в центре экрана
130 POKE 1001,196      'красный на светлокрасном (11000100)

Как уже говорилось выше PCjr  хранит  бит мигания в массиве ворот
дисплея. Вот та же программа для PCjr (но она не будет работать в
режиме двухцветной графики):

100 DEF SEG = &HB800   'указываем на видеобуфер
110 X = INP(&H3AH)     'читаем из массива ворот дисплея
120 OUT &H3AH,3        'требуем доступ к регистру 3
130 OUT &H3AH,0        'сбрасываем все биты этого регистра
140 POKE 1000,33       'печатаем ! в центре экрана
150 POKE 1001,196      'красный на светлокрасном (11000100)

Приведем еще пример изменения  назначения цвета регистра палетты.
Код  цвета, который обычно выводится синим (0001) сделаем,  чтобы
он выводил цвет  магента  (0101).   Номер  регистра массива ворот
дисплея, соответствующий коду цвета 1 равен 11H.

100 X = INP (&H3AH)    'читаем из массива ворот дисплея
110 OUT &H3AH,&H11     'требуем доступ к регистру 11H
120 OUT &H3AH,5        'помещаем туда код магенты (0101 = 5)

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

   Прерывания  DOS и BIOS предоставляют очень бедные  возможности
для работы с цветным  текстом.  Только  функция  9 прерывания 10H
принимает байт атрибутов при выводе символа. Функция A прерывания
10H выводит символ без указания  цвета  или  атрибута; она просто
помещает  символ  в видеобуфер, не трогая  байт  атрибута,  таким
образом атрибуты сохраняют свое старое значение. Функция D преры-
вания  10H  также оставляет нетронутым байт атрибутов.   Все  эти
функции обсуждаются в [4.3.1].


   Функции вывода на экран  DOS  прерывания  21H  всегда  выводят
белое на черном.  Даже если для всего экрана установлен некоторый
фоновый цвет, то функции DOS  устанавливают  атрибут в нормальный
черный при выводе каждого символа.  Однако имеется способ преодо-
леть это ограничение. MS  DOS  предоставляет  драйвер  устройства
ANSI.SYS, который может интерпретировать специальные Esc-последо-
вательности. В приложении Д объясняются основы его использования.
Esc-последовательности выводятся через функцию 9 прерывания  21H,
которые обычно выводят строку  символов  на экран.  В этом случае
строка состоит из символа Esc, за которым следует [, а далее одно
или более кодовых чисел из нижеприведенного списка. Строка должна
кончаться символом m и обычным ограничителем $. Вот кодовые номе-
ра:

   0   все атрибуты выключены (черный на белом)
   1   включена повышенная интенсивность
   4   включено подчеркивание
   5   включено мигание
   7   включено негативное изображение
   8   все включено (при этом символы невидимы)

   30 черный основной цвет         40 черный фон
   31 красный основной цвет        41 красный фон
   32 зеленый основной цвет        42 зеленый фон
   33 желтый основной цвет         43 желтый фон
   34 синий основной цвет          44 синий фон
   35 основной цвет магента        45 фон магента
   36 основной цвет циан           46 фон циан
   37 белый основной цвет          40 белый фон

Отметим, что когда функции MS  DOS  выводят символы в графическом
режиме, то они обычно используют код 3 текущей палетты. С помощью
Esc-последовательностей можно установить  цвет символа соответст-
вующим  любому  из цветов палетты.  Надо указывать 30 или 31  для
фонового цвета, 32 или 33 - для кода  1, 34 или 35 - для кода 2 и
36  или 37 - для кода 3.  В этом случае не надо указывать фоновый
цвет.
   В следующем примере на экран  выводятся  две  строки с помощью
функции  9 прерывания 21H.  Первая выводится синим на красном,  а
вторая - мигающим цианом на красном. Не надо переопределять крас-
ный в качестве фонового цвета для второй строки, поскольку назна-
чения цветов действуют на все последующие команды вывода (включая
функции  BIOS прерывания 10H), до тех пор, пока не будут  сделаны
другие назначения. Отметим, как  просто  перемешивать команды уп-
равления цветом с выводом самих строк.

;---в сегменте данных
STRING_1     DB   'The rain in Spain',0AH,0DH,'$'
STRING_2     DB   'Falls mainly on the plain$'
BLUE_RED     DB   27,'[34;41m$'
BLINK_CYAN   DB   27,'[5;36m$'


;---вывод строк
   MOV  AH,9          ;функция вывода строки
   LEA  DX,BLUE_RED   ;адрес управляющей строки в DX
   INT  21H           ;все будет выдаваться синим на красном
   LEA  DX,STRING_1   ;указываем на первую строку
   INT  21H           ;печатаем строку
   LEA  DX,BLINK_CYAN ;адрес второй управляющей строки
   INT  21H           ;меняем цвет на мигающий циан
   LEA  DX,STRING_2   ;указываем на вторую строку
   INT  21H           ;печатаем строку

Вы  всегда  должны позаботиться о том,  чтобы  сбросить  атрибуты
цвета в нормальное  состояние  перед  завершением программы, пос-
кольку в противном случае они будут действовать и на вывод после-
дующих программ. В конце следует  вывести Esc-последовательность,
использующую код номер 0, как указано выше.
   PCjr и EGA имеют специальную функцию BIOS для установки содер-
жимого регистров палетты. Это подфункция 0 функции 10H прерывания
10H.  Надо поместить номер регистра палетты (от 0 до 15) в BL,  а
значение кода цвета (также от  0  до  15) в BH, а затем выполнить
прерывание.  Подфункция 2 функции 10H устанавливает все  регистры
палетты, а также цвет  границы,  используя  17-байтный массив, на
который должны указывать ES:DX.  Байты 0-15 массива помещаются  в
регистры палетты 0-15, а байт  16  устанавливает цвет границы.  О
том, как отдельно установить цвет границы см. [4.1.4].

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

   Как  уже объяснялось в разделе "Высокий уровень", надо  просто
поместить требуемое значение байта атрибутов в видеобуфер, за тем
символом,  к которому эти атрибуты должны  относиться.   Приведен
пример для цветного адаптора или PCjr.  В примере устанавливается
текстовый  экран 80*25 с 16 фоновыми цветами, а затем экран  ини-
циализируется в красный цвет светлосинем фоне:

;---установка 16 фоновых цветов в текстовом режиме 80*25
        MOV  AL,00001001B   ;установка в 0 бита мигания
        MOV  DX,3D8H        ;адрес регистра
        OUT  DX,AL          ;посылаем в регистр
;---инициализируем весь экран в красный на светлосинем фоне
        MOV  AX,0B800H      ;указываем на видеобуфер
        MOV  ES,AX          ;
        MOV  CX,2000        ;записываем атрибут в 2000 ячеек
        MOV  BX,1           ;BX указывает на байт атрибутов
        MOV  AL,10010100B   ;значение байта атрибутов
NEXT_CHAR:   MOV  ES:[BX],AL   ;посылаем атрибуты в буфер
        INC  BX             ;увеличиваем указатель на атрибуты
        INC  BX             ;
        LOOP NEXT_CHAR      ;пишем в следующую позицию


 

Вы находитесь в разделе: 

Добавить коментарий