Подробное исследование работы клавиатуры ПК и обслуживающих ее прерываний, страница 2

Если единственная обязанность аппаратного прерывания INT 09H — ЭТО прием данных с клавиатуры, их интерпретация и занесение в буфер, то программное прерывание INT 16H обладает большей гибкостью, предоставляя целых 3 подфункции (пронумерованные от 0 до 2). Прикладная программа задает необходимую функцию путем передачи обработчику INT 16H номера этой функции в регистре АН перед выполнением прерывания.

Первая функция (с номером 0 или 00Н) передает прикладной программе информацию о нажатой клавише (ее скан- и ASCII-коды) из буфера клавиатуры. При использовании этой функции надо учитывать одну ее особенность. Дело в том, что буфер клавиатуры большую часть времени пуст, а прерывание INT 16H ООН (т.е. прерывание INT 16H, функция 00Н) обязано вернуть информацию о нажатой клавише. Поэтому функция ООН заставляет ЦПУ выполнять цикл ожидания до тех пор, пока в буфере не появится какой-либо код — т.е. пока не будет нажата какая-нибудь клавиша.

Для того, чтобы понять, каким образом во время пребывания процессора в цикле ожидания в буфер поступает информация, обратимся к прерыванию INT 09H. Это аппаратное прерывание вырабатывается при любом нажатии на клавишу и, прерывая просмотр функцией INT 16H 00Н буфера клавиатуры, заносит в него данные. После окончания работы прерывания INT 09H, функция INT 16H 00Н внезапно обнаруживает поступившие с клавиатуры данные и передает их прикладной программе.

Функция 01Н прерывания INT 16H в некоторых случаях более эффективна. Эта функция позволяет программе определить, есть в буфере данные или нет и затем немедленно возвращает управление прикладной программе. Все, что остается программе — это периодически обращаться к функции INT 16H 01Н и проверять заполненность буфера. Если будет получен ответ "да", то программа сможет немедленно прочитать символ с помощью функции INT 16H 00H.

Последняя функция прерывания INT 16H имеет номер 2 (02Н) и возвращает текущую информацию о клавишах CapsLock, Insert, NumLock, ScrollLock, Alt, Ctrl, левый и правый Shift. Мы вернемся к этой функции несколько позднее.

Таким образом, главное отличие между INT 09H и INT 16H состоит в том, что INT 09H является аппаратным прерыванием, выполняемым BIOS, и используется исключительно клавиатурой для сохранения данных о нажатых клавишах. INT 16H — это программное прерывание, выполняемое ПЗУ BIOS и используемое прикладными программами по мере необходимости для получения данных о нажатых клавишах.

 Подробнее о прерываниях

Так как концепция прерываний является ключевой в понимании функционирования клавиатуры (как впрочем и любых других устройств), рассмотрим работу прерываний поподробнее. Как для программных, так и для аппаратных прерываний семейство процессоров 80х86 выполняет одну и ту же последовательность операций. В обоих случаях управление временно передается программе, называемой обработчиком прерывания. При возникновении аппаратного прерывания переход на его обработчик вызывается воздействием сигнала, поступающего на специальный вывод процессора, Программные же прерывания инициируются самим процессором при выполнении инструкции INT (INTerrupt — прерывание). У команды INT имеется обратная команда — IRET (Interrupt RETurn — возврат из прерывания), используемая обработчиком прерывания для возврата управления прерванной программе. Рассмотрим сначала, что делает ЦПУ при выполнении команды INT.