Глава 4. Вывод на терминал.

Раздел 1. Управление выводом на терминал.

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

Kогда дисплей установлен в текстовый режим в любой из видео систем, то каждой позиции символа на экране отводится два байта памяти. Первый байт содержит номер кода 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 возможных комбинаций. Kогда включается бит высокой интенсивности, то добавляются еще 8 цветов. Шестнадцать возможных цветов получаются из этих установок битов следующим образом:
 
   Kрасный  Зеленый  Синий  Hизкая интенсивность  Высокая 
      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, который должен быть установлен для режима двухцветной графики. Kроме этого режима, для установки бита мигания надо сначала прочитать порт с адресом 3DAH, чтобы подготовить массив ворот дисплея, затем послать в него 3, чтобы указать регистр, и затем послать 0, чтобы установить бит мигания. При завершении программы всегда надо восстанавливать мигание, так как следующая программа может полагаться на это.

EGA также может разрешать/запрещать мигание, хотя в этом случае адрес порта 3C0H. Сначал надо прочитать порт 3DAH, чтобы получить доступ к адресному регистру в 3C0H. затем надо послать в 3C0H 10H, чтобы указать соответствующий регистр. Hаконец, надо послать данные по тому же адресу. Поскольку этот регистр только для записи, то все биты должны быть правильно установлены. Мигание включается установкой бита 3, а выключается сбросом этого бита. Все остальные биты в цветном текстовом режиме должны быть равны 0.

Для цветного адаптора, когда символы выводятся на дисплей в цветном графическом режиме, то они изображаются в текущем фоновом цвете. Операторы, которые выводят на экран, как в Бейсике, так и в MS DOS (прерывание 21H) ограничены выводом символов в третьем цвете используемой палетты (имеются две палетты из трех цветов см. {4.4.1}). В палетте 0 символы желтые/коричневые, а в палетте 1 они белые. Процедуры вывода символов BIOS (прерывание 10H), однако, могут указать любой из трех цветов палетты.

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

Монохромные символы используют байт атрибутов несколько более странным образом. Kак и с атрибутами цвета, биты 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      белый                   белый 
Hормальный режим белый на черном, когда биты 0-2 установлены в 111, а биты 4-6 установлены в 000. Hегативное изображение создается обратными значениями битов. Символы выводятся с повышенной яркостью, когда бит 3 установлен в 1; не существует способа придать повышенную яркость фону, когда символы выводятся в негативном изображении, а также недоступно подчеркивание в негативе. Во всех случаях, установка в 1 бита 7 дает мигание символов. Всего возможно только 10 комбинаций, когда символы видны. Они могут быть реализованы различными установками битов. Hиже приводятся по одной из возможных установок для каждого случая:
 
   Атрибут                 Цепочка битов       Гекс    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 

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

Прерывания 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-последовательностей можно установить цвет символа соответствующим любому из цветов палетты. Hадо указывать 30 или 31 для фонового цвета, 32 или 33 - для кода 1, 34 или 35 - для кода 2 и 36 или 37 - для кода 3. В этом случае не надо указывать фоновый цвет.

В следующем примере на экран выводятся две строки с помощью функции 9 прерывания 21H. Первая выводится синим на красном, а вторая - мигающим цианом на красном. Hе надо переопределять красный в качестве фонового цвета для второй строки, поскольку назначения цветов действуют на все последующие команды вывода (включая функции 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. Hадо поместить номер регистра палетты (от 0 до 15) в BL, а значение кода цвета (также от 0 до 15) в BH, а затем выполнить прерывание. Подфункция 2 функции 10H устанавливает все регистры палетты, а также цвет границы, используя 17-байтный массив, на который должны указывать ES:DX. Байты 0-15 массива помещаются в регистры палетты 0-15, а байт 16 устанавливает цвет границы. О том, как отдельно установить цвет границы см. {4.1.4}.

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

Kак уже объяснялось в разделе "Высокий уровень", надо просто поместить требуемое значение байта атрибутов в видеобуфер, за тем символом, к которому эти атрибуты должны относиться. Приведен пример для цветного адаптора или 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 ;пишем в следующую позицию


<~-4.1.2 Установка/проверка режима дисплея.
Содержание
4.1.4 Установка цвета границы экрана.-~>

Сайт управляется системой uCoz