Лекции по Вычислительным машинам, системам и сетям   

6. Приложение

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

Буфером клавиатуры называются 32 байта памяти, расположенные в области переменных BIOS, начиная с адреса 0041eh и заканчивая адресом 0043ch. Буфер может накапливать до 15 нажатий клавиш, при этом для каждой клавиши в буфере отводится слово, младший байт которого содержит ASCII-, а старший – СКЭН-коды нажатой клавиши.

Буфер клавиатуры называется кольцевым, поскольку представляет собой циклическую очередь, реализующую процедуру FIFO (первый пришел – первый ушел). Это означает, что в буфере нет определенной ячейки памяти, с которой начинается его заполнение. Зато имеются понятия «голова буфера» и «хвост буфера».

Головой буфера считается слово, в которое занесены коды первой нажатой клавиши, а хвостом – слово за ячейкой, в которой находятся коды последней нажатой клавишей (рис. 6.1)

0041eh

 

Голова

   

Хвост

 

0043ch

Своб.

Своб

Код

Код

Код

Своб

Своб

Своб

Рис. 6.1

.Для того чтобы с буфером можно было работать, в памяти выделены еще два слова с адресами 0041ah и 0041ch. В первой из них хранится смещение ячейки, являющейся в настоящий момент головой буфера, относительно адреса 00400h.

Принято говорить, что в ячейке 0041ah хранится указатель головы буфера. Соответственно, в ячейке 0041ch хранится указатель хвоста. Например, последовательно нажаты две клавиши, коды которых попали в буфер, который до этого был пуст. При этом код первой клавиши попал в ячейку 00432h, а код второй – в ячейку 00434h. Тогда указатель головы (содержимое ячейки 0041ah) будет равен 32h, а указатель хвоста (содержимое ячейки 0041ch) – 36h.

Когда  нажимаем  клавишу  на  клавиатуре, обработчик 9-го прерывания заносит его код в буфер по адресу, на который указывает указатель хвоста, а затем прибавляет к указателю хвоста двойку. Указатель хвоста всегда указы-вает на первую свободную ячейку буфера.

Когда адресное пространство, отведенное под буфер, заканчивается, указатель хвоста устанавливается на начало буфера (двойка в этом случае не прибавляется), и ввод клавиш может быть продолжен. Например, пусть указатель хвоста равен 3ch (установлен на последнее слово буферной области). Тогда при нажатии клавиши ее код попадет в ячейку 0043ch, а в указатель хвоста будет записано новое значение 1eh (установлен на первое слово буферной области). Именно из-за такой организации буфер и называется кольцевым.

Когда программа считывает код клавиши из буфера, этот код берется из ячейки, на которую установлен указатель головы, после чего к этому указателю надо прибавить двойку (или записать в него 1eh, если буферная область кончилась).

При вводе клавиши буфер может оказаться заполнен, при этом вводимый символ игнорируется и выдается гудок на встроенный динамик. Буфер является полным, когда указатель хвоста на 2 меньше чем указатель головы. Исключением является ситуация, когда указатель головы установлен на начало буфера (равен 1eh). В этом случае буфер полон, если указатель хвоста установлен на конец буфера (равен 3ch).

Буфер считается пустым, если указатель головы равен указателю хвоста. Таким образом, чтобы очистить буфер можно, например, взять информацию из указателя хвоста и записать ее в указатель головы.

Два байта, расположенные в ячейках памяти 00417h и 00418h, называются байтами состояния клавиатуры. Они имеют следующий формат:

Байт 417h      бит 0 = 1 – нажат правый Shift;

бит 1 = 1 – нажат левый Shift;

бит 2 = 1 – нажат Ctrl (любой);

бит 3 = 1 – нажат Alt (любой);

бит 4 = 1 – включен ScrollLock;

бит 5 = 1 – включен NumLock;

бит 6 = 1 – включен CapsLock;

бит 7 = 1 – включен режим Ins;

Байт 418h      бит 0 = 1 – нажат левый Ctrl;

бит 1 = 1 – нажат левый Alt;

бит 2 = 1 – нажат SysReg;

бит 3 = 1 – установлен режим «ПАУЗА»;

бит 4 = 1 – нажат ScrollLock;

бит 5 = 1 – нажат NumLock;

бит 6 = 1 – нажат CapsLock;

бит 7 = 1 – нажат Ins.



*****

© 2009-2017 Банк лекций siblec.ru
Лекции для преподавателей и студентов. Формальные, технические, естественные, общественные, гуманитарные, и другие науки.