![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Int 09h, Int16 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 — чтение (с ожиданием готовности) и выборка слова из буфера ♦ АН = 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-совместимого компьютера
|