Предыдущий раздел УПРАВЛЕНИЕ УСТРОЙСТВАМИ С ПРЕРЫВАНИЯМИ Следующий раздел

21.4.3. Алгоритмы программных модулей

Алгоритмы программных модулей драйвера клавиатуры имеют много общего с алгоритмами программных модулей драйвера считывателя перфоленты (см. п.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. Возврат из подпрограммы с соответствующим значением   

признака результата.

 


Предыдущий раздел В начало Следующий раздел