Запис символів в буфер клавіатури дозволяє програмі імітувати введення клавіатурного вводу, що необхідно при виконанні демонстраційних програм, переносі тексту в будь-яку прикладну програму з іншої програми, що знаходиться в пам’яті резидентно, організація клавіатурних макросів і т.д.
Введення символів в буфер кдавіатури можна виконувати на двох рівнях:
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.
![]() |
![]() |
![]() |