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

Одержаний в результаті трансляції двобайтовий код засилає програмою int09h у кільцевий буфер введення, яке служить для синхронізації процесів введення даних з клавіатури і прийому їх виконуваною комп'ютером програмою. Об'єм буфера складає 16 слів, при цьому коди символів витягуються з нього в тому ж порядку, в якому вони в нього поступали. За станом буфера стежать два покажчики. У хвостовому покажчику (слово за адресою 40:1Ch зберігається адреса першого вільного осередку, в головному покажчику (40:1 Ah) - адреса найстарішого коду, прийнятого з клавіатури і ще не затребуваного програмою. Обидві адреси є зсувами відносно почала області даних BIOS, тобто числа від lEh до 3Ch. На початку роботи, коли буфер порожній, обидва покажчики - і хвостовий, і головний, указують на перший осередок буфера.

Програма int09h, сформувавши двобайтовий код, поміщає його в буфер за адресою, що знаходиться в хвостовому покажчику, після чого ця адреса збільшується на 2, указуючи знову на перший вільний осередок. Кожне подальше натиснення на яку-небудь клавішу додає в буфер черговий двобайтовий код і зміщує хвостовий покажчик.

Виконувана програма, бажаючи одержати код натиснутої клавіші, повинна звернутися для цього до яких-небудь системних засобів функціям введення з клавіатури DOS (переривання 21h) або BIOS (переривання 16h). Системні програми за допомогою драйвера клавіатури (точніше кажучи, об'єднаного драйвера клавіатури і екрану, так. званого драйвера консолі) прочитують з кільцевого буфера вміст осередку, адреса якого знаходиться в головному покажчику, і збільшує цю адресу на 2. Таким чином, програмний запит на введення з клавіатури фактично виконує прийом коду не з клавіатури, а з кільцевого буфера.

Хвостовий покажчик, переміщаючись по буферу в процесі занесення в нього кодів, доходить, нарешті, до кінця буфера (адреса 40h:3Ch). В цьому випадку під час вступу чергового коду адреса в покажчику не збільшується, а, навпаки, зменшується на довжину буфера. Тим самим покажчик повертається в початок буфера, потім продовжує переміщатися по буферу до його кінця, знову повертається в початок і так далі по кільцю. Аналогічні маніпуляції виконуються і з головним покажчиком.

Рівність адрес в обох покажчиках свідчить про те, що буфер порожній. Якщо при цьому програма поставила запит на введення символу з клавіатури, то драйвер консолі чекатиме надходження коду в буфер, після чого цей код буде переданий в програму. Якщо ж хвостовий покажчик, переміщаючись по буферу в процесі його заповнення, підійшов до головного покажчика "із зворотної сторони" (це відбудеться, якщо оператор натискає на клавіші, а виконувана зараз програма не звертається до клавіатури), прийом нових кодів блокується, а натиснення на клавіші порушує застережливі звукові сигнали.

Якщо комп'ютер не виконує ніякої програми, то активною є програма командного процесора COMMAND.COM. Активність COMMAND.COM полягає в тому, що він, поставивши запит до DOS на введення з клавіатури (за допомогою функції 0Ah переривання 21h) чекає введення з клавіатури чергової команди користувача. Як тільки в кільцевому буфері введення з'являється код символу, функція OAh переносить його у внутрішній буфер DOS, очищаючи при цьому кільцевий буфер введення, а також виводить символ на екран. При отриманні коду клавіші <Enter> (ODh) функція OAh завершує свою роботу, а командний процесор припускає, що введення команди закінчене, аналізує вміст буфера DOS і приступає до виконання введеної команди. При цьому командний процесор працює практично лише з молодшими половинами двобайтових кодів символів, саме, з кодами ASCII.