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

ОГЛАВЛЕНИЕ


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


   Прерывания  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      ;пишем в следующую позицию