Аппаратные интерфейсы ПК

         

Int h, Int h — поддержка клавиатуры


Поддержка клавиатуры заключается в обработке прерываний от устройства вво­да и предоставлении сервисов ввода прикладным программам.

Прерывания, вызванные приходом кодов нажатия и отпускания клавиш, обраба­тывает BIOS Int 9h. Каждый принятый скан-код (или цепочка) обрабатывает­ся с учетом состояния клавиатурных флагов. Результат обработки (как правило, ASCII-символ в младшем байте и скан-код в старшем) помещается в клавиатур­ный буфер, расположенный в ОЗУ. По приему каждого символа указатель головы буфера увеличивается. Буфер организован в виде кольца, после достижения конца области буфера указатель головы установится на начало области. В случае переполнения буфера (указатель головы «догнал» указатель хвоста) очередное слово не записывается, и подается звуковой сигнал. Размер позволяет хранить описание шестнадцати фактов нажатий клавиш. Нажатие клавиш Ctrl, Shift, Alt и некоторых комбинаций в буфере не отмечается, но приводит к модификации бит ячеек флагов клавиатуры. Нажатие «системной» комбинации Ctrl+Alt+Del, кла­виши PrintScreen (SysRq) и некоторых других к записи в клавиатурный буфер не приводит, а вызывает специальные процедуры.

Для обслуживания клавиатуры используются ячейки ОЗУ из области данных BIOS (BIOS Data Area):

¦     0:0417,0:418 — флаги клавиатуры;

¦     0:0419 — аккумулятор кода Alt-набора;

484______ Глава 12. Архитектурные компоненты IBM PC-совместимого компьютера

¦     0:041А — указатель головы буфера (Buffer Head), 2 байта (модифицируется

при помещении символа в буфер);

¦     0:041С — указатель хвоста буфера (Buffer Tail), 2 байта (модифицируется при извлечении символа из буфера);

¦     0:041E-0:042D — область кольцевого буфера (16 слов).

Обработчик аппаратного прерывания до обработки принятого скан-кода вызы­вает прерывание BIOS IntlSh с AH=4Fh, а в AL находится принятый скан-код. Стандартный обработчик Int 15h(4Fh) просто выполняет возврат с CF=0, но его можно заменить специальным обработчиком, который будет при необходимости подменять принятые скан-коды на какие-либо иные (оставляя их в AL), что долж­но отмечаться установкой CF=1.
В старых версиях BIOS такой возможности пере­хвата не было, ее наличие можно определить вызовом Int 15h(COh).



Для клавиатуры USB или иного устройства ввода, заменяющего клавиатуру в каче­стве консоли, прерывание Int 9h должно вызываться программно при обработке каждого клавиатурного события. Обработчик этого прерывания должен выпол­нять те же действия: скан-код пропускать через Int 15h(4Fh) и помещать в кла­виатурный буфер, а также модифицировать флаги клавиатуры.

Интерфейс прикладного уровня для клавиатуры представляет BIOS Int 16h. Его основное назначение — извлечение слов из клавиатурного буфера. Функция зада­ется в регистре АН при вызове, результат помещается в регистр АХ.

¦     АН = OOh — чтение (с ожиданием готовности) и выборка слова из буфера

(меняется указатель хвоста). Индикаторы клавиатуры обновляются в соответ­

ствии с состоянием флагов. Если буфер пуст, то на AT выполняется прерыва­ние Int 15h (подфункция 90), что может использоваться ОС, например, для переключения задач. Чтобы программа не «зависала» на ожидании символа, предварительно стоит проверить готовность функцией Olh. Символы расши­ренной клавиатуры фильтруются — преобразуются в их аналоги 83-клавишной клавиатуры.

¦     АН = Olh — проверка готовности, чтение без выборки (указатели не изменяют­ся). Признак наличия символа в буфере — установленный флаг ZF.

¦     АН = 02h — чтение состояния флагов (в AL — байт 0:417h, см. выше).

¦     АН = 03h — установка задержки и частоты автоповтора: BL — код задержки (00=250, 01=500,02=750,03=1000 мс), ВН - код частоты (см. п. 9.2.1).

¦     АН = 05h — запись слова из регистра СХ в буфер (меняется указатель головы). Признак успешной записи — AL=Q, если в буфере нет места, то AL=1.

¦     АН = 10h и AH=*llh — функции, аналогичные ООН и Olh, но предназначены специально для 101/102-клавишных клавиатур — в них не выполняется филь­трация символов расширенной клавиатуры.


Для ряда клавиш, отсутству­ющих в клавиатуре АТ-84, эти функции дадут результаты, отличающиеся от вызовов OOh и Olh.

12.8. Сервисы и прерывания BIOS_________________________________       485

¦ AH=12h . — чтение расширенного состояния флагов (в АХ — слово KbdShif tFlagslOlRec), в котором младший байт совпадает с тем, что дает

i функция 02h (слово из 0:417h), а старший байт похож на слово из 0:418h. Назначение бит АХ:

•       бит 0 — клавиша Shift (правая) нажата;

•       бит 1 — клавиша Shift (левая) нажата;          .

•       бит 2 — клавиша Ctrl (любая) нажата;

•       бит 3 — клавиша Alt (любая) нажата;

•       бит 4 — включен индикатор Scroll Lock;

•       бит 5 — включен индикатор Num Lock;

•       бит 6 — включен индикатор Caps Lock;

•       бит 7 — включен режим Insert;

•       бит 8 — клавиша Ctrl (левая) нажата;

•       бит 9 — клавиша Alt (левая) нажата;

•       бит 10 — клавиша Ctrl (правая) нажата;

•       бит 11 — клавиша Alt (правая) нажата;

•       бит 12 — клавиша Scroll Lock нажата;

•       бит 13 — клавиша Num Lock нажата;

•       бит 14 — клавиша Caps Lock нажата;

•       бит 15 — клавиша SysReq нажата.

Функции чтения буфера (00 и 10h) в регистре AL возвращают ASCII-код символа, в АН — скан-код. Символы, полученные нестандартным способом (в русском реги­стре или Alt-набором), сопровождаются нулевым скан-кодом. Alt-набор позволяет ввести в буфер любой символ — для этого его код в десятичной системе набирает­ся на цифровой клавиатуре при нажатой клавише Alt, результат заносится в буфер при отпускании клавиши Alt.



При AL= 0 регистр АН содержит расширенный ASCII-код (Extended ASCII Keystroke). Дополнительные клавиши 101/102 клавиатур при использовании функций 10h-12h генерируют код EOh в младшем байте и скан-код, соответствующий аналогич­ным управляющим клавишам 83/84-клавишных клавиатур.

Функция записи (05h), несколько неожиданная для клавиатуры, позволяет легко имитировать работу оператора для различных демонстрационных программ. Если прикладная программа не перехватывает обслуживание клавиатуры на уровне аппаратного прерывания (In t 9h), то резидентная программа может ей «подбра­сывать» слова в буфер, которые будут восприниматься как нажатие клавиш.

ASCII-коды буфера, соответствующие нажатию клавиш, приведены в [1, 7]. При русификации (или другой локализации) клавиатуры отслеживание переключения регистров (языков) ложится на обработчик аппаратного прерывания клавиатуры.

486______ Глава 12. Архитектурные компоненты IBM PC-совместимого компьютера


Содержание раздела