/*-----------------------------*/
#include <stddef.h>
#include <stdio.h>
#include <dos.h>
/*-----------------------------*/
#define KB_VCT 0x24 /* kb interrupt vector */
#define KB_PORT 0x60 /* kb port */
#define KB_INIT 0x80 /* init kb command */
#define INT_PORT 0x20 /* interrupt controller port */
#define INT_ENABLE 0x20 /* interrupt enable command */
#define KB_BUF_SIZE 100
/*-----------------------------*/
/* for saving of pointer to original interrupt vector routine */
void interrupt (*KbSav)()=NULL;
/* kb buffer */
unsigned char volatile KbBuf[KB_BUF_SIZE];
/* pointers to kb buffer */
unsigned char volatile *TopPtr;
const unsigned char volatile *BotPtr;
/*-----------------------------*/
void interrupt KbInt(void)
{
unsigned char ch;
unsigned char cc;
unsigned char *buf_ptr;
buf_ptr=(unsigned char *)TopPtr;
/* get scan code */
ch=inportb(KB_PORT);
/* put it to buffer */
*(buf_ptr++)=ch;
/* manage buffer pointers */
if(buf_ptr>=KbBuf+KB_BUF_SIZE) buf_ptr=(unsigned char *)KbBuf;
/* buffer not yet full? */
if(buf_ptr!=BotPtr) TopPtr=buf_ptr;
else
{
/* BIOS usually beeps here */
}
/* release kb port */
cc=inportb(KB_PORT+1);
outportb(KB_PORT+1, cc|KB_INIT);
outportb(KB_PORT+1, cc);
/* enable next interrupts */
outportb(INT_PORT, INT_ENABLE);
}
/*-----------------------------*/
int main()
{
unsigned char ch;
printf("Test of keyboard scan-codes, Esc to exit\n");
/* init kb buffer pointers */
TopPtr=KbBuf;
BotPtr=KbBuf;
/* store original kb vector, set new */
KbSav=getvect(KB_VCT/4);
setvect(KB_VCT/4, KbInt);
do
{
/* wait for character ready */
while(TopPtr==BotPtr);
/* get character from buffer, manage pointers */
ch=(*BotPtr++);
if(BotPtr>=KbBuf+KB_BUF_SIZE) BotPtr=KbBuf;
printf("%x\n", ch);
} while(ch!=0x81);
/* restore original keyboard vector */
setvect(KB_VCT/4, KbSav);
return(0);
}