#include "common.h"
#define dataport 0x60
#define commandport 0x64
void kdb_readycommand(void)
{
unsigned char x;
x=(inportb(commandport) >> 1) & 1;
while (x)
{
inportb(dataport);
x=(inportb(commandport) >> 1) & 1;
}
x=inportb(commandport) & 1;;
while (x)
{
inportb(dataport);
x=inportb(commandport) & 1;;
}
}
unsigned char kbd_getstatus(void)
{
return inportb(commandport);
}
unsigned char kdb_getoutputport(void)
{
kdb_readycommand();
outportb(commandport,0xd0);
return inportb(dataport);
}
void kdb_setoutputport(unsigned char bt)
{
kdb_readycommand();
outportb(commandport,0xd1);
outportb(dataport,bt);
}
unsigned char kdb_getinputport(void)
{
kdb_readycommand();
outportb(commandport,0xc0);
return inportb(dataport);
}
unsigned char kdb_getcommandbyte(void)
{
kdb_readycommand();
outportb(commandport,0x20);
return inportb(dataport);
}
void kdb_setcommandbyte(unsigned char bt)
{
kdb_readycommand();
outportb(commandport,0x60);
outportb(dataport,bt);
}
int kdb_iskeypressed(void)
{
return inportb(commandport) & 1;
}
void kdb_waitforkeypress(void)
{
while (!kdb_iskeypressed())
resync();
}
unsigned char kbd_getkey(void)
{
kdb_waitforkeypress();
return inportb(dataport);
}
char kbd_convertscancodetochar(unsigned char scancode, int scancodeset )
{
if (scancodeset==1)
{
switch (scancode)
{
case 1: return 27; case 2: return '1';
case 3: return '2';
case 4: return '3';
case 5: return '4';
case 6: return '5';
case 7: return '6';
case 8: return '7';
case 9: return '8';
case 0xa: return '9';
case 0xb: return '0';
case 0xc: return '-';
case 0xd: return '+';
case 0xe: return 8; case 0xf: return 9; case 0x10: return 'q';
case 0x11: return 'w';
case 0x12: return 'e';
case 0x13: return 'r';
case 0x14: return 't';
case 0x15: return 'y';
case 0x16: return 'u';
case 0x17: return 'i';
case 0x18: return 'o';
case 0x19: return 'p';
case 0x1a: return '[';
case 0x1b: return ']';
case 0x1c: return '\n';
case 0x1e: return 'a';
case 0x1f: return 's';
case 0x20: return 'd';
case 0x21: return 'f';
case 0x22: return 'g';
case 0x23: return 'h';
case 0x24: return 'j';
case 0x25: return 'k';
case 0x26: return 'l';
case 0x27: return ';';
case 0x28: return '\'';
case 0x29: return '`';
case 0x2b: return '\\';
case 0x2c: return 'z';
case 0x2d: return 'x';
case 0x2e: return 'c';
case 0x2f: return 'v';
case 0x30: return 'b';
case 0x31: return 'n';
case 0x32: return 'm';
case 0x33: return ',';
case 0x34: return '.';
case 0x35: return '/';
case 0x39: return ' ';
default: return 0;
}
} else return 0;
}
char kbd_getchar(void)
{
char k=kbd_convertscancodetochar(kbd_getkey(),1);
while (!k)
k=kbd_convertscancodetochar(kbd_getkey(),1);
return k; }