Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2392_Смирнова_ЛР4_ЭВМ.docx
Скачиваний:
2
Добавлен:
05.12.2024
Размер:
78.03 Кб
Скачать

Буфер клавиатуры

Буфер BIOS для записи кодов клавиш занимает 32 байта оперативной памяти с адреса 40:lEh до 40:3Eh. Запись информации в буфер выполняет ISR BIOS прерывания 9, чтение - функции ISR BIOS прерывания 16h. Буфер клавиатуры рассчитан на 15 нажатий клавиш, генерирующих двухбайтовые коды и поэтому имеет 30 байт для кодов клавиш и еще два дополнительных байта, которые резервируются под двухбайтовый код для клавиши ENTER.

Буфер организуется как кольцевая очередь, доступ к которой осуществляется с помощью указателя «головы» (head pointer), адрес которого 40:1Ah, и указателя «хвоста» (tail pointer), адрес которого 40:1Ch. Указатель "хвоста" задает смещение до слова, где будет записан обработчиком прерывания 9 код буферизуемой клавиши, т.е. первое свободное слово буфера. Указатель "головы" задает смещение слова, которое будет возвращено запросу буферизованного ввода с клавиатуры, сделанного операционной системой или BIOSoм.

При каждом нажатии клавиши, для которой генерируется двухбайтовый код, ISR BIOS прерывания 9, используя текущее значение указателя "хвоста", записывает в память образованный двухбайтовый код. После этого указатель "хвоста" увеличивается на 2. Если указатель "хвоста" перед доступом к буферу указывает на верхнюю границу буфера (на слово 40:3Eh), указатель после записи в буфер "перепрыгивает" на начало буфера, т.е. ему присваивается значение 40:1Eh. Поэтому значение указателя "хвоста" может быть и меньше значения указателя "головы". Это значит, что указатель "хвоста" "перескочил" назад к нижней границе буфера. Когда указатель "хвоста" догонит указатель "головы", наступит переполнение буфера. В этом случае указатель "хвоста" задает смещение до "холостой" позиции. Каждое новое нажатие клавиши игнорируется BIOS-обработчиком; код клавиши не помещается в буфер, и звучит сигнал динамика.

Прерывание 16h - это прерывание, которое обеспечивает доступ к функциям BIOS драйвера клавиатуры. С помощью этого прерывания можно считывать коды нажатых клавиш, проверять состояние буфера клавиатуры, устанавливать режимы работы клавиатуры и т.д. Прерывание 16h имеет несколько функций, которые выбираются с помощью регистра AH. Вот некоторые из них:

  • Функция 00h - считывает код нажатой клавиши из буфера клавиатуры. Если буфер пуст, то программа ждет, пока не будет нажата клавиша. Возвращает ASCII-код клавиши в регистре AL и скан-код клавиши в регистре AH.

  • Функция 01h - проверяет, есть ли код клавиши в буфере клавиатуры. Если есть, то возвращает флаг ZF = 0 и код клавиши в регистрах AL и AH. Если нет, то возвращает флаг ZF = 1 и не изменяет регистры AL и AH.

  • Функция 02h - возвращает состояние клавиатурных индикаторов (Caps Lock, Num Lock, Scroll Lock) в регистре AL. Каждый бит регистра AL соответствует определенному индикатору: бит 7 - Insert, бит 6 - Caps Lock, бит 5 - Num Lock, бит 4 - Scroll Lock, бит 3 - Alt, бит 2 - Ctrl, бит 1 - левый Shift, бит 0 - правый Shift. Если бит равен 1, то индикатор включен, если 0, то выключен.

  • Функция 03h - устанавливает состояние клавиатурных индикаторов в соответствии с регистром AL. Формат регистра AL такой же, как и в функции 02h.

  • Функция 05h - записывает код клавиши в буфер клавиатуры. Принимает ASCII-код клавиши в регистре AL и скан-код клавиши в регистре AH. Возвращает флаг CF = 0, если запись успешна, и флаг CF = 1, если буфер переполнен.

Соседние файлы в предмете Организация ЭВМ