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

Аппаратное обеспечение IBM PC

© Александр Фролов, Григорий Фролов
Том 2, книга 1, М.: Диалог-МИФИ, 1992.

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

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

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

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

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

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

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

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

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

На входе:       AH = 01h.
        
На выходе:      AL = ASCII-код символа или 0. Если регистр
                содержит 0, то следующий вызов этой же
                функции возвратит в регистре AL 
                расширенный ASCII-код символа.
                
                Функция проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.



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

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

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

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

На входе:       AH = 08h.
        
На выходе:      AL = ASCII-код символа или 0. Если регистр
                содержит 0, то следующий вызов этой же
                функции возвратит в регистре AL 
                расширенный ASCII-код символа.
                
                Функция проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.



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

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

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

На входе:       AH = 07h.
        
На выходе:      AL = ASCII-код символа или 0. Если регистр
                содержит 0, то следующий вызов этой же
                функции возвратит в регистре AL 
                расширенный ASCII-код символа.
                
                Функция не проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.



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

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

2.5.4. Ввод/вывод на консоль

На входе:       AH = 06h;

                DL = 0FFh - для ввода символа с консоли;
                  или:
                DL = код символа, не равный 0FFh - для
                  вывода символа на консоль.
        
На выходе:      ZF = 0, если в буфере имеется код нажатой
                        на клавиатуре клавиши;

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

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

                Функция проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.


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

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

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

Если в буфере клавиатуры имеются символы, флаг ZF сбрасывается и в регистр AL функция записывает ASCII-код символа.

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

На входе:       AH    = 0Ah;

                DS:DX = адрес буфера для ввода строки;
        
На выходе:      Буфер содержит введенную строку.

                Функция проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.


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

----T---T---T---T---T---T- - -
¦max¦ ? ¦ ?   ?   ?   ?   ?   
L-T-+---+---+---+---+---+ -  -
  ¦
  L----> максимальная длина вводимой строки



После возврата из функции буфер будет иметь следующий формат:

----T---T---T---T---T---T- - -
¦max¦len¦ T   E   X   T   0Dh 
L-T-+-T-+---+---+---+---+ -  -
  ¦   ¦
  ¦   L------- длина введенной строки (без учета
  ¦                      завершающего символа CR)
  L----------- остается без изменений


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

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

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

На входе:       AH = 0Bh.
        
На выходе:      AL = 0FFh, если в буфере имеется код нажатой
                           на клавиатуре клавиши;

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

                Функция проверяет комбинации клавиш
                Ctrl-C и Ctrl-Break.



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

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

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

На входе:       AH = 0Ch;

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

На выходе:      не опеределены.


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

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

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