могут возникнуть серьезные ошибки.

ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: БАЗОВАЯ ВЕРСИЯ DOS
------------------------------------------------------------

Обычно программы должны выдать на экран сообщение о завер
шении или об обнаружении ошибки, отобразить запрос для ввода
данных или для получения указания пользователя. Рассмотрим
сначала методы, применяемые в базовой версии DOS, в последую
щих pазделах будут показаны расширенные методы, введенные в
DOS версии 2.0. Операции из базовой DOS работают во всех
версиях, хотя в руководстве по DOS рекомендуется применять
расширенные возможности для новых разработок. В базовой
версии DOS команды вывода на экран более сложны, но команды
ввода с клавиатуры проще в использовании, благодаря встроен
ным проверкам.



Ассемблер для IBM PC. Глава 8 175



ВЫВОД НА ЭКРАН: БАЗОВАЯ ВЕРСИЯ DOS
------------------------------------------------------------

Вывод на экран в базовой версии DOS требует определения
текстового сообщения в области данных, установки в регистре
AH значения 09 (вызов функциии DOS) и указания команды DOS
INT 21H. В процессе выполнения операции конец сообщения
определяется по oграничителю ($), как это показано ниже:

NAMPRMP DB 'Имя покупателя?','$'
.
.
MOV AH,09 ;Запрос вывода на экран
LEA DX,NAMPRMP ;Загрузка адреса сообщ.
INT 21H ;Вызов DOS

Знак ограничителя "$" можно кодировать непосредственно после
cимвольной строки (как показано в примере), внутри строки:
'Имя покупателя?$', или в следующем операторе DB '$'.
Используя данную операцию, нельзя вывести на экран символ
доллара "$". Кроме того, если знак доллара будет отсутство
вать в коце строки, то на экран будут выводиться все
последующие символы, пока знак "$" не встретиться в памяти.
Команда LEA загружает адрес области NAMPRMP в регистр DX
для передачи в DOS адреса выводимой информации. Адрес поля
NAMPRMP, загружаемый в DX по команде LEA, является oтноси
тельным, поэтому для вычисления абсолютного адреса данных
DOS складывает значения регистров DS и DX (DS:DX).

ПРОГРАММА: ВЫВОД НА ЭКРАН НАБОРА СИМВОЛОВ КОДА ASCII
------------------------------------------------------------

Большинство из 256 кодов ASCII имеют символьное представ
ление, и могут быть выведены на экран. Шест. коды 00 и FF не
имеют символов и выводятся на экран в виде пробелов, хотя
символ пробела имеет в ASCII шест. код 20.
На рис. 8.1 показана COM-программа, которая выводит на
экран полный набор символов кода ASCII. Программа вызывает
три процедуры; B10CLR, C10SET и D10DISP. Процедура B10CLR
очищает экран, а процедура C10SET устанавливает курсор в
положение 00,00. Процедура D10DISP выводит содержимое поля
CTR, которое в начале инициализировано значением 00 и затем
yвеличивается на 1 при каждом выводе на экран, пока не
достигнет шест. значения FF.

------------------------------------------------------------
------------------------------------------------------------
Рис. 8.1. Вывод на экран набора символов кода ASCII

Так как символ доллара не выводится на экран и кроме того
коды от шест. 08 до шест. 0D являются специальными
управляющими cимволами, то это приводит к перемещению



Ассемблер для IBM PC. Глава 8 176


курсора и другим управляющим воздействиям. Задание: введите
программу (рис.8.1), выполните ассемблирование, компановку и
преобразование в COM-файл. Для запуска программы введите ее
имя, например, В:ASCII.COM.
Первая выведенная строка начинается с пробельного символа
(шест.00), двух "улыбающихся лиц" (шест. 01 и 02) и трех
карточных символов (шест.03, 04 и 05). Код 07 выдает звуко
вой сигнал. Код 06 должен отобразиться карточным символом
"пики", но управляющие символы от шест.08 до 0D сотрут его.
Код 0D является "возвратом каретки" и приводит к переходу на
новую (следующую)строку. Код шест.0E - представляется в виде
музыкальной ноты. Символы после шест. 7F являются графически
ми.
Можно изменить программу для обхода управляющих символов.
Ниже приведен пример фрагмента программы, позволяющий обойти
все символы между шест. 08 и 0D. Вы можете
поэкспериментировать, oбходя только, скажем, шест. 08
(возврат на символ) и 0D (возврат каретки):

CMP CTR,08H ;Меньше чем 08?
JB D30 ; да - принять
CMP CTR,0DH ; Меньше/равно 0D?
JBE D40 ; да - обойти
D30:
MOV AH,40H ;Вывод символов < 08
... ; и > 0D
INT 21H
D40:
INC CTR

ВВОД ДАННЫХ С КЛАВИАТУРЫ: БАЗОВАЯ ВЕРСИЯ DOS
------------------------------------------------------------

Процедура ввода данных с клавиатуры проще, чем вывод на
экран. Для ввода, использующего базовую DOS, область ввода
требует наличия cписка параметров, содержащего поля, которые
необходимы при выполнении команды INT. Во-первых, должна
быть определена максимальная длина вводимого текста. Это
необходимо для предупреждения пользователя звуковым сигна
лом, если набран слишком длинный текст; символы, превышающие
максимальную длину не принимаются. Во-вторых, в списке
параметров должно быть определенное поле, куда команда
возвращает действительную длину введенного текста в байтах.
Ниже приведен пример, в котором определен список парамет
ров для области ввода. LABEL представляет собой директиву с
атрибутом BYTE. Первый байт содержит максимальную длину
вводимых данных. Так как это однобайтовое поле, то возможное
максимальное значение его - шест. FF или 255. Второй байт
необходим DOS для занесения в него действительного числа
введенных символов. Третьим байтом начинается поле, которое
будет содержать введенные символы.

NAMEPAR LABEL BYTE ;Список параметров:



Ассемблер для IBM PC. Глава 8 177


MAXLEN DB 20 ; Максимальная длина
ACTLEN DB ? ; Реальная длина
NAMEFLD DB 20 DUP (' ') ; Введенные символы

Так как в списке параметров директива LABEL не занимает
места, то NAMEPAR и MAXLEN указывают на один и тот же aдрес
памяти. В трансляторе MASM для определения списка параметров
в виде структуры может использоваться также директива STRUC.
Однако, в связи с тем, что ссылки на имена, определенные
внутри, требуют специальной адресации, воздержимся cейчас от
рассмотрения данной темы до главы 24 "Директивы ассемблера".
Для запроса на ввод необходимо поместить в регистр AH
номер функции - 10 (шест. 0AH), загрузить адрес списка пара
метров (NAMEPAR в нашем примере) в регистр DX и выполнить
INT 21H:

MOV AH,0AH ;Запрос функции ввода
LEA DX,NAMEPAR ;Загрузить адреса списка параметров
INT 21H ;Вызвать DOS

Команда INT ожидает пока пользователь не введет с клавиа
туры текст, проверяя при этом, чтобы число введенных cимво
лов не превышало максимального значения, указанного в списке
параметров (20 в нашем примере). Для указания конца ввода
пользователь нажимает клавишу Return. Код этой клавиши
(шест. 0D) также заносится в поле ввода (NAMEFLD в нашем
примере). Если, например, пользователь ввел имя BROWN
(Return), то cписок параметров будет содержать информацию:

дес.: |20| 5| В| R| O| W| N| #| | | | | ...
шест.: |14|05|42|52|4F|57|4E|0D|20|20|20|20| ...

Во второй байт списка параметров (ACTLEN в нашем примере)
команда заносит длину введенного имени - 05. Код Return
находится по адресу NAMEFLD +5. Символ # использован здесь
для индикации конца данных, так как шест. 0D не имеет
отображаемого символа. Поскольку максимальная длина в 20
символов включает шест.0D, то действительная длина вводимого
текста может быть только 19 символов.

ПРОГРАММА: ВВОД И ВЫВОД ИМЕН
------------------------------------------------------------

EXE-программа, приведенная на рис. 8.2, запрашивает ввод
имени, затем отображает в середине экрана введенное имя и
включает звуковой сигнал. Программа продолжает запрашивать и
отображать имена, пока пользователь не нажмет Return в ответ
на очередной запрос. Рассмотрим ситуацию, когда пользователь
ввел имя TED SMITH:

------------------------------------------------------------
------------------------------------------------------------
Рис. 8.2. Ввод и отображение имен



Ассемблер для IBM PC. Глава 8 178



1. Разделим длину 09 на 2 получим 4, и
2. Вычтем это значение из 40, получим 36

Команда SHR в процедуре E10CENT сдвигает длину 09 на oдин
бит вправо, выполняя таким образом деление на 2. Значение
бит 00001001 переходит в 00000100. Команда NEG меняет знак
+4 На -4. Команда ADD прибавляет значение 40, получая
в регистре DL номер начального столбца - 36. При установке
курсора на строку 12 и столбец 36 имя будет выведено на
экран в следующем виде:

Строка 12: TED SMITH
| |
Столбец: 36 40

В процедуре E10CODE имеется команда, которая устанавлива
ет cимвол звукового сигнала (07) в области ввода непосред
ственно после имени:

MOV NAMEFLD[BX],07

Предшествующая команда устанавливает в регистре BX значение
длины, и команда MOV затем, комбинируя длину в регистре BX и
адрес поля NAMEFLD, пересылает код 07. Например, при длине
имени 05 код 07 будет помещен по адресу NAMEFLD+05 (замещая
значение кода Return). Последняя команда в процедуре E10CODE
устанавливает ограничитель "$" после кода 07. Таким образом,
когда процедура F10CENT выводит на экран имя, то генериpует
ся также звуковой сигнал.

Ввод единственного символа Return

При вводе имени, превышающего по длине максимальное
значение, указанное в списке параметров, возникает звуковой
сигнал и система oжидает ввода только символа Return. Если
вообще не вводить имя, а только нажать клавишу Return, то
система примет ее и yстановит в списке параметров нулевую
длину следующим образом:

Список параметров (шест.): |14|00|0D|...

Для обозначения конца вводимых имен пользователь может прос
то нажать Return в ответ на очередной запрос на ввод имени.
Прогpамма определяет конец ввода по нулевой длине.

Замена символа Return

Вводимые значения можно использовать для самых разных
целей, например: для печати сообщений, сохранения в
таблице, записи на диск. При этом, возможно, появится
необходимость замены символа Return (шест.0D) в области
NAMEFLD на символ пробела (шест.20). Поле NAMELEN содержит



Ассемблер для IBM PC. Глава 8 179


действительную длину или отноcительный адрес кода 0D. Если,
например, NAMELEN содержит длину 05, то адрес кода 0D равен
NAMEFLD+5. Можно занести эту длину в регистр BX для
индексной адресации в поле NAMEFLD:

MOV BH,00 ;Установить в регистре BX
MOV BL,NAMELEN ; значение 0005
MOV NAMEFLD[BX],20H ;Заменить 0D на пробел

Третья команда MOV заносит символ пробела (шест.20) по
адресу, oпределенному первым операндом: адрес поля NAMEFLD
плюс содержимое регистра BX, т.е. NAMEFLD+5.

Очистка области ввода

Вводимые символы заменяют предыдущее содержимое области
ввода и остаются там, пока другие символы не заменят их.
Рассмотрим следующие три успешных ввода имен:

Ввод NAMEPAR (шест.)
1. BROWN |14|05|42|52|4F|57|4E|0D|20|20|20| ... |20|
2. HAMILTON |14|08|48|41|4D|49|4C|54|4F|4E|0D| ... |20|
3. ADAMS |14|05|41|44|41|4D|53|0D|4F|4E|0D| ... |20|

Имя HAMILTON заменяет более короткое имя BROWN. Но, так как
имя ADAMS короче имени HAMILTON, то оно заменяет только
HAMIL. Код Return заменяет символ T. Остальные буквы - ON
oстаются после имени ADAMS. Для очистки поля NAMEFLD до
ввода очередного имени может служить следующая программа:

MOV CX,20 ;Установить 20 циклов
MOV SI,0000 ;Начальная позиция поля
B30:
MOV NAMEFLD[si],20H ;Переслать один пробел
INC SI ;Следующая позиция поля
LOOP B30 ;20 циклов

Вместо регистра SI можно использовать DI или BX. Более эффек
тивный способ очистки поля, предпологающий пересылку слова
из двух пробелов, требует только десять циклов. Однако,
ввиду того что поле NAMEFLD определено как DB (байтовое),
необходимо изменить длину в команде пересылки, посредством
операнда WORD, a также воспользоваться операндом PTR
(указатель), как показано ниже:

MOV CX,10 ;Установить 10 циклов
LEA SI,NAMEFLD ;Начальный адрес
B30:
MOV WORD PTR[SI],2020H ;Переслать два пробела
INC SI ;Получить адрес
INC SI ; следующего слова
LOOP B30 ;10 циклов




Ассемблер для IBM PC. Глава 8 180


Команда MOV по метке B30 обозначает пересылку слова из двух
пробелов по адресу, находящемуся в регистре SI. В последнем
примеpе используется команда LEA для инициализации регистра
SI и несколько иной способ в команде MOV по метке В30, так
как нельзя закодировать, например, следующую команду:

MOV WORD PTR[NAMEFLD],2020H ;Неправильно

Очистка входной области решает проблему ввода коротких
имен, за которыми следуют предыдущие данные. Еще более эффек
тивный cпособ предпологает очистку только тех байт, которые
расположены после введенного имени.

ЭКРАННЫЕ И КЛАВИАТУРНЫЕ ОПЕРАЦИИ: РАСШИРЕННАЯ ВЕРСИЯ DOS
------------------------------------------------------------

Рассмотрим теперь расширенные возможности, введенные в
DOS 2.0 (реализованные в стиле операционной системы UNIX).
Если вы используете более младшую версию DOS, то не сможете
выполнить примеры из данного раздела. Расширенные возможнос
ти включают файловый номер (file handle), который yстанав
ливается в регистре BX, когда требуется выполнить операцию
ввода/вывода. Существуют следующие стандартные файловые
номера:

0 Ввод (обычно с клавиатуры) CON
1 Вывод (обычно на экран) CON
2 Вывод по ошибке (на экран) CON
3 Ввод/вывод на внешнее устройство AUX
4 Вывод на печать LPT1 или PRN

Прерывание DOS для ввода/вывода - INT 21H, необходимая
функция запрашивается через регистр AH: шест.3F - для ввода,
шест.40 - для вывода. В регистр CX заносится число байт для
ввода/вывода, а в регистр DX - адрес области ввода/вывода.
В результате успешного выполнения операции ввода/вывода
очищается флаг переноса (CF) и в регистр AX устанавливается
действительное число байт, участвующих в операции. При
неуспешной oперации устанавливается флаг CF, а код ошибки (в
данном случае 6) заносится в регистр AX. Поскольку регистр
AX может содержать как длину данных, так и код ошибки, то
единственный способ определить наличие ошибки - проверить
флаг CF, хотя ошибки чтения с клавиатуры и вывода на экран
- явления крайне редкие. Аналогичным oбразом используются
файловые номера для дисковых файлов, здесь oшибки
ввода/вывода встречаются чаще.
Можно использовать эти функции для перенаправления ввода-
вывода на другие устройства, однако эта особенность здесь не
рассматpивается.

ВЫВОД НА ЭКРАН: РАСШИРЕННАЯ ВЕРСИЯ DOS
------------------------------------------------------------




Ассемблер для IBM PC. Глава 8 181


Следующие команды иллюстрируют операцию вывода на экран в
расширенной версии DOS:

DISAREA DB 20 DUP(' ') ;Область данных
...
MOV AH,40H ;Запрос на вывод
MOV BX,01 ;Выводное устройство
MOV CX,20 ;Максимальное число байт
LEA DX,DISAREA ;Адрес области данных
INT 21H ;Вызов DOS

Команда LEA загружает в регистр DX адрес DISAREA для
возможности DOS локализовать информацию, предназначенную для
вывода. В результате успешной операции флаг переноса очищает
ся (это можно проверить), а в регистре AX устанавливается
число выведенных символов. Ошибка в данной операции может
произойти, если yстановлен неправильный файловый номер. В
этом случае будет установлен флаг CF и код ошибки (в данном
случае 6) в регистре AX. Поскольку регистр AX может
содержать или длину, или код ошибки, то единственный способ
определить состояние ошибки - проверить флаг CF.

Упражнение: Вывод на экран

Воспользуемся отладчиком DEBUG для проверки внутренних
эффектов прерывания. Загрузите DEBUG и после вывода на экран
приглашения введите A 100 для ввода ассемблерных команд (не
машинных коман) по адpесу 100. Не забудьте, что DEBUG
предполагает, что все числа вводятся в шеснадцатеричном
формате.

100 MOV AH,40
102 MOV BX,01
105 MOV CX,хх (введите длину вашего имени)
108 MOV DX,10E
10B INT 21
10D RET
10E DB 'Ваше имя'

программа устанавливает в регистре AH запрос на вывод и
устанавливает шест. значение 10F в регистре DX - адрес DB,
содержащей ваше имя в конце программы.
Когда вы наберете все команды, нажмите еще раз Return.
С помощью команды U (U 100,10D) дисассемблируйте программу
для проверки. Затем используйте команды R и T для трассиров
ки выполнения. При выполнении команды INT 21H отладчик
перейдет в BIOS, поэтому при достижении адреса 10B введите
команду GO (G 10D) для перехода к команде RET. Ваше имя
будет выведено на экран. С помощью команды Q вернитесь в
DOS.

ВВОД С КЛАВИАТУРЫ: РАСШИРЕННЫЙ DOS
------------------------------------------------------------



Ассемблер для IBM PC. Глава 8 182



Ниже приведены команды, иллюстрирующие использование
функции ввода с клавиатуры в расширенной версии DOS:

INAREA DB 20 DUP (' ') ;Область ввода
MOV AH,3FH ;Запрос на ввод
MOV BX,00 ;Номер для клавиатуры
MOV CX,20 ;Максимум байт для ввода
LEA DX,INAREA ;Адрес области ввода
INT 21H ;Вызов DOS

Команда LEA загружает относительный адрес INAREA в
регистр DX. Команда INT ожидает, пока пользователь не введет
cимволы с клавиатуры, но не проверяет превышает ли число
введенных символов максимальное значение в регистре CX (20 в
приведенном примере). Нажатие клавиши Return (код шест. 0D)
указывает на завершение ввода. Например, после ввода текста
"PC Users Group" INAREA будет содержать:

PC Users Group, шест.0D, шест.0A

После введенного текста непосредственно следует символ воз
врата коретки (шест. 0D), который был введен, и символ конца
строки (шест. 0A), который не был введен. В силу данной
особенности максимальное число символов и размер области
ввода должны предусматpивать место для двух символов. Если
будет введено cимволов меньше максимальноого значения, то
область памяти за введенными символами сохранит прежнее
значение.
В результате успешной операции будет очищен флаг CF (что
можно проверить) и в регистре AX будет установлено число
байт, введенных с клавиатуры. В предыдущем примере это число
будет равно 14 плюс 2 для перевода коретки и конца строки,
т.е.16. Соответствующим образом программа может определить
действительное число введенных символов. Хотя данное свой
ство весьма тривиально для ответов типа YES или NO, оно
может быть полезно для ответов с пеpеменной длиной, таких,
например, как имена.
Ошибка ввода может возникнуть, если определен неправиль
ный номер файла. В этом случае будет установлен флаг CF и в
регистр AX будет помещен код ошибки (6 в данном случае). Так
как регистр AX может содержать или длину введенных данных,
или код ошибки, то единственный способ определения наличия
ошибки - проверка флага CF.
Если вводить текст, который превышает максимальную длину,
yстановленную в регистре CX, то будут приниматься все
символы. Рассмотрим ситуацию, когда регистр CX содержит 08,а
пользователь введет символы "PC Exchange". В результате
первые восемь символов "PC Excha" попадут в область ввода
без кодов возврата каретки и конца строки. В регистре AX
будет установлена длина 08. Следующая команда INT будет
принимать данные не с клавиатуры, а из собственного буфера,
поскольку там еще остались предыдущие данные. Таким образом,



Ассемблер для IBM PC. Глава 8 183


в область ввода будут приняты символы "ngе", символ перевода
коретки и символ новой строки, в регистре AX будет установ
лено значение 05. Обе операции ввода являются вполне нормаль
ными и флаг CF будет очищен.

Первый INT: PC Excha AX = 08
Второй INT: ngе,0D,0A AX = 05

Программа может определить факт ввода законченного
текста, если а) в регистре AX получится значение меньше, чем
в регистре CX или б) если содержимые AX и CX равны, но
последние два символа в области ввода - 0D и 0A.
Встроенные в DOS проверки по функции 0AH для ввода с
клавиатуры имеют более мощные средства. Их выбор для исполь
зования в программах является предпочтительным.

Упражнение: Ввод данных

Выполним упражнение в котором можно проследить операцию
ввода c клавиатурры с помощью отладчика DEBUG. Предполагае
мая программа позволяет вводить до 12 символов, включая
символы конца каретки и конца строки. Загрузите DEBUG и
после вывода на экран приглашения введите A 100 для ввода
ассемблерных команд, начиная c адреса 100. Не забудьте, что
DEBUG предпологает, что все числа вводятся в
шеснадцатиричном формате.

100 MOV AH,3F
102 MOV BX,00
105 MOV CX,0C
108 MOV DX,10F
10B INT 21
10D JMP 100
10F DB ' '

Программа устанавливает регистры AH и BX для запроса на
ввод c клавиатуры, заносит максимальную длину ввода в ре
гистр CX и загружает в регистр DX значение 10F - область DB
в конце программы. В эту область будут помещаться вводимые
символы.
Когда вы наберете все команды, нажмите еще раз Return.
С помощью команды U 100,108 выполните дисассемблирование
программы для проверки. Затем используйте команды R и T для
трассировки четырех команд MOV. Остановившись по адресу
10B, введите G 10D для выполнения команды INT (входить в
BIOS не следует). Теперь отладчик позволит ввести данные,
завершаемые клавишей Return. Проверьте содержимое регистра
AX, состояние флага CF и используя команду D 10F, просмот
рите введенные данные в памяти. Для завершения работы
введите команду Q.

ИСПОЛЬЗОВАНИЕ СИМВОЛОВ ВОЗВРАТА КАРЕТКИ, КОНЦА СТРОКИ И
ТАБУЛЯЦИИ ДЛЯ ВЫВОДА НА ЭКРАН



Ассемблер для IBM PC. Глава 8 184


------------------------------------------------------------























































Ассемблер для IBM PC. Глава 9 200



    ГЛАВА 9. Экранные операции II: Расширенные возможности


------------------------------------------------------------

Экранные операции II: Расширенные возможности

Цель: Показать более развитые возможности управления
экраном, включая прокрутку, инвертирование, мигание, а также
использование скэн-кодов для ввода с клавиатуры.

ВВЕДЕНИЕ
------------------------------------------------------------

В главе 8 были показаны основные возможности системы для
управления выводом на экран и ввода с клавиатуры. В данной
главе приводятся более развитые возсожности, обеспечисающие
прокрутку данных на экране и установку байта-атрибута для
подчеркивания, мигания, выделения яркости. Материал первого
раздела этой главы (по прерыванию BIOS 10) подходит, как для
монохромных, так и для цветных дисплеев. Другие расширенные
возможности включают использование cкэн-кодов для
определения нажатой клавиши или комбинации клавишей на
клавиатуре.

Монохромный дисплей

Для работы монохромного дисплея имеется память объемом
4К, начинающаяся по адресу шест. B0000 (дисплейный буфер).
Эта память обеспечивает:
- 2К для символов на экране(25 строк х 80 столбцов);
- 2К для байтов-атрибутов, обеспечивающих инвертирование,
мигание, выделение яркостью и подчеркивание.

Цветной/графический дисплей

Для работы стандартного цветного графического дисплея
имеется 16 Кбайт памяти (дисплейный буфер), начинающийся по
адресу шест.B8000. Такой дисплей может являться текстовым
(для нормального ASCII-кода) или графическим и работать как
в цветном, так и в черно-белом (BW) режиме. Дисплейный буфер
обеспечивает экpанные страницы, пронумерованные от 0 до 3
для экрана на 80 cтолбцов и от 0 до 7 для экрана на 40
столбцов. Номер страницы по умолчанию - 0. В следующей главе
будет подробно рассмотрено управление цветом и графикой.

БАЙТ АТРИБУТОВ
------------------------------------------------------------

Байт атрибутов, как для монохромного, так и для графичес
кого дисплея в текстовом (не графическом) режиме определяет
характеристики каждого отображаемого символа. Байт-атрибут
имеет следующие 8 бит:




Ассемблер для IBM PC. Глава 9 201


Фон Текст
Атрибут: BL R G B I R G B
Номер битов: 7 6 5 4 3 2 1 0

Буквы RGB представляют битовые позиции, управляющие
красным (red), зеленым (green) и синим (blue) лучем в
цветном моноторе. Бит 7 (BL) устанавливает мигание, а бит 3
(I) - уровень яркости. На монохромных мониторах текст
высвечивается зеленым или оранжевым на темном фоне, хотя в
данной главе такое изображение называется черно-белым (BW).
Для модификации атрибутов можно комбинировать биты
следующим oбразом:

Эффект выделения Фон Текст
RGB RGB
Неотображаемый (черный по черному) 000 000
Подчеркивание (не для цвета) 000 001
Нормальный (белый по черному) 000 111
Инвертированный (черный по белому) 111 000

Цветные мониторы не обеспечивают подчеркивания; вместо
этого установка бит подчеркивания выбирает синий цвет для
текста и получается отображение синим по черному. Ниже
приведены некоторые атрибуты, основанные на комбинации битов
фона, текста, мигания и выделения яркостью:

Двоичный Шест. Эффект выделения
код код
0000 0000 00 Неотображаемый (для паролей)
0000 0111 07 Белый по черному (нормальный)
1000 0111 87 Белый по черному (мигание)
0000 1111 0F Белый по черному (яркий)
0111 0000 70 Черный по белому (инвертированый)
1111 0000 F0 Черный по белому (инверт. мигающий)

Эти атрибуты подходят для текстового режима, как для моно
хромных, так и для цветных дисплеев. В следующей главе будет
показано, как выбирать конкретные цвета. Для генерации атри
бута можно использовать команду INT 10H. При этом регистр
BL должен содержать значение байта-атрибута, а регистр AH
один из следующих кодов: 06 (прокрутка вверх), 07 (прокрутка
вниз), 08 (ввод атрибута или символа), 09 (вывод атрибута
или символа). Если программа установила некотоpый атрибут,
то он остается таким, пока программа его не изменит. Если
установить значение байта атрибута равным шест.00, то символ
вообще не будет отображен.

ПРЕРЫВАНИЕ BIOS INT 10H
------------------------------------------------------------







Ассемблер для IBM PC. Глава 9 202


Прерывание INT 10H обеспечивает управление всем экраном.
В регистре AH устанавливается код, определяющий функцию
прерывания. Команда cохраняет содержимое регитров BX, CX,
DX, SI и BP. Ниже описывается все возможные функции.

AH=00: Установка режима. Данная функция позволяет пере
ключать цветной монитор в текстовый или графический режим.
Установка pежима для выполняемой в текущий момент программы
осуществляется c помощью INT 10H. При установке происходит
очистка экрана. Содержимое регистра AL может быть следующим:

00 40 х 25 черно-белый текстовый режим