Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Аппаратное обеспечение персонального компьютера

© Александр Фролов, Григорий Фролов
Том 33, М.: Диалог-МИФИ, 1997, 304 стр.

[Назад] [Содеожание] [Дальше]

Средства MS-DOS для работы с клавиатурой

К сожалению, MS-DOS не предоставляет программам каких-либо существенных дополнительных возможностей по сравнению с функциями прерывания BIOS INT 16h. Поэтому многие программы работают с клавиатурой через BIOS.

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

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

Вообще говоря, клавиатурные функции MS-DOS больше всего подходят для тех программ, которые ведут с оператором построчный диалог. Для таких программ при использовании средств переназначения ввода/вывода возможна организация автоматического пакетного выполнения, когда все сообщения выводятся в файл, а все данные, которые обычно вводятся с клавиатуры, считываются из заранее подготовленного файла "ответов".

Некоторые клавиатурные функции MS-DOS отслеживают комбинации клавиш <Control+C> и <Control+Break>. Если оператор ввел такую комбинацию клавиш, вызывается прерывание INT 23h, завершающее работу текущей программы. Если ваша программа не должна завершаться при нажатии этих комбинаций клавиш, можно либо создать и подключить собственный обработчик для INT 23h, либо использовать те клавиатурные функции MS-DOS, которые не выполняют проверку указанных выше комбинаций клавиш.

Приведем подробное описание клавиатурных функций прерывания MS-DOS INT 21h.

Буферизованный ввод с эхо-выводом

Функция 01h читает символы со стандартного устройства ввода. Если стандартным устройством ввода является клавиатура, и буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

Введенный символ выводится на стандартное устройство вывода.

Приведем формат вызова функции:

Регистры на входе:

AH = 01h

Регистры на выходе:

AL = код ASCII символа или 0. Если регистр содержит 0, то следующий вызов этой же функции возвратит в регистре AL расширенный код ASCII символа

Функция проверяет комбинации клавиш <Control+C> и <Control+Break>

Если программа в качестве ASCII-кода получила 0, она должна вызвать эту функцию еще один раз. Во второй раз регистр AL будет содержать расширенный ASCII-код нажатой клавиши.

Буферизованный ввод без эхо-вывода

Функция 08h аналогична предыдущей функции с номером 01h. Она читает символы со стандартного устройства ввода. Если стандартным устройством ввода является клавиатура, и буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

Регистры на входе:

AH = 08h

Регистры на выходе:

AL = код ASCII символа или 0. Если регистр содержит 0, то следующий вызов этой же функции возвратит в регистре AL расширенный код ASCII символа

Функция проверяет комбинации клавиш <Control+C> и <Control+Break>

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

Нефильтрованный ввод без эхо-вывода

Функция 07h читает символы со стандартного устройства ввода. Если стандартным устройством ввода является клавиатура, и буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу. Однако в отличие от функции 01h данная функция не проверяет комбинации клавиш <Control+C> и <Control+Break>.

Регистры на входе:

AH = 07h

Регистры на выходе:

AL = код ASCII символа или 0. Если регистр содержит 0, то следующий вызов этой же функции возвратит в регистре AL расширенный код ASCII символа

Функция не проверяет комбинации клавиш <Control+C> и <Control+Break>

Ее использовать в тех случаях, когда завершение программы по нажатию указанных комбинаций клавиш по тем или иным причинам нежелательно. Например, программа держит в оперативной памяти буферы для данных, которые перед завершением работы обязательно должны быть записаны на диск. Если пользователь в неподходящий момент времени нажал комбинацию клавиш <Control+Break> и программа аварийно завершила работу, содержимое буферов будет потеряно.

Вводс консоли и вывод на консоль

Функция 06h может использоваться как для ввода с консоли, так и для вывода символов на консоль. Режим работы функции зависит от содержимого регистра DL при вызове функции. Если в этом регистре находится значение 0FFh, функция выполняет ввод с консоли, в противном случае символ, код которого записан в этот регистр, выводится на консоль.

Регистры на входе:

AH = 06h

DL = 0FFh - для ввода символа с консоли;

или

DL = код символа, не равный 0FFh - для вывода символа на консоль

Регистры на выходе:

ZF = 0, если в буфере имеется код нажатой клавиши;

ZF = 1, если буфер клавиатуры пуст;

AL = код ASCII символа или 0, если AH содержит расширенный код ASCII символа;

AH = скан-код или расширенный код ASCII символа, если AL=0

Функция проверяет комбинации клавиш <Control+C> и <Control+Break>

Очевидно, что с помощью этой функции нельзя вывести на консоль символ с кодом 0FFh.

Основное отличие функции 06h от всех описанных ранее заключается в том, что эта функция не ожидает, пока пользователь нажмет на клавишу. Если буфер клавиатуры пуст, функция просто устанавливает флаг процессора ZF. Если же в буфере клавиатуры имеются символы, флаг ZF сбрасывается и в регистр AL функция записывает код ASCII символа.

Ввод строки символов

Функция 0Ah предназначена для ввода с клавиатуры строки символов:

Регистры на входе:

AH = 0Ah

DS:DX = адрес буфера для ввода строки

Регистры на выходе:

Буфер содержит введенную строку

Функция проверяет комбинации клавиш <Control+C> и <Control+Break>

Перед вызовом функции необходимо специальным образом подготовить буфер, адрес которого передается в регистрах DS:DX - в первый байт буфера следует записать максимальную длину max вводимой строки (в диапазоне от 1 до 244).

После возврата из функции первый байт буфера останется без изменений, а во второй байт будет записана длина введенной строки без учета завершающего ввод символа возврата каретки.

Ввод осуществляется до тех пор, пока либо количество введенных символов не достигнет max-1, либо пока не будет нажата клавиша <Enter> с кодом 0Dh. Если оператор уже ввел max-1 символ и продолжает вводить символы дальше, функция выдает звуковой сигнал и игнорирует вводимые символы до тех пор, пока не будет нажата клавиша <Enter>.

При вводе строки можно использовать стандартные средства редактирования MS-DOS, используемые при вводе команд в режиме командной строки.

Проверка состояния стандартного ввода

Функция 0Bh проверяет состояние клавиатурного буфера. Вы можете вызывать ее перед функциями 01h, 07h, 08h для того, чтобы избежать ожидания нажатия на клавишу.

Регистры на входе:

AH = 0Bh

Регистры на выходе:

AL = 0FFh, если в буфере имеется код нажатой клавиши;

AL = 0, если буфер клавиатуры пуст.

Функция проверяет комбинации клавиш <Control+C> и <Control+Break>

Если ваша программа выполняет какую-либо длительную обработку (копирование файлов, форматирование дисков и так далее), вы можете вызывать эту функцию в процессе обработки для того чтобы пользователь мог прервать процесс.

Сброс буфера клавиатуры

Функция 0Ch очищает клавиатурный буфер, затем вызывает клавиатурную функцию MS-DOS, номер которой определяется содержимым регистра AL.

Регистры на входе:

AH = 0Сh

AL = 1, 6, 7, 8 или 0Ah

Регистры на выходе:

Не опеределены

Если же регистр AL содержит другое значение, кроме приведенных выше, функция просто сбрасывает содержимое буфера и не выполняет никаких других действий.

Эту функцию удобно использовать тогда, когда перед вводом символа необходимо убедиться в том, что буфер клавиатуры пуст.

[Назад] [Содеожание] [Дальше]