Структура резидентних програм. Обробка переривань від клавіатури, страница 2

Роботою клавіатури управляє спеціальна електронна схема - контроллер клавіатури. У його функції входить розпізнавання натиснутої клавіші і приміщення закріпленого за нею коду в свій вихідний регістр (порт) з номером 60h. Код клавіші, що поступає в порт, називається скан-кодом і є, по суті, порядковим номером клавіші. При цьому кожній клавіші привласнені два скан-коди, що відрізняються один від одного на 80h. Один скан-код (менший, код натиснення) засилає контроллером в порт 60h при натисненні клавіші, інший (більший, код відпуску) - при її відпуску.

Скан-код однозначно вказує на натиснуту клавішу, проте по ньому не можна визначити, чи працює користувач на нижньому або верхньому регістрі. З іншого боку, скан-коди привласнені всім клавішам клавіатури, зокрема клавішам, що управляють <Shift>, <Ctrl>, <Alt>, <Caps Lock> і ін.

Таким чином, очевидно, що визначення введеного символу повинне включати не тільки читання скан-коду натиснутої клавіші, але і з'ясування того, чи не були перед цим натиснуті, наприклад, клавіші <Shift> (верхній регістр) або <Caps Lock> (фіксація верхнього регістра). Всім цим аналізом займається програма обробки переривань від клавіатури.

Як натиснення, так і відпуск будь-якої клавіші викликає сигнал апаратного переривання, що примушує процесор перервати виконувану програму і перейти на програму системного обробника переривань від клавіатури, що входить в систему BIOS. Оскільки обробник викликається через вектор 09h, його іноді називають програмою int09h.

Програма int09h, крім порту 60h, працює ще з двома областями оперативної пам'яті: кільцевим буфером введення, що розташовується за адресами від 40h:lEh до 40h:3Dh, куди врешті-решт поміщаються коди ASCII натиснутих клавіш, і бітом прапорів клавіатури, що знаходиться за адресою 40h:17h, де фіксується стан клавіш, що управляють (<Shift>, <Caps Lock>, <Num Lock> і ін.).

Програма int09h, одержавши управління в результаті переривання від клавіатури, прочитує з порту 60h скан-коду і аналізує його значення. Якщо скан-код належить одній з клавіш, що управляють, і, до того ж, є код натиснення, в байті прапорів клавіатури встановлюється біт (прапор), відповідний натиснутій клавіші. Наприклад, при натисненні правої клавіші <Shift> у байті прапорів встановлюється біт 0, при натисненні лівої клавіші <Shift> - біт 1, при натисненні будь-якої клавіші <Ctrl> - біт 2 і т.д. Біти прапорів зберігають свій стан, поки клавіші (поодинці або в будь-яких комбінаціях) залишаються натиснутими. Якщо клавіша, що управляє, відпускається, програма int09h одержує скан-код відпуску і скидає відповідний біт в байті прапорів. Окрім стану вказаних клавіш, в байті прапорів фіксуються ще режими <Scroll Lock>, <Num Lock>, <Caps Lock> і <Insert> (див. мал. 51.1).

Комп'ютери PC/AT мають другий байт прапорів клавіатури, що знаходиться за адресою 40h:18h, і що відображає стан клавіш, що управляють, на розширеній (101-клавішної) клавіатурі. Призначення бітів цього байта приведене на мал. 51.2.

При натисненні звичайної клавіші, що не управляє, програма intOQh прочитує з порту 60h її скан-код натиснення і по таблиці трансляції скан-кодів в коди ASCII формує двобайтовий код, старший байт якого містить скан-код, а молодший код ASCII. При цьому якщо скан-код характеризує клавішу, то код ASCII визначає закріплений за нею символ. Оскільки за кожною клавішею закріплено, як правило, не менше двох символів ("а" і "А", "1" і "!", "2" і "@" і т.д.), то кожному скан-коду відповідають, як мінімум, два коди ASCII. В процесі трансляції програма int09h аналізує стан прапорів, так що якщо натиснута, наприклад, клавіша Q (скан-код 10h, код ASCII букви Q - 51h, а букви q -71h), то формується двобайтовий код 1071h, але якщо клавіша Q натиснута при натиснутій клавіші <Shift> (зміна регістра), то результат трансляції складе 1051h. Той же код 1051h вийде, якщо при натисненні клавіші Q був включений режим <Caps Lock> (заголовні букви), проте при включеному режимі <Caps Lock> і натиснутій клавіші <Shift> утворюється код 1071h, оскільки в такій ситуації клавіша <Shift> на час натиснення переводить клавіатуру в режим нижнього регістра (рядкові букви).