Write an interrupt 09h interrupt handler.


For C++ use (...) and for C use (void) in interrupt <somefunc>().
Code:
#define DOWN 1
#define UP       0
#define FALSE  0
#define TRUE    1



typedef unsigned char BYTE;

BYTE keys[128];

int HandlerInstalled;

interrupt *OldHandler=0;

void StartKeyboard(void);
void EndKeyboard(void);


interrupt NewKeyHandler(...)
{
  BYTE ch=inportb(0x60);
  if (ch<128)
  {
      keys[ch]=DOWN
      lastkey=ch
  }
  else
  {
    if (ch==170)
    {
       keys[lastkey]=UP;
       lastkey=ch;
    }
     else
    {
       keys[ch-128]=UP;
       lastkey=ch-128;
    }
  }
  
   //Acknowledge EOI
   outportb(0x20,0x20);

}
 
void StartKeyboard(void)
{

   //register our exit function
   //This will not catch CTRL-C or int 23h
   //But with handler installed - CTRL-C will do nothing
   //Upon normal termination of code - EndKeyboard will always be
   //called
   atexit(EndKeyboard);

   //Save old handler
   OldHandler=getvect(0x09);

   //Install new one
   setvect(0x09,NewKeyHandler);

   HandlerInstalled=TRUE;
}

void EndKeyboard(void)
{
  if (HandlerInstalled) 
  {
     setvect(0x09,OldHandler);
     HandlerInstalled=FALSE;
  }
}

Then to test whether or not a key is down:

if (keys[key_scan_code] dosomething();