Курсовая работа: Низькорівневе програмування контроллера клавіатури
Якщо на клавіатурі натискувала одна з клавіш, яким не відповідає ніякий код ASCII, то функція 01h повертає в регістрі AL значення 0. У цих випадках слід ще раз викликати ту ж функцію, тоді буде виданий розширений код даної клавіші або комбінації клавіш.
Функція 08h працює аналогічно 01h, за винятком того, що не виконується эхо-отображение введеного символу.
Функція 07h працює аналогічно 01h, за винятком того, що не виконується эхо-отображение і не перевіряється натиснення Ctrl/C.
Функція 06h може виконувати як введення з клавіатури, так і вивід на екран. Якщо у момент виклику регістр DL містить значення 0ffh, то дана функція виконує введення без очікування. Якщо буфер не порожній, то прапор нуля ZF скидається в 0, а код символу з буфера заноситься в AL. Якщо ж буфер порожній, то встановлюється ZF=1, при цьому значення в AL не грає ролі. Таким чином, ця функція не чекає, поки натискуватиме клавіша, а відразу видає якийсь результат. Функція 06h не виконує эхо-отображения і не перевіряє натиснення Ctrl/C.
Функція 0Вh не виконує введення символу, а тільки перевіряє, чи є символи в буфері. Якщо є, то встановлюється AL=0ffh, якщо немає, то AL=00h. Виконується також перевірка на Ctrl/C.
Функція 0Аh виконує введення рядка, що буферизує, з клавіатури. При цьому символи вводяться один за іншим, як при багатократному застосуванні функції 01h, до тих пір, поки не буде введений код 0dh ( код клавіші "Enter" ), що завершує рядок. В ході введення рядка користувач може редагувати рядок, і зокрема - використовувати "забій". При введенні виконується також перевірка на Ctrl/C.
При виклику функції 0Аh потрібний, щоб в регістрі DX містив зсув ( у сегменті даних ) області пам'яті ( буфера ), в яку система помістить введений рядок. У першому байті цього буфера має бути записана його довжина, тобто максимальне число символів ( включаючи 0dh ), яке можна записати в буфер. Ця довжина має бути принаймні на 2 менше, ніж число зарезервованих байт. Після закінчення введення рядка функція поміщає в другий байт буфера дійсне число введених символів ( не рахуючи 0dh ), а зачинаючи з третього байта буфера розміщуються введені символи. Останнім завжди буде код 0dh.
Функція 0Сh спочатку очищає буфер клавіатури ( тобто "забуває" попередні натиснення клавіш ), а потім виконує будь-яку з функцій 01h, 06h, 07h, 08h або 0Аh. Номер цієї функції задається в регістрі AL.
Розглянемо приклади роботи з клавіатурою. У головній програмі для "відкриття" клавіатури потрібно викликати OpenKeyboard з параметром, який говорить, чи потрібно блокувати обробник BIOS.
void irq_keyboard(void)
{
char scan,tmp;
/* отримуємо сканкод */
scan = inb(0x60);
/* проводимо його обробку */
...
/********************************/
/* ось ця частка мені не зрозуміла */
/********************************/
/* через порт 0x61 відключають клавіатуру */
tmp = inb(0x61);
outb(tmp|0x80,0x61);
/* потім назад включають */
outb(tmp,0x61);
/********************************/
/* скидання контроллера переривань */
outb(0x20,0x20);
}
Якщо встала необхідність прямої роботи з клавіатурою, застосовується наступний метод: на 9-е переривання встановлюється "латка", яка насамперед обробляє стан порту, а потім, за бажання, передає управління старому обробникові клавіатури BIOS. Якщо управління BIOS не передається, необхідно не забути команду виведення значениа 20h а порт 20h, щоб вирішити наступні переривання від клавіатури.