Организация буфера клавиатуры.
Формирование ASCII кодов.
Записанная в ПЗУ BIOS подпрограмма обработки прерывания 09H,
вызванного процессором клавиатуры при нажатии (отжатии) клавиши,
читает скан-код из порта 60H и, если это скан-код клавиши-переклю-
чателя (правый Shift, левый Shift, Ctrl, Alt, ScrollLock, NumLock,
CapsLock и Insert), то изменяется содержимое ячеек памяти
0040:0017H и 0040:0018H, хранящих состояния клавиш-переключате-
лей. В буфер клавиатуры при этом ничего не пишется (исключение
составляет клавиша Insert). В таблице 1 приведен формат байта по
адресу 0040:0017H, а в таблице 2 - по адресу 0040:0018H.
Таблица 1
Формат байта по адресу 0040:0017H
--------------------------------------
Бит Значение, когда бит=1
--------------------------------------
0 нажата клавиша правый Shift
1 нажата клавиша левый Shift
2 нажата клавиша Ctrl
3 нажата клавиша Alt
4 режим ScrollLock включен
5 режим NumLock включен
6 режим CapsLock включен
7 режим вставки включен
----------------------------------------
Таблица 2
Формат байта по адресу 0040:0018H.
--------------------------------------------------
Бит Значение, когда бит=1
--------------------------------------------------
0 нажаты клавиши левый Shift вместе с Ctrl
1 нажаты клавиши левый Shift вмести с Alt
2 нажата клавиша SysReq
3 нажаты клавиши Ctrl вместе с NumLock
4 режим ScrollLock включен
5 режим NumLock включен
6 режим CapsLock включен
7 режим вставки включен
---------------------------------------------------
Состояния клавиш-переключателей могут быть изменены программно.
Если же это скан-код клавиши, не являющейся переключателем, то
в соответствии с ее скан-кодом и состоянием клавиш-переключателей
формируется или однобайтный ASCII код данной клавиши, который вмес-
те со скан-кодом записывается в буфер клавиатуры, или двубайтный
расширенный код, первым байтом которого является 0, а второй байт в
большинстве случаев совпадает со скан-кодом. Эти два байта также
записываются в буфер клавиатуры. При отжатии клавиши в буфер ничего
не записывается и изменяется только состояние клавиш-переключате-
лей.
Программа обработки прерывания 09H отслеживает также некоторые
комбинации клавиш. В табл.3 приведены эти комбинации и действия,
выполняемые обработчиком прерывания при их обнаружении:
Таблица 3
Функции клавиш
--------------------------------------------------------------
Комбинация клавиш Выполняемые действия
--------------------------------------------------------------
Ctrl-Alt-Del Сброс и перегрузка системы
Ctrl-NumLock Перевод машины в состояние ожидания
Shift-PrtSc Распечатка на принтере содержимого экрана
(обработка прерывания 05H)
Ctrl-Break Завершение выполнения программы
---------------------------------------------------------------
Структура буфера клавиатуры изображена на рис.1. Буфер
клавиатуры расположен по адресам 0040:001H - 0040:003cH опера-
тивной памяти и позволяет накапливать данные (ASCII и скан-коды) о
15 нажатиях клавиш (на месте, предшедствующем началу строки симво-
лов в буфере хранятся ASCII код возврата каретки (ASCII 13) и скан
-код клавиши "Enter").
В ячейке 0040:001aH (указатель начала) хранится адрес перво-
го введенного символа, а в ячейке 0040:001cH (указатель хвоста) -
адрес первой свободной ячейки после последнего введенного символа.
Адреса хранятся в виде байта смещения (второй байт ячейки не ис-
пользуется). Если буфер пуст, то содержимое указателя начала сов-
падает с содержимым указателя хвоста.
15 0
+--------------+
0040:003с ¦ ¦
+--------------¦
3a ¦ ¦ Содержимое ячейки буфера
+--------------¦
38 ¦ ¦ 15 8 7 0
+--------------¦ +-------------------------+
36 ¦ ¦ ¦ скан-код ¦ ASCII ¦
+--------------¦ +-------------------------+
34 ¦ "R" ¦
+--------------¦ если ASCII код равен 0, то
32 ¦ "E" ¦ вместо скан-кода указывается
+--------------¦ номер расширенного кода
30 ¦ "F" ¦ (в большинстве случаев сов-
+--------------¦ падающего со скан-кодом)
2e ¦ "F" ¦
+--------------¦
2c ¦ "U" ¦
+--------------¦
2a ¦ "B" ¦
+--------------¦
28 ¦ ¦
+--------------¦
26 ¦ ¦
+--------------¦
24 ¦ ¦
+--------------¦
22 ¦ ¦
+--------------¦
20 ¦ ¦
+--------------¦
1e ¦ ¦
+--------------¦
1c ¦ 36 ¦ Указатель хвоста
+--------------¦
0040:001a ¦ 2a ¦ Указатель начала
+--------------+
Рис.1
Запись в буфер осуществляется по адресу указателя хвоста, при
этом содержимое указателя увеличивается на 2. Чтение из буфера
производится по адресу указателя начала, при этом содержимое ука-
зателя также увеличивается на 2 (если указатель содержит адрес
последней ячейки буфера - 3cH, то вместо увеличения на 2 в него
необходимо записать адрес начала буфера - 1H).
(c) Национальный Технический Университет
"Харьковский Политехнический Институт"
Харьков 2001
А.И.Поворознюк,
И.С.Зыков,
С.Ю.Леонов