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();