Використання BIOS для роботи з клавіатурою

Переривання INT 09h є апаратним перериванням, яке викликається по лінії запиту переривання IRQ1 всякий раз коли заповнюється вихідний буфер контроллера клавіатури, тобто коли поступає байт від клавіатури. Обробник даного переривання прочитує scan-код з порту 60h, перетворить scan-код в код доступний BIOS або виконує спеціальну функцію (виклик деяких інших переривань, наприклад INT 05h після натиснення Prt Scr і ін.). Обробник переривання поміщає для більшості клавіш відповідний їм в BIOS двобайтовий код в спеціальну область пам'яті - буфер клавіатури (див. табл.2). Коди деяких клавіш обробник не поміщає в буфер, інформація про їх натиснення або віджимання записується в байти стану клавіатурРозгледимо докладніше спосіб формування двобайтового коду, INT, що поміщається, 09h в буфер клавіатури. Scan-код, що отримується обробником переривання з клавіатури, відповідає деякій клавіші або комбінації клавіш. BIOS використовує для кодування інформації стандарт кодування ASCII, вживаний для всіх пристроїв, що використовують посимвольний обмін. Таблиця 3 містить коди ASCII. Разом із звичайними символами, застосовуються символи, що управляють (наприклад, CR - повернення каретки, LF - перехід на наступний рядок і т. п.). Кожному ASCII-коду BIOS ставить у відповідність деякий scan-код, що приймається з клавіатури. Якщо натискує клавіша або комбінація клавіш, якою відповідає ASCII-код, обробник переривання INT 09h поміщає в буфер scan-код клавіші і відповідний ASCII-код. Проте, навіть для 83-клавішної клавіатури IBM РС XT, є значна кількість комбінацій клавіш (і відповідно scan-кодов), що не мають відповідних еквівалентів ASCII. До них відносяться клавіші управління курсором, функціональні клавіші і ін. Для подібних клавіш в буфер поміщається спеціальний байт розширеного коду, а другий байт дорівнює нулю. Таблиця 4 містить містить розширені коди деяких клавіш. Більшість нових клавіш і їх комбінацій для 101-клавішної клавіатури (F11,F12 і ін.) кодуються аналогічним чином: для них використовуються незадіяні раніше розширені коди. Проте, для лави клавіш ("сірі" клавіші управління курсором, Delete, End і ін.), продубльованих на 101-клавішній клавіатурі, і їх комбінацій з іншими клавішами, використовується розширений код їх "оригіналів", а другий байт для таких кодів рівний E0h.

При натисненні комбінації клавіш Ctrl-Break переривання INT 09h встановлює ознака запиту по Ctrl-Break (байт 471h) і викликає переривання BIOS INT 1Bh, яке зазвичай перехоплюється MS DOS. Це переривання устанавлиает прапор CTRL-C, після чого управління передається INT 23h, яке перевіряє цей прапор, і в разі його установки викликає дострокове припинення виконання програми. Деякі функції MS DOS перевіряють натиснення CTRL-C і викликають INT 23h. Таким чином, Ctrl-Break є прапором BIOS, а CTRL-C - прапором MS DOS. Ці прапори перевіряються при виконанні функцій 01h-0Ch переривання MS DOS. Функція 33h переривання MS DOS дозволяє розповсюдити контроль по Ctrl-Break на всі функції ввода/вывода.

Переривання BIOS INT 16h дозволяє працювати з клавіатурою на декілька вищому рівні, ніж INT 09h, і нижчому рівні, ніж функції MS DOS. Фактично всі описані нижче функції DOS використовують в своїй роботі переривання 16h, проте програміст може використовувати його і безпосередньо, якщо в цьому є необхідність.

Залежно від значення в регістрі AH переривання INT 16h може виконати одну з наступних функцій.

Функція 00h виконує читання символу з буфера клавіатури. Якщо буфер порожній, функція чекає натиснення клавіші. Якщо клавіша натискує, значення коду заноситься в регістр AX. Функція повертає в Аl ASCII-код, а в AH - scan-код якщо це можливо. Інакше в AH повертається розширений код, а AL дорівнює нулю. Функція не обробляє натиснення клавіш, код яких не поміщається в буфер перериванням INT 09h (Ctrl, Shift і тому подібне), а також додаткових клавіш 101-клавішної клавіатури.

Функція 01h перевіряє, чи є символи в буфері клавіатури. Якщо є, то прапор нуля скидається (ZF=0), якщо немає

- прапор встановлюється (ZF=1). За наявності символу його код заноситься в регістр AX, в тому ж вигляді, як для функції 00h, проте з буфера код не віддаляється. Таким чином, якщо після цього ще раз викликати ту ж функцію, то вона ще раз прочитає той же символ.

Функція 02h записує в регістр AL перший з чотирьох байтів стану клавіатури.

Функції 10h і 11h аналогічні функціям 00h і 01h, але дозволяють обробляти також і додаткові клавіші 101-клавішної клавіатури.

Функція 12h виконує дії, аналогічні 02h, але крім того поміщає в AH другий байт стану клавіатури (див. табл.1).

Функція 03h дозволяє встановити затримку і частоту повторення для клавіатури, а функція 05h - помістити двобайтовий код в буфер клавіатури.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: