Управління символьними пристроями

Роботу MS-DOS з символьними пристроями цікавіше за все розглянути на прикладі клавіатури. Шлях, який проходять при цьому дані, що вводяться, схематично показаний на рис. 2-6.

 

Рис. 1‑6

 

Коли користувач натискає клавішу, клавіатура переходить в стан готовності і з цього приводу посилає сигнал апаратного переривання Int 09h. Одночасно в порт, до якого підключена клавіатура, надсилається скан-код натискання клавіші. Цей код являє собою однобайтове число, що означає порядковий номер натиснутої клавіші. Якщо клавіша довго утримується натиснутою, то через деякий час починається «автоповтор» - сигнал переривання і скан-код надсилаються багаторазово. Нарешті, коли клавіша відпускається, генерується ще одне переривання і надсилається скан-код відпускання клавіші, який відрізняється від коду натискання одиничним значенням старшого біта. Цим практично вичерпуються апаратні події, пов'язані з клавіатурою. Все інше робиться програмно.

Насправді, все відбувалося саме так зі старою, 83-клавішною клавіатурою комп'ютерів IBM PC XT. Сучасні клавіатури за одне натискання примудряються надіслати від 1 до 4 скан-кодів поспіль. Причини цього пояснювати довго і не дуже цікаво.

Підпрограма BIOS, обробна апаратне переривання від клавіатури, повинна, по-перше, запам'ятовувати поточний стан клавіатури: натиснуті чи ні «сдвіговиє» клавіші Shift, Ctrl, Alt, включені чи ні режими Caps Lock, Num Lock. По-друге, обробник повинен з урахуванням цього стану визначити, який символ хотів ввести користувач. Одна і та ж клавіша може, наприклад, означати лiтеру '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) беруть на себе.