Дії BIOS ISR при натисненні та відпусканні однієї і тієї ж  клавіші різні. Клавіші в залежності від алгоритму обробки їх скен-коду можна розділити на:

       1)шифт-клавіші (Right-Shift, Left-Shift, Alt, Ctrl);

       2)тригерні клавіші (NumLock, ScrollLock, CapsLock);

       3)клавіші з буферизацією розширеного коду;

       4)спеціальні клавіші (клавіша PrnScr, комбінація Alt-Ctrl-Del, комбінація Ctrl-C (Ctrl-Break)).

       За кожною шифт- або тригерною клавішею закріплений свій біт в комірках пам’яті по адресам 40:17h і 40:18h (табл..7.1). При кожному натисненні чи відпусканні шифт-клавіші ISR BIOS інвертує відповідний біт. Таким чином, поточний стан біту шифт-клавіші говорить про те, чи затиснена клавіша в даний момент часу чи відпущена. За тригерними клавішами закріплені два біта: один із них інвертується тільки при натисненні клавіші(„фіксує” стан „Вкл/Викл”), другий – при натисненні і відпусканні, відслідковує поточний стан клавіші.

       Поточний стан шифт- і тригерних клавіш використовується BIOS-обробником переривання від клавіатури при визначенні правил перетворення скен-кодів від других клавіш. Більшість клавіш і їх комбінації з шифт-клавішами – це клавіші з буферизацією розширеного коду: при їх натисненні в спеціальний буфер пам’яті поміщається двобайтовий код, що називається BIOS- кодом клавіші. Молодший байт цього коду доівнює ASCII-коду символу, або нулю. Старший байт дорівнює скен-коду клавіатури, або так званому розширеному скен-коду. Комбінація ASCII- код / скен - код клавіатури” генерується с слідуючих випадках:

1)      якщо затиснута клавіша клавіатури, помічена символом, що входить в ASCII-таблицю (що буде далі називатися ASCII- клавішею). Так як великі і малі літери мають різний ASCII-код, при генерації BIOS- коду враховується поточний стан тригерної клавіші CapsLock і клавіші Shift.

Табл. 7.1. Стан шифт- і тригерних клавіш

Біт

Стан шифт- і тригерних клавіш

 

0

1

2

3

4

5

6

7

 

Байт 40:17h

Затиснута і не відпущена клавіша Right Shift

Затиснута і не відпущена клавіша Left Shift

Затиснута і не відпущена клавіша Ctrl

Затиснута і не відпущена клавіша Alt

Зафіксований скролінг екрану (ScrollLock -включений)

Ввімкнена цифрова клавіатура (NumLock - ввімкнений)

Зафіксований верхній регістр (CapsLock - ввімкнений)

Ввімкнений режим вставки (хоча клавіша Ins не являється тригерною, BIOS- обробник фіксує кожне її натиснення, А код клавіші поміщає її в буфер клавіатури)

 

0

1

2

3

4

5

6

7

 

 

Байт 40:18h

Затиснута і не відпущена клавіша LeftCtrl

Затиснута і не відпущена клавіша LeftAlt

Затиснута клавіша System Request (System)

Ввімкнений режим Pause (Ctrl-NumLock)

Затиснута і не відпущена клавіша ScrollLock

Затиснута і не відпущена клавіша NumLock

Затиснута і не відпущена клавіша CapsLock

Затиснута і не відпущена клавіша Ins

 

 

Примітка.

1.Біти 0-2 в байті 40:18h приміняються до систем з розширеною клавіатурою.

2.Інформація дана при установці відповідного біту.

 

Наприклад, нехай затиснута клавіша „С”, а клавіша CapsLock „вимкнена” (біт 6 байта 0417h дорівнює 0). Якщо в момент генерації BIOS- коду Right-Shift абоLeft-Shift відпущені (біти 0 або 1 байту 00417h встановлені на 0), генерується ASCII- код прописної латинської літери „с”. Якщо перед натисненням клавіші „С” була затиснена і не відпущена клавіша Right-Shift або Left-Shift (біти 0 або 1 байту 00417h встановлені в одиницю), ISR BIOS генерує ASCII-код, відповідний до прописної латинської літери „С”. Якби перед натисненням був зафіксований верхній регістр (біт 6 байту 00417h дорівнює 1), при відсутності натиснення Shift генерувався би ASCII- код прописної латинської літери „С”, а при затисненій і не відпущеній Shift- код строкової літери;

2)      якщо затиснені деякі із ASCII- клавіш в комбінації з затисненою і не відпущеною клавішею Ctrl, а також при натисненні клавіш BackSpace, Enter (Ввід), Tab і Esc (Ключ). В цьому випадку молодший байт BIOS- коду клавіші дорівнює одному з управляючих ASCII-кодів. Це ASCII- коди із значеннями 00-31, деякі з них не входять в число символів, що друкуються, а використовуються для управлінням периферійними пристроями. Наприклад, натиснення клавіші ENTER породжує управляючий символ Carriage Return (Повернення каретки), натиснення клавіші TAB породжує управляючий символ горизонтальної табуляції, комбінація Ctrl-L- управляючий символ Form Feed (Перевід форми), комбінація Ctrl-B управляючий символ Bell (Дзвінок). Натиснення комбінації Ctrl-M відповідає також управляючому символу  Carriage Return, але повний BIOS- код цієї клавіші рівний 13/50, а в випадку натиснення клавіші ENTER- 13/28.

Двохбайтовий BIOS- код типу „0/розширений скен-код ” генерується і записується в буфер клавіатури при натисненні клавіш F1-F12, Ins, Del, клавіш управління курсором, Home, Up, PgUp, Left, Right, End, Down, PgDn ті їх комбінації клавіш  з клавішами Alt, Ctrl, Shift, а також при натисненні комбінації Alt-ASCII- клавіша. Значення розширеного скен-коду визначається технічною документацією BIOS. Правила BIOS такі, що розширений скен-код и скен-код від клавіатури не співпадають.

Деякі натиснення клавіш оброблюються ISR BIOS особливим чином. До їх числа відносяться:

1)      клавіша PrnScr, при натисненні котрої ISR BIOS виконує програмне переривання 5;

2)      комбінація Alt-Ctrl-Del; виявивши таку комбінацію, ISR BIOS передає управління програмі початкового завантаження. Ця програма також входить в склад BIOS;

3)      комбінація Ctrl-C (Ctrl-Break);ISR BIOS записує по абсолютній адресі пам’яті 00417h значення 80h. Воно використовується як прапор, що сигналізує про бажання користувача зупинити виконання поточної програми. Значення цього прапору провіряють при своєму виконанні функції MS-DOS,що працює з файлами stdin, stdout, stdprn і stdaux. Якщо прапор встановлено, такі функції генерують переривання 23h (детальніше про це див. в п.5.1.3).

Особливим чином оброблюється так званий Alt- ввід. Якщо натискується і утримується затисненою клавіша Alt и на цифровій клавіатурі набираються цифри, то після відпусканні клавіші Alt в буфер клавіатури поміщується двохбайтовий код, старший байт рівний нулю, а молодший байт утримує набраний цифрами код. Якщо набраний код більше 256, молодший байт дорівнює залишку від ділення набраного коду на 256. Більшість прикладних програм оброблюють ASCII- коди, генеровані простим натисненням клавіші і Alt- вводом одинаково, незважаючи на різні старші байти двохбайтового коду в буфері клавіатури. Наприклад, при натисненні клавіші “Z” в буфер клавіатури записується “ASCII- код /скен-код”: 90/44, а при натисненні Alt-90 – “ASCII- код/0”: 90/0. Altввід дуже зручний для вводу ASCII- символів, що не мають відповідних клавіш, наприклад символів псевдографіки.