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

INT 09H завершает свою работу и передает управление прерванной программе путем выполнения команды IRET. Более подробную информацию по 8259А смотрите в Peripherial Handbook (Intel. 1990).

Скан-коды клавиатуры

Как я уже указывал, INT 09H интерпретирует скан-код, поступающий в порт A PPI 8255A. Фактически программа INT 09H выполняется всякий раз при активизации клавиатуры. Сюда относятся нажатие клавиши, ее отпускание, а также удержание в нажатом состоянии. Клавиатура просто посылает скан-код в ПК программе INT 09H, которая определяет, как его необходимо интерпретировать. Программа INT 09H, расположенная в BIOS, преобразовывает скан-коды, посылаемые клавиатурой, в ASCII-символы, которые могут использовать прикладные программы. Здесь необходимо принять во внимание следующее обстоятельство. INT 09H является аппаратно-зависимой функцией, поэтому программа для 83-клавишной клавиатуры отличается от версии программы для расширенной 101-клавишной клавиатуры. Очевидно, что для связи букв с дополнительными клавишами требуются дополнительные коды.

Для лучшего понимания обратимся к программе PORT-A.ASM (рис. 3), которая в реальном времени отображает скан-коды, посылаемые при нажатии и отпускании клавиш (клавиатура посылает скан-коды в порт A PPI, адрес 60Н.) Скан-коды считываются программой PORT-A до того, как программа INT 09H доберется до них, путем перехвата прерывания 09H. Перехват прерывания означает замену адреса прерывания в таблице векторов прерываний на адрес своей программы обработки. Исходный адрес при этом запоминается и, как только программа PORT-A или любая другая перехватившая программа завершится, управление может быть передано первоначальному обработчику прерываний. (Хотя перехват прерываний похож на передачу управления TSR-программе при нажатии "горячей клавиши", PORT-A.ASM не является TSR-программой.) При нажатии клавиши Esc программа PORT-A восстанавливает прежнее значение в таблице векторов прерываний и возвращается к приглашению DOS. Остальные подробности программы описаны в комментариях в листинге программы. Вы можете скомпилировать представленный код.

После запуска программы PORT-A при любом нажатии на клавишу на экране появляется скан-код этой клавиши. При отпускании этой клавиши на экране появляется другой скан-код. Для 83-клавишной клавиатуры код отпускания равен коду нажатия плюс 80Н (10000000В), что устанавливает старший бит скан-кода. Это также верно и для большинства клавиш расширенной клавиатуры, однако для новых (дополнительных) клавиш — специализированных клавиш курсора и некоторых комбинаций клавиш — посылается серия скан-кодов. некоторые из которых имеют старший бит, установленный в 1 даже при нажатии на клавишу. До появления расширенной клавиатуры пользователи могли легко отличить нажатие клавиши от отпускания проверкой старшего бита скан-кода. Этот способ не работает с расширенной клавиатурой. Программа PORT-A может стать удобным инструментом для определения скан-кодов, которые должна обрабатывать программа INT 09H при нажатии на ту или иную клавишу. Работа программы PORT-A вполне понятна, однако значения выводимых скан-кодов поначалу кажутся весьма странными. Все становится ясно после понимания работы INT 09H. Для этого рассмотрим логику декодирования программы INT 09H шаг за шагом.

Скан-код, считываемый программой INT 09H из порта А, в большинстве случаев является числом, представляющим собой относительное положение клавиши на клавиатуре. Так, скан-код 01Н относится к клавише Esc, 02H — к клавише !/1, 0ЗН — @/2 и т.д. слева направо по верхнему ряду клавиатуры. В отличие от большинства компьютерных схем нумерации, отсутствует клавиша, связанная с кодом 0. INT 09H использует 0 как псевдо-скан-код для отображения комбинации Ctrl-Break. После клавиши Backspace последовательная нумерация возобновляется с клавиши Tab в раду QWERTY. После перечисления клавиш пишущей машинки нумерация продолжается на функциональных клавишах, а далее —на дополнительных. Некоторые клавиши, такие как Esc и функциональные, на разных клавиатурах расположены в разных местах, поэтому для них система нумерации не имеет смысла. Для сохранения совместимости скан-коды остаются теми же. Помните, что скан-код не имеет ничего общего с ASCII-эквивалентом клавиши.