#include #include #include "../cterm/pc.h" #define word unsigned int #define uchar unsigned char uchar keyboom=0; static union REGS r; static uchar f_map=0, f_vec=0, kb_mode=0; #define INTA00 0x20 #define KB_DATA 0x60 #define KB_CTL 0x61 #define EOI 0x20 static word keybuf[0xff]; static uchar kbin=0, kbout=0; void interrupt (*o_int)(); void interrupt k_int(bp, di, si, ds, es, dx, cx, bx, ax) word bp, di, si, ds, es, dx, cx, bx, ax; { uchar ctl; word code; code = inportb(KB_DATA); ctl = inportb(KB_CTL); outportb(KB_CTL, ctl | 0x80); outportb(KB_CTL, ctl); enable(); keybuf[kbin++] = code; outportb(INTA00, EOI); } kbflush() { kbin = kbout; } /* k_brk -- intercept Ctrl-Break interrupt */ void interrupt k_brk(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags) word bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags; { flags |= Cflag; /* ie. don't queue it */ keyboom++; } /* * o_brk : temp storage for old interrupt vectors */ void interrupt (*o_brk)(); init_kbd() { if (f_vec) return(0); /* remember old intr vector(s) */ o_brk = getvect(KEYBRK); o_int = getvect(KB_INT); /* install new one(s) */ disable(); setvect(KEYBRK, k_brk); setvect(KB_INT, k_int); enable(); f_vec = 1; /* vector(s) installed */ keyboom = 0; } reset_kbd() { if (!f_vec) return; /* no vectors to reset, yet */ /* restore old intr vector(s) */ disable(); setvect(KEYBRK, o_brk); setvect(KB_INT, o_int); enable(); f_vec = 0; /* vector(s) reset */ } main() { init_kbd(); kbout = 1; while (kbout < 0x7f) while (kbin > kbout) cprintf(" %02x", keybuf[kbout++]); cputs("\r\nDone\r\n"); reset_kbd(); }