Предыдущий раздел | УПРАВЛЕНИЕ УСТРОЙСТВАМИ С ПРЕРЫВАНИЯМИ | Следующий раздел |
Алгоритмы программных модулей драйвера клавиатуры имеют много общего с алгоритмами программных модулей драйвера считывателя перфоленты (см. п.21.3). В частности, буфер драйвера клавиатуры представляет собой несвязанную циклическую очередь, алгоритмы работы с которой очень похожи на соответствующие алгоритмы драйвера ввода с перфоленты. Но между этими драйверами есть и существенные отличия, вызванные, прежде всего техническими деталями управления конкретным устройством (клавиатурой).
Т а б л и ц а 9. Скан-коды клавиш
Алгоритм программной реализации логической процедуры «Инициализация» состоит из следующих шагов:
Ш а г 1. Если u=1, переход на шаг 4 .
Ш а г 2. Сохранение в ОП прежнего содержимого вектора прерываний с номером 09h.
Ш а г 3. Запись стартового адреса обработчика прерываний клавиатуры в вектор прерываний с номером 09h. Переход на шаг 5.
Ш а г 4. Восстановление прежнего содержимого вектора прерываний с номером 09h.
Ш а г 5. Возврат из процедуры.
Алгоритм обработчика прерываний клавиатуры включает шаги:
Ш а г 1. Разрешение маскируемых прерываний.
Ш а г 2. Сохранение в программном стеке содержимого регистров.
Ш а г 3. Запись в сегментный регистр DS значения, которое соответствует адресу-сегменту данных обработчика прерываний.
Ш а г 4. Чтение из порта 60h значения скан-кода.
Ш а г 5. Установка бита 7 порта 61h.
Ш а г 6. Сброс бита 7 порта 61h.
Ш а г 7. Если была отпущена клавиша CapsLock, то инвертирование флага статуса клавиатуры. Переход на шаг 14.
Ш а г 8. Если было отпускание клавиши, то переход на шаг 14.
Ш а г 9. Если буфер полон, то переход на шаг 14.
Ш а г 10. Перекодировка скан-кода в символ ASCII.
Ш а г 11. Запись символа ASCII в буфер драйвера.
Ш а г 12. Вывод «эха» полученного символа на экран.
Ш а г 13. Если полученный символ является символом «возврат каретки» (этот символ есть результат нажатия <Enter>), то запись в буфер и вывод на экран дополнительного символа «перевод строки».
Ш а г 14. Выдача команды в программируемый контроллер прерываний для разрешения менее приоритетных прерываний.
Ш а г 15. Восстановление содержимого регистров из стека.
Ш а г 16. Возврат из прерывания в прерванную программу.
Дополнение к шагам 5 и 6. Порт 61h используется не только клавиатурой (она использует только бит 7), но и другими устройствами. Поэтому к моменту завершения шага 6 содержимое этого порта должно быть тем же, что было до начала шага 5.
Дополнение к шагам 7 и 10. Большинству клавиш соответствует не один, а два символа. Например, одна и та же клавиша соответствует символам «1» и «!». Каждой большой (прописной) букве соответствует малая (строчная). Для того чтобы обработчик прерываний выполнял правильное преобразование скан-кода в код ASCII, необходимо ввести понятие “состояние клавиатуры”. В одном состоянии в буфер драйвера записывается код ASCII большой буквы, а во втором – малой. Часто состояния клавиатуры называют «нижним регистром» и «верхним регистром».
Для отслеживания состояния клавиатуры обработчик прерываний должен иметь двоичную переменную «флаг статуса клавиатуры». Для управления этим флагом рекомендуется использовать управляющую клавишу <CapsLock>. Нажатие, а затем отпускание <CapsLock> обеспечивает долговременное изменение флага статуса, которое действует до следующего нажатия этой же клавиши.
При программировании шага 10 удобно свести значения скан-кодов и соответствующих кодов ASCII в единую таблицу. Первая строка этой таблицы может иметь вид
Tabl db 02h, ‘1’, ‘!’
Строка таблицы, соответствующая пробелу:
db 39h, ‘ ‘, ‘ ‘
В данной таблице отсутствует строка, соответствующая управляющему символу CapsLock. В качестве последнего байта таблицы рекомендуется взять нулевой байт.
Шаг 11 рекомендуется реализовать в виде программной процедуры.
Алгоритм подпрограммы «Ввод символа» состоит из следующих шагов:
Ш а г 1. Сохранение в программном стеке содержимого регистров.
Ш а г 2. Если буфер пуст, то возврат в программу с соответствующим значением признака результата.
Ш а г 3. Переписка символа из буфера в регистр, используемый для передачи
символа из подпрограммы в вызывающую программу.
Ш а г 4. Увеличение указателя «взять» и уменьшение счетчика символов.
Ш а г 5. Если указатель «взять» вышел за границу буфера, то установка его на начало буфера.
Ш а г 6. Восстановление регистров из стека.
Ш а г 7. Возврат из подпрограммы с соответствующим значением
признака результата.
Предыдущий раздел | В начало | Следующий раздел |