Управление символьными устройствами
Работу MS-DOS с символьными устройствами интереснее всего рассмотреть на примере клавиатуры. Путь, который проходят при этом вводимые данные, схематично показан на рис. 2‑6.
Рис. 2‑6
Когда пользователь нажимает клавишу, клавиатура переходит в состояние готовности и по этому поводу посылает сигнал аппаратного прерывания Int 09h. Одновременно в порт, к которому подключена клавиатура, посылается скан-код нажатия клавиши. Этот код представляет собой однобайтовое число, означающее порядковый номер нажатой клавиши. Если клавиша долго удерживается нажатой, то через некоторое время начинается «автоповтор» – сигнал прерывания и скан-код посылаются многократно. Наконец, когда клавиша отпускается, генерируется еще одно прерывание и посылается скан-код отпускания клавиши, который отличается от кода нажатия единичным значением старшего бита. Этим практически исчерпываются аппаратные события, связанные с клавиатурой. Все остальное делается программно.
На самом деле, все происходило именно так со старой, 83-клавишной клавиатурой компьютеров IBM PC XT. Современные клавиатуры за одно нажатие умудряются послать от 1 до 4 скан-кодов подряд. Причины этого объяснять долго и не очень интересно.
Подпрограмма BIOS, обрабатывающая аппаратное прерывание от клавиатуры, должна, во-первых, запоминать текущее состояние клавиатуры: нажаты или нет «сдвиговые» клавиши Shift, Ctrl, Alt, включены или нет режимы Caps Lock, Num Lock. Во-вторых, обработчик должен с учетом этого состояния определить, какой символ хотел ввести пользователь. Одна и та же клавиша может, например, означать букву ‘Z’ прописную или строчную, русскую букву ‘Я’ прописную или строчную, а также быть частью комбинаций Ctrl+Z, Alt+Z. Соответствующий символ будет помещаться в буфер клавиатуры в виде двух байт: скан-код нажатой клавиши и ASCII-код символа. Для некоторых клавиш и комбинаций, которым не соответствует никакой ASCII-код (например, F1, Insert, Ctrl+Home, Alt+буква, à), фирма IBM разработала собственный набор «расширенных» кодов.
Буфер клавиатуры может вместить до 15 введенных символов, а при переполнении начинает противно пищать.
Программное прерывание Int 16h также обрабатывается BIOS’ом. Его назначение – удовлетворять запросы программ, обращающихся к клавиатуре. Наиболее часто используются следующие три функции этого прерывания.
· Ввод символа с ожиданием. Эта функция возвращает значение кодов очередного символа из буфера клавиатуры и удаляет этот символ из буфера. Если буфер был пуст, функция выполняет активное ожидание до тех пор, пока при обработке очередного нажатия клавиши в буфере не появится введенный символ.
· Ввод символа без ожидания. Он отличается тем, что при пустом буфере не происходит ожидания, а возвращается соответствующий признак. Без этой функции было бы невозможно запрограммировать большую часть игр.
· Опрос состояния клавиатуры. Возвращает информацию о текущем состоянии «сдвиговых» клавиш.
Прикладные программы могут вызывать либо прерывание Int 16h, либо одну из функций DOS, предназначенных для ввода символов с консоли. Следует подчеркнуть, что эти функции работают не с клавиатурой, а с устройством CON (консолью оператора), через драйвер этого устройства. Конечно, практически всегда устройство CON – это и есть клавиатура (плюс еще и экран монитора, который используется при выводе символов на консоль). Однако теоретически есть возможность написать нестандартный драйвер устройства CON, который будет брать вводимые символы, например, с удаленного терминала, через модем. Или в качестве консольного устройства можно использовать пишущую машинку, как это и делалось раньше, до широкого распространения мониторов.
Набор функций DOS для ввода с консоли довольно разнообразен. Однако ни одна из этих функций не использует особенностей клавиатуры как устройства. В частности, функции DOS не знают понятия «состояние клавиатуры». Зато набор функций включает ввод с «эхо-отображением» введенного символа на устройстве CON (т.е. на экране) или без отображения, с ожиданием или без ожидания, ввод одного символа или сразу строки (завершающейся нажатием Enter), а также ввод с предварительной очисткой буфера (чтобы давно завалявшиеся там символы не были случайно введены как ответ на задаваемый программой вопрос).
Кратко рассмотрим работу с другими символьными устройствами.
Монитор не посылает сигналов прерываний и вывод на него выполняется не через порт, а путем записи данных в область видеопамяти. Имеющееся программное прерывание BIOS практически используется для переключения видеорежима (текстовый или графический, число цветов, число точек на экране) и для изменения вида и положения курсора текстового режима. Вывод символов через BIOS достаточно медленный и используется в основном для небольших текстовых сообщений. В графических режимах BIOS работает неприемлемо медленно, ибо он за каждый вызов прерывания может вывести только одну точку. Серьезные программы работают с видеопамятью напрямую. Функции DOS для вывода на консоль не имеют даже права использовать такую специфику монитора, как управление курсором и выбор цвета, ведь они работают с устройством CON, которое может оказаться и пишущей машинкой.
Для принтера BIOS предлагает возможность проверки состояния устройства (в частности, находится ли принтер в состоянии готовности) и вывода одного символа с опросом готовности. В то же время, DOS, кроме убогой функции вывода одного символа с ожиданием на устройство PRN, позволяет использовать системную программу PRINT, которая умеет выводить файлы в фоновом режиме, не мешая одновременно выполнять другие программы. Эта программа работает с аппаратными прерываниями в обход BIOS.
Про работу с последовательным портом можно сказать почти то же самое, что про работу с принтером. Отличие в том, что порт может работать и на ввод данных. Один из самых верных способов «подвесить» систему навечно – запросить ввод символа из COM-порта с ожиданием через BIOS или DOS, если на вход порта не поступают никакие данные. Практически всегда работа с COM-портом ведется с помощью нестандартных драйверов, работающих по прерываниям.
Мышь вообще не является стандартным устройством для компьютеров – потомков IBM PC. BIOS ничего не знает о существовании мышей. Драйверы мыши мало похожи на другие драйверы MS-DOS. Они позволяют опрашивать текущее положение мыши и состояние кнопок, однако более удобной для приложений является возможность задать с помощью драйвера собственную процедуру обработки прерываний от мыши. Эта процедура должна определять, в каком месте экрана был курсор при нажатии кнопки мыши, какой элемент управления (кнопка, пункт меню, полоса прокрутки и т.п.) находится в этой точке, и только потом – какое действие следует предпринять при щелчке мыши на этом элементе. Слишком много черновой работы, которую более современные ОС (например, Windows) берут на себя.
Дата добавления: 2015-09-07; просмотров: 998;