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

ОГЛАВЛЕНИЕ

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


   Операционная  система  предоставляет шесть процедур вывода  на
экран - три в BIOS и три в DOS.   Они  отличаются главным образом
тем, передвигается курсор или нет, после вывода символа, вызывают
ли они сдвиг экрана, позволяют  ли  они  устанавливать атрибуты и
цвета символов, а также какие управляющие коды они интерпретируют
(некоторые  рассматривают  символ  BackSpace,  просто как обычный
символ, а некоторые действительно сдвигают курсор на одну позицию
назад). Эти шесть процедур следующие:

   Прерывание 10H:

   функция   9     вывод символа с атрибутами
             A     вывод символа без атрибутов
             E     "телетайпная" процедура (как на принтер)

   Прерывание 21H:

   функция   2     вывод символа без атрибутов
             6     вывод символа без атрибутов
             9     вывод строки символов

   Функции 9 и A прерывания 10H  вообще  не интерпретируют управ-
ляющие  символы.   Функции DOS интерпретируют  управляющие  коды,
приведенные в следующей таблице. Функция E прерывания 10H интерп-
ретирует все коды таблицы, кроме ASCII 9.

   ASCII   7     звонок
   ASCII   8     возврат на шаг (BackSpace)
   ASCII   9     табуляция
   ASCII  10     перевод строки
   ASCII  13     возврат каретки

   Первые  две функции прерывания 10H не передвигают курсор после
вывода символа.  Функция  9  этого  прерывания выводит на экран с
указанием  атрибутов, а функция A - без указания, при этом сохра-
няется текущее значение  байта  атрибутов  для  этого символа. AL
должен содержать выводимый символ, а BL - атрибуты. Номер страни-
цы дисплея содержится в BH. Он должен указываться даже для монох-

ромного  дисплея, который имеет только одну страницу памяти дисп-
лея. В этом случае должна быть установлена первая страница, кото-
рой соответствует номер 0. Особое свойство этих двух функций BIOS
состоит в том, что символ выводится такое число раз, какое указа-
но в CX. Обычно указывают CX равным 1, но эти функции могут легко
выводить целые  строки  символов,  если  указать большее значение
счетчика  - полезное свойство при создании рамок.   Отметим,  что
даже если выводится много  символов,  то позиция курсора не изме-
няется.   Когда  строка выводимых символов займет  все  свободное
пространство экрана справа-вниз  от курсора, то вывод будет пере-
несен в первые позиции экрана.

;---вывод символа в негативе
   MOV  AH,9             ;функция записи с атрибутами
   MOV  AL,THE_CHARACTER    ;символ в AL
   MOV  BL,112           ;атрибуты в BL
   MOV  BH,0             ;страница 1
   MOV  CX,1             ;вывести один раз
   INT  10H

Вместо  того, чтобы постоянно восстанавливать значение счетчика в
CX прерывание  BIOS  предоставляет  также  телетайпную процедуру,
которая  больше подходит для вывода строки символов.  Она  выпол-
няется функцией E.  Она  готовится так же, как и функция A, но не
надо  засылать  значение в CX.  Строка выводится просто  за  счет
изменения символа в AL и  повторного  вызова  прерывания. При ис-
пользовании в графическом режиме в BL устанавливается цвет палет-
ты, в противном случае сохраняется старый атрибут.

;---вывод строки с помощью телетайпной процедуры
            MOV  AH,0EH     ;номер функции
            MOV  BH,0       ;номер страницы
            LEA  BX,STRING  ;BX указывает на строку
NEXT_CHAR:  MOV  AL,[BX]    ;берем символ в AL
            CMP  AL,'$'     ;проверка на конец строки
            JE   ALL_DONE   ;если да, то выход
            INT  10H        ;вывод строки
            INC  BX         ;переходим к следующему символу
            JMP  SHORT NEXT_CHAR   ;повторяем процедуру
ALL_DONE:

   Прерывание DOS 21H как  правило  предоставляет  более полезные
процедуры,  поскольку они перемещают курсор и  приводят к  сдвигу
экрана при достижении нижней строки, а также интерпретируют неко-
торые из обычных управляющих кодов.  Функции DOS выводят на стра-
ницу, которая должна быть  установлена  функцией 5 прерывания 10H
[4.5.3].  Предоставляются две функции для вывода символа, с номе-
рами 2 и 6. Первая из них распознает Ctrl-Break [3.2.8], а вторая
-  нет.   (Когда с клавиатуры вводится Ctrl-Break,  то  процедура
обработки Ctrl-Break не  выполняется  до тех пор, пока не исполь-
зуется функция, которая распознает его наличие).
   Обе функции выводят белые символы на черном фоне, до тех  пор,
пока не сделана  специальная  установка  цвета с помощью драйвера
устройства ANSI.SYS [4.1.3].  В общем необходимо только поместить
символ в DL, номер функции в AH и  вызвать прерывание 21H. Однако

функция 6 особенная в том смысле, что она имеет второе назначение
в качестве функции ввода с клавиатуры.  Она выступает в этой роли
только  если в DL помещен код FF [3.1.5].  Во всех остальных слу-
чаях она выводит на  экран  содержимое  DL.  В  следующем примере
функция  6 поочередно принимает и печатает символ (в [3.1.4]  об-
суждается процедура, которая комбинирует оба этих свойства).

       MOV  AH,6       ;номер функции
NEXT:  MOV  DL,0FFH    ;при этом значении принимаем ввод
       INT  21H        ;выполняем прерывание
       JZ   NEXT       ;если не было ввода, то обратно
       CMP  AL,13      ;это был возврат каретки?
       JE   END_INPUT  ;если да, то на конец
       MOV  DL,AL      ;иначе посылаем символ в DL
       INT  21H        ;и выводим его на экран
       JMP  SHORT NEXT ;повторяем процедуру