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