Клавиатура

Пользователь вводит информацию в основном с помощью клавиатуры и мыши, поэтому давайте их и рассмотрим. На персональных компьютерах клавиатура содержит микропроцессор, который обычно через специализированный последовательный порт обменивается данными с микросхемой контроллера, расположенной на системной плате (хотя сейчас все чаще клавиатура подключается к порту USB). Одно прерывание генерируется при нажатии клавиши, а второе — сразу же, как только она будет отпущена. По каждому из этих клавиатурных прерываний драйвер клавиатуры извлекает информацию о том, что именно произошло, пользуясь при этом портом ввода-вывода, связанным с клавиатурой. Все остальное происходит благодаря программному обеспечению и практически не зависит от аппаратуры. Основной материал всей остальной части этого раздела будет лучше восприниматься, если представлять себе ввод команд в окне оболочки (или в интерфейсе командной строки). Именно так обычно и работают программисты. А графические интерфейсы будут рассмотрены чуть позже.

Программное обеспечение клавиатуры

Число, фигурирующее в порте ввода-вывода, является номером клавиши, который называется скан-кодом (не следует его путать с кодом ASCII). Клавиатуры имеют не более 128 клавиш, поэтому для представления номера клавиши хватает семи бит. Восьмой бит устанавливается в 0, когда клавиша нажимается, и в 1, когда она отпускается. Состояние каждой клавиши (нижнее или верхнее ее положение) должен отслеживать драйвер клавиатуры.

К примеру, когда нажата клавиша А, ее скан-код (30) помещается в регистр ввода-вывода. Драйвер должен определить, в режиме какого регистра, верхнего или нижнего, работает клавиатура, в каком именно сочетании нажата эта клавиша, CTRL+A, ALT+A, CTRL+ALT+A или в каком-нибудь другом. Поскольку драйвер может различить, какая клавиша была нажата, но еще не отпущена (например, SHIFT), у него вполне достаточно информации для успешной работы. К примеру, такая последовательность работы на клавиатуре:

Нажать SHIFT, нажать А, отпустить А, отпустить SHIFT будет означать А в верхнем регистре. Но такая последовательность:

Нажать SHIFT, нажать А, отпустить SHIFT, отпустить А также будет означать А в верхнем регистре. Хотя при таком клавиатурном интерфейсе все возлагается на программное обеспечение, он имеет исключительно гибкий характер. К примеру, пользовательской программе может быть интересно, где вводилась цифра — на верхнем ряду клавиатуры или на дополнительной цифровой клавиатуре, расположенной сбоку. В принципе, драйвер может предоставить и такую информацию.

Для драйвера могут быть приняты два основных подхода. Первый из них ограничивает работу драйвера восприятием входящей информации и передачей ее на более высокий уровень без всяких изменений. Программа чтения с клавиатуры получает необработанную последовательность ASCII-кодов. (Предоставлять пользовательским программам скан-коды было бы слишком примитивным решением, к тому же находящимся в сильной зависимости от используемой клавиатуры).

Для драйвера могут быть приняты два основных подхода. Первый из них ограничивает работу драйвера восприятием входящей информации и передачей ее на более высокий уровень без всяких изменений. Программа чтения с клавиатуры получает необработанную последовательность ASCII-кодов. (Предоставлять пользовательским программам скан-коды было бы слишком примитивным решением, к тому же находящимся в сильной зависимости от используемой клавиатуры)

Этот подход хорошо сочетается с потребностями таких сложных экранных редакторов, как emacs, которые позволяют пользователю привязывать произвольное действие к любому символу или последовательности символов. Но это означает, что если пользователь наберет dste вместо date, а затем исправит ошибку, нажав три раза на клавишу удаления (backspace) и набрав ate, и завершит все это вводом символа возврата каретки, пользовательская программа получит все 11 введенных ASCII-кодов: dste—ate CR.

Подобная детализация нужна не всем программам. Зачастую им нужен просто исправленный ввод, а не точная последовательность, в которой он был произведен.