Другие операции ввода/вывода
Ниже перечислены другие функции 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.