Ниже перечислены другие функции DOS, которые могут оказаться полезными в работе. Код функции устанавливается в регистре AH и, затем, выдается команда INT 21H.
AH=01
Ввод с клавиатуры с эхо отображением. Данная функция возвращает значение в регистре AL. В случае, если содержимое AL не равно нулю, то оно представляет собой стандартный ASCII-cимвол, например, букву или цифру. Нулевое значение в регистре AL свидетельствует о том, что на клавиатуре была нажата специальная функциональная клавиша, например, Номе, F1 или PgUp. Для определения скэн-кода клавиш, необходимо повторить вызов функции. Данная функция реагирует на запрос Ctrl/Break.
AH=02
Вывод символа. Для вывода символа на экран в текущую позицию курсора необходимо поместить код данного символа в pегистр DL. Коды табуляции, возврата каретки и конца строки действуют обычным образом.
AH=07
Прямой ввод с клавиатуры без эхо отображения. Данная функция работает аналогично функции 01 с двумя отличиями: введенный символ не отображается на экране, то есть, нет эхо, и oтсутствует реакция на запрос Ctrl/Break.
AH=08
Ввод с клавиатуры без эхо отображения. Данная функция действует аналогично функции 01 с одним отличием: введенный символ не отображается на экран, то есть, нет эхо.
AH=0B
Проверка состояния клавиатуры. Данная функция возвращает шест. FF в регистре AL, если ввод с клавиатуры возможен, в противном случае — 00. Это средство связано с функциями 01, 07 и 08, которые не ожидают ввода с клавиатуры.
Ввод с клавиатуры по команде BIOS INT 16H
Команда BIOS INT 16H выполняет специальную операцию, которая в соответствии с кодом в регистре AH обеспечивает следующие три функции ввода с клавиатуры.
AH=00
Чтение символа. Данная функция помещает в регистр AL oчередной ASCII символ, введенный с клавиатуры, и устанавливает скэн-код в регистре AH. В случае, если на клавиатуре нажата одна из специальных клавишей, например, Номе или F1, то в регистр AL заносится 00. Автоматическое эхо символа на экран по этой функции не происходит.
AH=01
Определение наличия введенного символа. Данная функция сбрасывает флаг нуля (ZF=0), если имеется символ для чтения с клавиатуры; очередной символ и скэн-код будут помещены в регистры AL и AH соответственно и данный элемент останется в буфере.
AH=02
Определение текущего состояния клавиатуры. Данная функция возвращает в регистре AL состояние клавиатуры из адреса памяти:
Бит
Состояние вставки активно (Ins)
Состояние фиксации верхнего регистра (Caps Lock) переключено
Состояние фиксации цифровой клавиатуры (Num Lock) переключено
Состояние фиксации прокрутки (Scroll Lock) переключено
Нажата комбинация клавишей Alt/Shift
Нажата комбинация клавишей Ctrl/Shift
Нажата левая клавиша Shift
Нажата правая клавиша Shift
Функциональные клавиши
Клавиатура располагает тремя основными типами клавишей:
1. Символьные (алфавитно-цифровые) клавиши: буквы от a до z, цифры от 0 до 9, символы %, $, # и так далее.
2. Функциональные клавиши: Номе, End, Возврат на позицию, стрелки, Enter, Del, Ins, PgUp, PgDn и программно-функциональные клавиши.
3. Управляющие клавиши: Alt, Ctrl и Shift, которые работают совместно с другими клавишами.
Функциональная клавиша не вырабатывает какой-либо символ, но чаще формирует запрос на некоторые действия. Аппаратная реализация не требует от функциональных клавишей выполнения каких-либо специфических действий.
Задачей программиста является определить, например, что нажатие клавиши Номе должно привести к установке курсора в верхний левый угол экрана, или нажатие клавиши End должно установить курсор в конец текста на экране.
Можно легко запрограммировать функциональные клавиши для выполнения самых различных действий.
Каждая клавиша имеет собственный скэн-код от 1 (Esc) до 83 (Del) или от шест.01 до шест.53. Посредством этих скэн-кодов программа может определить нажатие любой клавиши. Например, запрос на ввод одного символа с клавиатуры включает загрузку 00 в регистр AH и обращение к BIOS через INT 16H:
MOV AH,00 ;Функция ввода с клавиатуры
INT 16H ;Вызвать BIOS
Данная операция имеет два типа ответов в зависимости от того, нажата символьная клавиша или функциональная. Для символа (например, буква A) клавиатура посылает в компьютер два элемента информации:
1. ASCII-код символа A (шест.41) в регистре AL;
2. Скэн-код для клавиши A (шест.1E) в регистре AH.
В случае, если нажата функциональная клавиша (например, Ins) клавиатура также передает два элемента:
1. Нуль в регистре AL;
2. Скэн-код для клавиши Ins (шест.52) в регистре AH.
Таким образом, после выполнения команды INT 16H необходимо прежде проверить содержимое регистра AL. В случае, если AL содержит нуль, то была нажата функциональная клавиша, если не нуль, то получен код символьной клавиши.
Скэн-коды
Клавиатура имеет по две клавиши для таких символов как *, + и -. Нажатие «звездочки», например, устанавливает код символа шест.2A в регистре AL и один из двух скэн-кодов в регистре AH в зависимости от того, какая из клавишей была нажата: шест.09 для звездочки над цифрой 8 или шест.29 для звездочки на клавише PrtSc.
Функциональные клавиши Скэн-коды
Alt/A — Alt/Z 1E — 2C
F1 — F10 3B — 44
Home 47
Стрелка вверх 48
PgUp 49
Стрелка влево 4B
Стрелка вправо 4D
End 4F
Стрелка вниз 50
PgDu 51
Ins 52
Del 53
Приведем пример программы для установки курсора в строку 0 и cтолбец 0 при нажатии клавиши Номе (скэн-код 47):
MOV AH,00 ;Выполнить ввод с клавиатуры
INT 16H ; CMP AL,00 ;Функциональная клавиша?
JNE EXIT1 ; нет — выйти
CMP AH,47H ;Скэн-код для клавиши Home?
JNE EXIT2 ; нет — выйти
MOV AH,02 ;
MOV BH,00 ;Установить курсор
MOV DX,00 ; по координатам 0,0
INT 10H ;Вызвать BIOS
Функциональные клавиши F1—F10 генерируют скэн-коды от шест.3B до шест.44. Следующий пример выполняет проверку на функциональную клавишу F10:
CMP AH,44H ;Клавиша F10?
JE EXIT1 ; Да!
По адресу EXIT1 программа может выполнить любое необходимое действие.
Цвет и графика
Текстовой режим
Текстовой режим предназначен для обычных вычислений с выводом букв и цифр на экран. Данный режим одинаков для черно-белых (BW) и для цветных мониторов за исключением того, что цветные мониторы не поддерживают атрибут подчеркивания. Текстовой режим обеспечивает работу с полным набором ASCII кодов (256 символов), как для черно-белых (BW), так и для цветных мониторов. Каждый символ на экране может отображаться в одном из 16 цветов на одном из восьми цветов фона. Бордюр экрана может иметь также один из 16 цветов.
Цвета
Тремя основными цветами являются красный, зеленый и синий. Комбинируя основные цвета друг с другом, можно получить восемь цветов, включая черный и белый. Используя два уровня яркости для каждого цвета, получим всего 16 цветов:
I R G B
Черный 0 0 0 0
Серый 1 0 0 0
Синий 0 0 0 1
Ярко-синий 1 0 0 1
Зеленый 0 0 1 0
Ярко-зеленый 1 0 1 0
Голубой 0 0 1 1
Ярко-голубой 1 0 1 1
Красный 0 1 0 0
Ярко-красный 1 1 0 0
Сиреневый 0 1 0 1
Ярко-сиреневый 1 1 0 1
Коричневый 0 1 1 0
Желтый 1 1 1 0
Белый 0 1 1 0
Ярко-белый 1 1 1 1
Таким образом любые символы могут быть отображены на экране в oдном из 16 цветов. Фон любого символа может иметь один из первых восьми цветов.
В случае, если фон и текст имеют один и тот же цвет, то текст получается невидимым.
Используя байт атрибута, можно получить также мигающие символы.
Байт-атрибут
Текстовой режим допускает использование байта атрибута. Цвет на экране сохраняется до тех пор, пока другая команда не изменит его.
Для установки цвета можно использовать в команде INT 10H функции AH=06, AH=07 и AH=09. Например, для вывода пяти мигающих звездочек светло-зеленым цветом на сиреневом фоне возможна следующая программа:
MOV AH,09 ;Функция вывода на экран
MOV AL,'*' ;Выводимый символ
MOV BH,00 ;Страница 0
MOV BL,0DAH ;Атрибут цвета
MOV CX,05 ;Число повторений
INT 10H ;Вызвать BIOS
Графический режим
Для генерации цветных изображений в графическом режиме используются минимальные точки растра — пикселы или пэлы (pixel). Цветной графический адаптер (CGA) имеет три степени разрешения:
1. Низкое разрешение.
2. Среднее разрешение.
3. Высокое разрешение.
Лекция 8.
Требования языка