Запис символів в буфер клавіатури дозволяє програмі імітувати введення клавіатурного вводу, що необхідно при виконанні демонстраційних програм, переносі тексту в будь-яку прикладну програму з іншої  програми, що знаходиться в памяті резидентно, організація клавіатурних макросів і т.д.

Введення символів в буфер кдавіатури можна виконувати на двох рівнях:

1)       використовуючи функцію AH=51переривання 16h BIOS (див.п. 7.4.1);

2)       використовуючи безпосередній доступ до комірок памяті, що виділені під буфер клавіатури.

Приведемо приклад функції enter_kb.c, що виконує введення символу безпосередньо в буфер або по поточному значенню покажчика „голови”, або по поточному значенню покажчика „хвоста” буфера. Перерахуємо параметри, що передаються функції: where задає режим: якщо where=KB_HEAD, код поміщується зі зсувом покажчика „голови” буферу клавіатури „назад”; якщо where=KB_TAIL, код поміщається із зсувом покажчика „хвоста” буфера клавіатури вперед; key_code – двобайтовий код клавіші, що записується в буфер. Функція повертає 0 (OK) в разі успіху; 1 (FUUL), якщо буфер клавіатури заповнений до кінця; 2 (ERROR), якщо помилково заданий параметр where.

 

/*L7_13.C*/

#include<dos.h>

#include ”kb.h”

enter_kb(int where, unsigned key_code)

{ unsigned register _es *tail=(unsigned _es*)TAIL_PTR,

  _es*head=(unsigned _es*)HEAD_PTR,

  _es*tmp,ret;

_ES=0x40;

disable();   /*початок критичної секції коду*/

switch(where){

case KB_HEAD:

  tmp=(unsigned _es*)*head;

  tmp--;

if (tmp<(unsigned _es*)KB_BUFFER_START)  /*Перехід покажчика в кінець буферу*/

  tmp=(unsigned _es*)(KB_BUFFER_END-2);

if (tmp==(unsigned _es*)*tail)           /*Буфер повний*/

{ ret=FULL;break;}

else

{ *(unsigned _es*) tmp=ket_code;

  *head=(unsigned) tmp;

ret=OK;

break;

}

case KB_TAIL:

tmp=(unsigned _es*)*tail;

if (tmp==(unsigned _es*)KB_BUFFER_END)          /*Перехід покажчика в початок буфера*/

  tmp=(unsigned _es*)KB_BUFFER_START;

if (tmp+1== (unsigned _es*)*head)                /*Буфер повний*/

              { ret=FULL; break;}

else

{ *(unsigned _es*) tmp=key_code;

  tmp++;

       *tail=(unsigned) tmp;

ret=OK;

break;

}

default:

ret=ERROR;}

  enable();

 return ret;

}

 

Приведена функція вийшла достатньо компактною для того, щоб використовувати її як резидентну, що доповнює, наприклад, BIOS- обробник переривання 16h.