Буфер BIOS для запису кодів клавіш займає 32 байти пам’яті з адреси 40:1Eh (1054 в 10 с/ с) до 40:3Eh (1086 в 10 с/ с). Запис інформації в буфер виконує ISR BIOS переривання 16h. Буфер клавіатури розрахований на 15 натиснень клавіш, що генерують двобайтові коди і тому має 30 байт для кодів клавіш і ще 2 “холостих” додаткових байти, котрі резервуються під двобайтовий код для клавіші ENTER.

  Буфер організується як кільцева черга, доступ до котрої здійснюється з допомогою покажчика “голови” (head pointer), адреса котрого 40:1Ah (1050 в 10 с/ с), і покажчика “хвоста” (tail pointer), адреса котрого 40:1Ch (1052 в 10 с/ с). Значення записані в покажчиках, рівні зміщенню від сегменту 40h. Покажчик “хвоста” задає зміщення до слова, де обробником буде записано переривання 9 код клавіші, що буферизується, тобто перше вільне слово буферу. Покажчик “голови” задає зміщення слова, що буде повернено запросу буферизованого вводу з клавіатури, зробленого операційною системою чи BIOSом.

  При кожному натисненні клавіші, для котрої генерується двобайтовий код, ISR BIOS переривання 9, використовуючи поточне значення покажчика “голови”, записує в пам’ять утворений двобайтовий код. Після цього покажчик “голови” збільшується на 2.  Якщо  покажчик “голови” перед доступом до буферу вказує на верхню границю буферу (на слово 40:3Eh), покажчик після запису в буфер “переходить” в початок буферу, тобто йому приписується значення 40:1Eh. Тому значення покажчика “хвоста” може бути і менше значення покажчика “голови”. Це значить, що покажчик “голови” “перескочив” назад до нижньої границі буфера. В цьому випадку покажчик “хвоста” задає зміщення до “холостої” позиції. Кожне нове натиснення клавіші ігнорується BIOS- обробником; код клавіші не поміщується в буфер, і звучить сигнал динаміка.

  Покажчик “голови” використовується BIOS- обробником переривання 16h, котре викликається безпосередньо із прикладної програми або функціями MS-DOS вводу з клавіатури. Якщо виконується читання буферу з руйнуванням інформації (функція AH = 0 переривання 16h), ISR читає 2 байта пам’яті по адресі, зміщення котрої задає покажчик “голови”, а сегмент дорівнює 40h. Потім ISR переривання 16h збільшує (просуває) покажчик “голови” на 2. Якщо значення покажчиків “голови” і “хвоста” рівні між собою, буфер пустий. В цьому випадку ISR переривання 16 виконує безкінечний цикл чекання, умовою котрого буде нерівність покажчиків. При натисненні клавіші, що генерує двобайтовий код, цей цикл буде перерваний BIOS- обробником переривання 9. В результаті цього покажчик “голови” просувається на 2. Після завершення ISR BIOS переривання 9 почнеться виконання  ISR BIOS переривання 16. Так як буфер не пустий, здійсниться вихід з циклу і передача в точку виклику прочитаного в буфері двохбайтового коду.

            Якщо виконується читання буферу без руйнування інформації (функція AH = 1 переривання 16h), рух покажчика “голови” не виконується, але прочитаний по цьому покажчику код передаються в точку виклику, якщо тільки буфер не пустий. Якщо буфер пустий, ISR переривання 16h не виконує цикл чекання. Замість цього прапор переносу CF встановлюється в 1, і обробник  завершує свою роботу.

         Як уже відмічалось, значення покажчиків “голови” і “хвоста” задають зміщення адрес не від початку буферу клавіатури, а від початку області параметрів BIOSа – 40:00h, що включає, мимо буферу клавіатури, ряд інших таблиць параметрів і робочих областей, необхідних для роботи BIOS. На рис. 7.1 приведені приклади пустого буферу клавіатури і буферу після вводу з клавіатури строки “TEST”, натиснення клавіш Left і F1 при умові, що поточна програма не виконувала в цей момент ввід з клавіатури.

 

Рис. 7.1. Організація буферу клавіатури:

            а- пустий буфер (значення покажчиків „голови” і ”хвоста” рівні між собою);

б- той же буфер після набору на клавіатурі строки TEST, натиснення спеціальних клавіш Left і      F1(поточна програма не виконує ввід інформації і покажчик „голови” не рухається).

Буфер клавіатури – це класичний приклад використання кільцевого буферу для організації асинхронного взаємодії двох програм по схемі „виробник - споживач”. Одна з програм (ISR BIOS переривання 9) „виробляє” інформацію або, як кажуть, являється процесом – виробником. Програма, що виконується через функцію AH= 00h переривання 16h BIOS ”використовує” інформацію або являється процесом – споживачем. Асинхронність взаємодії означає, що запис в буфер нової інформації і читання з нього виконується в випадкові,  не зв’язані між собою моменти часу. Так як виробник постійно аналізує наявність переповнення буферу, не виконується перевизначення не прочитаних ще споживачем кодів клавіатури. Другими словами, при переповненні буферу виробник блокується до того часу, поки споживач не прочитає одне або декілька слів із буферу. Якщо ж буфер пустий і виконується спроба читання інформації, функція AH-00h переривання 16h BIOS переходить до безкінечного циклу, умовою котрого являється нерівність між собою покажчиків „голови” і „хвоста”. Фактично поточна програма, що виконує ввід з клавіатури, блокується, не даючи „спожити” неіснуючу інформацію.