Графические устройства

         

Чтение введенного символа



Чтение введенного символа

При нажатии и отпускании любой клавиши контроллер клавиатуры генерирует аппаратное прерывание, при этом прекращается выполнение текущего вычислительного процесса и вызывается специальный драйвер, расположенный в ROM BIOS. Он считывает код введенного символа (scan code), преобразует его в код ASCII и помещает оба кода в специальный буфер, расположенный в области данных BIOS, начиная с адреса оооо:041Е. Последующая обработка введенного символа, включая вывод его изображения на экран, находится вне компетенции драйвера.

scan code — это просто порядковый номер нажатой или отпущенной клавиши, для его преобразования в код ASCII надо учитывать состояние одной или нескольких функциональных клавишей. Например, scan code lEh соответствует сразу четырем буквам — латинским "А", "а" и русским "Ф", "ф", в то время как ASCII коды этих букв равны, соответственно, 4ih, 6ih, 94h и OE4h.

BIOS работает только с латинским алфавитом, для ввода с русских букв нужны специальные программы русификаторы, например Keyrus, или драйверы, входящие в состав русифицированных версий Windows. Они перехватывают аппаратное прерывание от клавиатуры и формируют коды русских букв. Причем коды русских букв зависят от используемой кодовой таблицы, а их не так уж мало.

Задача может считывать введенные с клавиатуры символы как в режиме прерываний, так и путем опроса состояния буфера, расположенного в области данных BIOS. В первом случае задача должна перехватывать вектор прерывания 09, подобно тому, как это делалось для вектора ich. Нас интересует режим опроса. В этом режиме задача может самостоятельно работать с буфером клавиатуры, или вызывать специальную функцию BIOS.

Функции, обслуживающие клавиатуру, сгруппированы в прерывание int I6h (Keyboard Services). Нам нужна функция с кодом 0 (ah=o), которая опрашивает буфер клавиатуры до тех пор, пока в него не будет записан код введенного символа. После этого происходит возврат в задачу, scan code находится в регистре ah, a ASCII код — в регистре ai. Заметим, что при вводе русских букв scan code может отсутствовать (ah=o), это зависит от установленного русификатора.



Содержание раздела