Сделай Сам Свою Работу на 5

Получение состояния переключающих клавиш для 101-клавиши клавиатуры

На входе: AH = 12h.

На выходе: AL = байт состояния переключающих клавиш.

Функция возвращает в регистре AL состояние переключающих клавиш (Shift, Ctrl, Alt, ScrollLock, NumLock, CapsLock, Ins):

 

 

Биты Значение
Нажата левая клавиша Shift вместе с Ctrl
Нажата левая клавиша Shift вместе с Alt
Нажата правая клавиша Shift вместе с Ctrl
Нажата правая клавиша Shift вместе с Alt
Нажата клавиша ScrollLock
Нажата клавиша NumLock
Нажата клавиша CapsLock
Нажата клавиша Insert

 

Функция 12h аналогично функции 02h, но она предназначена для работы с клавиатурой, имеющей 101 клавишу, и имеет другой формат байта состояния. Эта функция определена для BIOS, изготовленной не раньше 15 декабря 1985 года.

 

СРЕДСТВА 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.

 

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

На входе: AH = 01h.

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

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

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

 

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

На входе: AH = 08h.

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

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

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

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

На входе: AH = 07h.

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

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

 

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

На входе: 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-код символа.

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

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

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

На входе: Буфер содержит введенную строку.

 

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

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

 

 

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

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

 

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

На входе: AH = 0Bh.

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

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

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

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

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

 

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

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

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

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

 

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

 



©2015- 2019 stydopedia.ru Все материалы защищены законодательством РФ.