Резидентный обработчик клавиатуры (перехват нажатий клавиш и запись в файл)
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферат на тему творчество, банк рефератов
| Добавил(а) на сайт: Козарис.
Предыдущая страница реферата | 1 2 3 4 5 6 7 | Следующая страница реферата
отпускание Байт флагов любой клавиши Системный клавиатуры
Контроллер Порт 60h обработчик
[40h:17h] клавиатуры Скэн-код int09h | 7 | 6| 5| 4|
3| 2| 1| 0|
Клавиатура
Ins
Скэн-код Код Caps Lock
Кольцевой буфер ASCII Num
Lock
40h:1Eh ввода Scroll Lock
40h:1Ah
Alt
Адрес головного Скэн ASCII Ctrl символа Скэн ASCII Shift левый
Скэн ASCII Shift правый
Программа Скэн ASCII пользователя Адрес хвостового
((( символа
Запрос на ввод 40h:3Ch с клавиатуры Ввод самого
“старого” символа
Рис. 2.3. Процесс взаимодействия системы с клавиатурой.
Работой клавиатуры управляет специальная электронная схема - контроллер клавиатуры. В его функции входит распознавание нажатой клавиши и помещение закрепленного за ней кода в свой выходной регистр (порт) с номером 60h. Код клавиши, поступающий в порт, называется скэн-кодом и является, по существу, порядковым номером кла- виши. При этом каждой клавише присвоены два скэн-кода, отличающиеся друг от друга на 80h. Один скэн-код (меньший, код нажатия) засылается контроллером в порт 60h при нажатии клавиши, другой (больший, код отпускания) - при ее отпускании.
Скэн-код однозначно указывает на нажатую клавишу, однако, по нему нельзя определить, работает ли пользователь на нижнем или верхнем регистре. С другой стороны, скэн-коды присвоены всем клавишам клавиатуры, в том числе управляющим клавишам , , , и др. Таким образом, очевидно, что определение введенного символа должно включать в себя не только считывание скэн-кода нажатой клавиши, но и выяснение того, не были ли перед этим нажаты, например, клавиши (верхний регистр) или (фиксация верхнего регистра). Всем этим анализом занимается программа обработки прерываний от клавиатуры.
Как нажатие, так и отпускание любой клавиши вызывает сигнал аппаратного прерывания, заставляющий процессор прервать выполняемую программу и перейти на программу системного обработчика прерываний от клавиатуры, входящего в систему BIOS. Поскольку обработчик вызывается через вектор 09h, его иногда называют программой int09h.
Программа int09h, помимо порта 60h, работает еще с двумя областями
оперативной памяти: кольцевым буфером ввода, располагаемым по адресам от
40h:lEh до 40h:3Dh, куда в конце концов помещаются коды ASCII нажатых
клавиш, и битом флагов клавиатуры, находящимся по адресу 40h:17h, где
фиксируется состояние управляющих клавиш (, , и др.).
Программа int09h, получив управление в результате прерывания от
клавиатуры, считывает из порта 60h скэн-код и анализирует его значение.
Если скэн-код принадлежит одной из управляющих клавиш, и, к тому же, представляет собой код нажатия, в байте флагов клавиатуры устанавливается
бит (флаг), соответствующий нажатой клавише. Например, при нажатии правой
клавиши в байте флагов устанавливается бит 0, при нажатии левой
клавиши - бит 1, при нажатии любой клавиши - бит 2 и т.д.
Биты флагов сохраняют свое состояние, пока клавиши (по одиночке или в любых
комбинациях) остаются нажатыми. Если управляющая клавиша отпускается, программа int09h получает скэн-код отпускания и сбрасывает соответствующий
бит в байте флагов. Кроме состояния указанных клавиш, в байте флагов
фиксируются еще режимы , , и
(см. рис. 2.3).
Компьютеры PC/AT имеют второй байт флагов клавиатуры, находящийся по
адресу 40h:18h, и отражающий состояние управляющих клавиш на расширенной
(101-клавишной) клавиатуре.
При нажатии обычной, не управляющей клавиши, программа int09h считывает
из порта 60h ее скэн-код нажатия и по таблице трансляции скэн-кодов в коды
ASCII формирует двухбайтовый код, старший байт которого содержит скэн-код, а младший код ASCII. При этом если скэн-код характеризует клавишу, то код
ASCII определяет закрепленный за ней символ.
Поскольку за каждой клавишей закреплено, как правило, не менее двух
символов ("а" и "А", "1" и "!", "2" и "@" и т.д.), то каждому скэн-коду
соответствуют, как минимум, два кода ASCII. В процессе трансляции программа
int09h анализирует состояние флагов, так что если нажата, например, клавиша
Q (скэн-код 10h, код ASCII буквы Q - 51h, а буквы q - 7lh), то формируется
двухбайтовый код 1071h, но если клавиша Q нажата при нажатой клавише
(смена регистра), то результат трансляции составит 1051h. Тот же
код 1051h получится, если при нажатии клавиши Q был включен режим (заглавные буквы), однако при включенном режиме и нажатой
клавише образуется код 1071h, поскольку в такой ситуации клавиша на время нажатия переводит клавиатуру в режим нижнего регистре
(строчные буквы).
Полученный в результате трансляции двухбайтовый код засылается программой
int09h в кольцевой буфер ввода, который служит для синхронизации процессов
ввода данных с клавиатуры и приема их выполняемой компьютером программой.
Объем буфера составляет 16 слов, при этом коды символов извлекаются из него
в том же порядке, в каком они в него поступали. За состоянием буфера следят
два указателя. В хвостовом указателе (слово по адресу 40:lCh) хранится
адрес первой свободной ячейки, в головном указателе (40: 1Ah) - адрес
самого старого кода, принятого с клавиатуры и еще не востребованного
программой. Оба адреса представляют собой смещения относительно начала
области данных BIOS, т.е. числа от 1Eh до 3Ch. В начале работы, когда буфер
пуст, оба указателя - и хвостовой, и головной, указывают на первую ячейку
буфера.
Программа int09h, сформировав двухбайтовый код, помещает его в буфер по адресу, находящемуся в хвостовом указателе, после чего этот адрес увеличивается на 2, указывая опять на первую свободную ячейку. Каждое последующее нажатие на какую-либо клавишу добавляет в буфер очередной двухбайтовый код и смещает хвостовой указатель.
Выполняемая программа, желая получить код нажатой клавиши, должна
обратиться для этого к каким-либо системным средствам - функциям ввода с
клавиатуры DOS (прерывание 21h) или BIOS (прерывание 16h). Системные
программы с помощью драйвера клавиатуры (точнее говоря, объединенного
драйвера клавиатуры и экрана, так называемого драйвера консоли с именем
CON) считывают из кольцевого буфера содержимое ячейки, адрес которой
находится в головном указателе, и увеличивает этот адрес на 2. Таким
образом, программный запрос на ввод с клавиатуры фактически выполняет прием
кода не с клавиатуры, а из кольцевого буфера.
Рекомендуем скачать другие рефераты по теме: конспекты занятий в детском саду, менеджмент.
Категории:
Предыдущая страница реферата | 1 2 3 4 5 6 7 | Следующая страница реферата