Задача 2.3.
Опишите алгоритм работы программы обработки прерывания № 9 при нажатии на любую из символьных клавиш.
Алгоритм работы
Клавиатура подключена к линии
IRQ1 контроллера прерываний и к порту
ввода-вывода с адресом
60h, в который помещается скан-код последней
нажатой (или отпущенной) клавиши. Линии IRQ1 соответствует прерывание №
9.
Обработчик прерывания № 9 записывает данные об очередной нажатой символьной
клавише в буфер клавиатуры (буфер клавиатуры начинается с адреса
0040:001E), а прикладные программы считывают эти данные для
дальнейшего использования. Для каждого нажатия клавиши в буфере
зарезервировано по два байта:
- Младший байт
- -для скан-кода клавиши
- Старший байт
- -для ASCII-кода символа, который соответствует этой клавише
Например, если по адресу 0040:00
1F записан скан-код, то по
адресу 0040:00
1E – ASCII-код.
При нажатии символьной клавиши обработчик прерывания вычисляет
значение кода ASCII по ее скан-коду (с учетом текущего состояния
флагов клавиатуры) и записывает эти коды в два соседних байта буфера.
Процесс записи данных в буфер клавиатуры и чтения данных из буфера
регулируется двумя указателями. Этими указателями являются так
называемые
«голова» и
«хвост» буфера. Двухбайтовое
слово по адресу 0040:00
1Ch содержит
адрес (смещение относительно сегмента 0040h) «головы». По этому
адресу обработчик
прерывания записывает пару кодов очередной нажатой клавиши.
Двухбайтовое слово по адресу 0040:00
1Ah содержит
адрес «хвоста».
По этому
адресу «лежит» пара кодов первой из еще не прочитанных
клавиш. Эти коды может прочитать прикладная программа.
В исходном состоянии значения этих указателей одинаковы и равны
001Еh
(адрес начала буфера). После завершения каждой операции записи данных
в буфер
программа-обработчик 9-го прерывания инкрементирует
(увеличивает на два) значение
«головы», а программа,
читающая буфер, соответственно инкрементирует
значение
«хвоста», таким образом, при вводе
данных с клавиатуры «хвост» буфера постоянно догоняет «голову». Буфер
клавиатуры организован циклически, то есть при достижении
соответствующим указателем конца буфера этот указатель программно
устанавливается в начало буфера.
Если прочитаны
все записанные в буфер данные, то указатели «головы» и
«хвоста»
совпадают. Это является признаком пустого буфера. Буфер
клавиатуры может оказаться «переполненным» - такая ситуация создается
в случае, если прикладная программа не прочитала данные из буфера о
16-ти последних нажатых клавишах, и, следовательно, «хвост» отстает
от «головы» на длину буфера (с учетом его циклической организации).
Попытка ввода данных об очередной нажатой клавише в переполненный
буфер будет блокирована.
Рисунок демонстрирует описанные выше процессы. (Вообще-то это не
рисунок, а Flash-ролик. При использовании некоторых броузеров,
например, Opera 6, он может "не работать", или совсем не отображаться
на экране. Если ролик не отображается при использовании "правильного"
броузера, то, возможно, придется (пере)установить FLASH-плеер). Имеются только три "клавиши" с английскими буквами "А",
"В" и "С", но для демонстрации использования буфера клавиатуры этого
вполне достаточно.
- Пояснения к рисунку.
- Изначально буфер пуст. «Голова» и «хвост» содержат
один и тот же адрес – смещение 001Е. После нажатия на клавишу,
которой соответствует английская буква «А», скан-код этой клавиши
помещается в порт 60h. Обработчик прерывания № 9 вычисляет
ASCII-код клавиши и помещает данные о ней в буфер клавиатуры: в
младший байт (0040:001F) – скан-код, а в старший байт (0040:001E) –
ASCII-код. При этом адрес «головы» увеличивается на два.
После отпускания клавиши в старший бит порта 60h записывается единица.
Если данные о клавише считаны какой-либо программой, то адрес
«хвоста» также увеличивается на 2 и становится равным адресу «головы».
Это означает, что буфер пуст. Однако,
если снова нажать какую-либо клавишу, то данные о ней будут записаны
уже по смещению 0020 и т.д.
- Примечание.
- Если флеш-ролик не отображается на экране несмотря
на то, что вы используете правильный броузер и флеш-плеер у вас установлен,
анимация включена и т.д., то вы можете
скачать
флеш-ролики к задачам
2.3 и 2.4 и поработать с ними отдельно.
<<< Назад <<<
>>> Дальше >>>