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

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 находится принятый скан-код. Стандартный обработчик Int15h(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-совместимого компьютера

Int 10h — видеосервис

Int 10h — видеосервис — предназначен для работы с графическим адаптером. Его первичной задачей является управление видеорежимом (BIOS Video Mode), оп­ределяющим формат экрана. BIOS адаптера должна выполнять программирова­ние всех стандартных и специфических управляющих регистров для установки (смены) требуемого видеорежима и выбранных параметров развертки — кроме нее о способах этих переключений остальное ПО может и не знать. В пределах возможностей установленного видеорежима видеосервис предостав­ляет возможности отображения информации на различных уровнях. Простейший для программиста телетайпный режим позволяет посылать поток символов, кото­рые будут построчно отображаться на экране с отработкой символов возврата карет­ки, перевода строки, обеспечивая «прокрутку» изображения при заполнении экра­на. Есть функции и для полноэкранной работы с текстом, при которой доступны и атрибуты символа. В графическом режиме имеется возможность чтения и записи пиксела с указанными координатами. Однако видеосервисом Int 10h программи­сты пользуются далеко не всегда, поскольку работает он довольно медленно. Под­робно рассматривать функции видеосервиса не будем (этому посвящены отдель­ные книги), отметим особо лишь функцию телетайпного вывода Int 10h(0Eh). При вызове AH=OEh, в AL — код выводимого символа, в BL — цвет (только для гра­фического режима). Символ выводится в текущую позицию курсора, и курсор сдви­гается на следующую, переходя на новую строку после конца предыдущей и про­кручивая экран при его заполнении. Специальные символы вызывают возврат на начало строки (CR, код ODh), перевод строки (LF, OAh) и короткий гудок (BEL, 07h). Этой функцией часто пользуются для вывода сообщений программами, работа­ющими на нижнем уровне (например, модули инициализации ПЗУ расширений BIOS, загрузчики и другие, не имеющие еще доступа к сервисам операционных систем). Программа вывода получается простейшей, работает на всех адаптерах и во всех режимах, но довольно медленно.

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



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