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

воскресенье, 25 апреля 2010 г. Автор: Vadim

 

Буфер клавиатуры имеет объем 32 байта и располагается в памяти начиная с адреса 0040:001E. Он может накапливать до 15 нажатий на клавишу, независимо от того, являются ли они однобайтными кодами ASCII или двухбайтными расширенными кодами - буфер отводит по два байта для каждого нажатия клавиши (последнее нажатие, которое может быть максимально 16-м по счету, зарезервировано для клавиши <Enter>, которая разрешает исполнение введенной с клавиатуры команды для командного процессора COMMAND.COM). Для однобайтных кодов первый байт содержит код ASCII, а второй - скан-код клавиши. Для расширенных кодов первый байт содержит 0, а второй номер расширенного кода. Этот номер обычно совпадает со скан-кодом клавиши, но не всегда, поскольку некоторые клавиши могут комбинироваться с клавишами сдвига для генерации различных кодов.

Буфер устроен как циклическая очередь, которую называют также буфером FIFO (первый вошел - первым ушел). Однако не имеется определенной ячейки памяти, в которой находилось бы всегда начало строки в буфере. Вместо этого два указателя хранят позиции головы и хвоста строки символов, находящейся в буфере в текущий момент. Указатель головы указывает на позицию, занятую первым символом в буфере, а указатель хвоста - на позицию, следующую за последним символом (т.е. на первую свободную). Новые нажатия клавиш запасаются в позициях, на которые указывает указатель хвоста (в более старших адресах памяти), и соответственно обновляется указатель хвоста. После того, как израсходованы старшие адреса в буфере, новые символы начинают вставляться в самые младшие ячейки буфера; поэтому возможны ситуации, когда хвост буфера имеет меньший адрес, чем голова. После того как буфер заполнен, новые вводимые символы игнорируются, при этом обработчик прерываний клавиатуры выдает гудок через динамик. В этот момент указатель хвоста указывает на ячейку перед головой в циклической очереди буфера (куда можно занести нажатие <Enter>). Наконец, когда оба указателя равны, то буфер пуст. Поэтому чтобы очистить буфер клавиатуры, достаточно установить указатели но одно и тоже значение. На рис.2 показаны некоторые возможные конфигурации данных в буфере.

Указатели на голову и хвост расположены по адресам 0040:001A и 0040:001C, соответственно. Хотя под указатели отведено 2 байта, используется только младший байт. Значения указателей меняются от 1Eh до 3Ch, что соответствует позициям буфера в области данных BIOS.

Чтобы разрешить ввод 15 символов требуется, как уже было сказано, 16-я пустая позиция, 2 байта которой всегда содержат код возврата каретки (ASCII 13) и скан-код клавиши <Enter>, равный 28. Они поступают в буфер по нажатию клавиши <Enter>. Эта пустая позиция непосредственно предшествует голове строки символов.

Предлагаю ознакомиться с аналогичными статьями:



Отправить комментарий