X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?p=dosdemo;a=blobdiff_plain;f=src%2Fdos%2Fkeyb.c;h=ac200b3c96fbfb0a9e57d890a679ff64bae58ac2;hp=55b90134de8715c902aa3c04f581ae73197967cc;hb=93f68e445b0a4f10f2b15383aafed8a216a4a228;hpb=1329933c9afad7e3d0a7ce1f9839910706672f00 diff --git a/src/dos/keyb.c b/src/dos/keyb.c index 55b9013..ac200b3 100644 --- a/src/dos/keyb.c +++ b/src/dos/keyb.c @@ -214,12 +214,18 @@ static void INTERRUPT kbintr() { unsigned char code; int key, c, press; + static int ext; code = inp(KB_PORT); - if(code >= 128) { + if(code == 0xe0) { + ext = 1; + goto eoi; + } + + if(code & 0x80) { press = 0; - code -= 128; + code &= 0x7f; if(num_pressed > 0) { num_pressed--; @@ -230,8 +236,14 @@ static void INTERRUPT kbintr() num_pressed++; } - key = scantbl[code]; - c = (keystate[KB_LSHIFT] | keystate[KB_RSHIFT]) ? scantbl_shift[code] : key; + if(ext) { + key = scantbl_ext[code]; + c = key; + ext = 0; + } else { + key = scantbl[code]; + c = (keystate[KB_LSHIFT] | keystate[KB_RSHIFT]) ? scantbl_shift[code] : key; + } if(press) { /* append to buffer */ @@ -251,5 +263,6 @@ static void INTERRUPT kbintr() /* and update keystate table */ keystate[key] = press; +eoi: outp(PIC1_CMD_PORT, OCW2_EOI); /* send end-of-interrupt */ }