## diffname pc/kbd.c 1991/0702 ## diff -e /dev/null /n/bootesdump/1991/0702/sys/src/9/safari/kbd.c 0a #include "u.h" #include "lib.h" #include "dat.h" #include "fns.h" enum { Data= 0x60, /* data port */ Status= 0x64, /* status port */ Inready= 0x01, /* input character ready */ Outbusy= 0x02, /* output busy */ Sysflag= 0x04, /* ??? */ Cmddata= 0x08, /* cmd==0, data==1 */ kbdinh= 0x10, /* keyboard inhibited */ Xtimeout= 0x20, /* transmit timeout */ Rtimeout= 0x40, /* receive timeout */ Parity= 0x80, /* 0==odd, 1==even */ }; char noshift[256] = { [0x00] Nokey, 0x1b, '1', '2', '3', '4', '5', '6', [0x08] '7', '8', '9', '0', '-', '=', '\b', '\t', [0x10] [0x28] [0x30] }; /* * get a byte from the keyboard */ int kbdc(void) { while((inb(Status)&Inready)==0) ; return inb(Data); } 1 0x1b, 3b F1, 3c F2, 3d F3, 3e F4, 3f F5, 40 f6, 41 F7, 42 F8, 43 F9, 44 F10, 57 F11, 58 F12, e0 52 INS, e0 53 DEL, 2 '1', 3 '2', 4 '3', 5 '4', 6 '5', 7 '6', 8 '7', 9 '8', A '9', B '0', C '-', D '=', E '\b', E0 47 Home, F '\t', 10 'q', 11 'w', 12 'e', 13 'r', 14 't', 15 'y', 16 'u', 17 'i', 18 'o', 19 'p', 1a '[', 1b ']', 2b '\\', e0 49 Pageup, 3a Capslock, 1e 'a' 1f 's' 20 'd' 21 'f' 22 'g' 23 'h' 24 'j' 25 'k' 26 'l' 27 ';' 28 '\'' 1c '\r' 2a Lshift, 2c 'z' 2d 'x' 2e 'c' 2f 'v' 30 'b' 31 'n' 32 'm' 33 ',' 34 '.' 35 '/' 36 Rshift, e0 51 Pagedown, e0 4f End, e0 48 Uparrow, e0 50 Downarrow, e0 4b Leftarrow, e0 4d Rightarrow, e0 1d Rctl, e0 38 Ralt, 39 Space, 38 Lalt, 1d Lctl, 29 '`', 1d 38 1 81 b8 9d F1 1d 38 21 a1 b8 9d F2 2e ae F3 19 99 F4 26 F5 2F F6 e1 1d 45 e1 9d cf F7 e0 46 e0 c6 f8 e0 2a e0 37 e0 b7 e0 aa f9 54 f10 45 f11 46 f12 . ## diffname pc/kbd.c 1991/0703 ## diff -e /n/bootesdump/1991/0702/sys/src/9/safari/kbd.c /n/bootesdump/1991/0703/sys/src/9/safari/kbd.c 130,135c /* * get a character to be there */ c = inb(Data); keyup = c&0x80; c &= 0x7f; if(c > sizeof kbtab){ print("unknown key %ux\n", c|keyup); kbdputc(&kbdq, k1); goto out; } /* * e0's is the first of a 2 character sequence */ if(c == 0xe0){ esc1 = 1; goto out; } else if(c == 0xe1){ esc2 = 2; goto out; } if(esc1){ c = kbtabesc1[c]; esc1 = 0; } else if(esc2){ esc2--; goto out; } else if(shift) c = kbtabshift[c]; else c = kbtab[c]; if(caps && c<='z' && c>='a') c += 'A' - 'a'; /* * keyup only important for shifts */ if(keyup){ switch(c){ case Shift: shift = 0; break; case Ctrl: ctl = 0; break; } goto out; } /* * normal character */ if(!(c & Spec)){ if(ctl) c &= 0x1f; switch(lstate){ case 1: k1 = c; lstate = 2; return; case 2: k2 = c; lstate = 0; c = latin1(k1, k2); if(c == 0){ kbdputc(&kbdq, k1); c = k2; } /* fall through */ default: break; } } else { switch(c){ case Caps: caps ^= 1; goto out; case Num: num ^= 1; goto out; case Shift: shift = 1; goto out; case Latin: lstate = 1; goto out; case Ctrl: ctl = 1; goto out; } } kbdputc(&kbdq, c); out: INTENABLE; /* reenable interrupt */ return; } . 42,128c int kbdputc(IOQ* q, int c) { screenputc(c); putc(q, c); } /* * keyboard interrupt */ void kbdintr(void *a) { int c, nc; static int esc1, esc2; static int shift; static int caps; static int ctl; static int num; static int lstate, k1, k2; int keyup; . 37,39c int c; for(;;){ while((inb(Status)&Inready)==0) ; kbdintr(&c); c = getc(&kbdq); if(c != -1) return c; } . 30a uchar kbtabshift[] = { [0x00] No, 0x1b, '!', '@', '#', '$', '%', '^', [0x08] '&', '*', '(', ')', '_', '+', '\b', '\t', [0x10] 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', [0x18] 'O', 'P', '{', '}', '\n', Ctrl, 'A', 'S', [0x20] 'D', 'F', 'G', 'H', 'J', 'K', 'L', ':', [0x28] '"', '~', Shift, '|', 'Z', 'X', 'C', 'V', [0x30] 'B', 'N', 'M', '<', '>', '?', Shift, No, [0x38] Latin, ' ', Caps, F|1, F|2, F|3, F|4, F|5, [0x40] F|6, F|7, F|8, F|9, F|10, Num, F|12, Home, [0x48] No, No, No, No, No, No, No, No, [0x50] No, No, No, No, No, No, No, F|11, [0x58] F|12, No, No, No, No, No, No, No, }; uchar kbtabesc1[] = { [0x00] No, No, No, No, No, No, No, No, [0x08] No, No, No, No, No, No, No, No, [0x10] No, No, No, No, No, No, No, No, [0x18] No, No, No, No, No, Ctrl, No, No, [0x20] No, No, No, No, No, No, No, No, [0x28] No, No, No, No, No, No, No, No, [0x30] No, No, No, No, No, No, No, Print, [0x38] Latin, No, No, No, No, No, No, No, [0x40] No, No, No, No, No, No, Break, Home, [0x48] Up, Pgup, No, Down, No, Right, No, End, [0x50] Left, Pgdown, Ins, Del, No, No, No, No, [0x58] No, No, No, No, No, No, No, No, }; struct latin { uchar l; char c[2]; }latintab[] = { '€', "!!", /* spanish initial ! */ '€', "c|", /* cent */ '€', "c$", /* cent */ '€', "l$", /* pound sterling */ '€', "g$", /* general currency */ '€', "y$", /* yen */ '€', "j$", /* yen */ '€', "||", /* broken vertical bar */ '€', "SS", /* section symbol */ '€', "\"\"", /* dieresis */ '€', "cr", /* copyright */ '€', "cO", /* copyright */ '€', "sa", /* super a, feminine ordinal */ '€', "<<", /* left angle quotation */ '€', "no", /* not sign, hooked overbar */ '€', "--", /* soft hyphen */ '€', "rg", /* registered trademark */ '€', "__", /* macron */ '€', "s0", /* degree (sup o) */ '€', "+-", /* plus-minus */ '€', "s2", /* sup 2 */ '€', "s3", /* sup 3 */ '€', "''", /* grave accent */ '€', "mu", /* mu */ '€', "pg", /* paragraph (pilcrow) */ '€', "..", /* centered . */ '€', ",,", /* cedilla */ '€', "s1", /* sup 1 */ '€', "so", /* sup o */ '€', ">>", /* right angle quotation */ '€', "14", /* 1/4 */ '€', "12", /* 1/2 */ '€', "34", /* 3/4 */ '€', "??", /* spanish initial ? */ '€', "A`", /* A grave */ '€', "A'", /* A acute */ '€', "A^", /* A circumflex */ '€', "A~", /* A tilde */ '€', "A\"", /* A dieresis */ '€', "A:", /* A dieresis */ '€', "Ao", /* A circle */ '€', "AO", /* A circle */ '€', "Ae", /* AE ligature */ '€', "AE", /* AE ligature */ '€', "C,", /* C cedilla */ '€', "E`", /* E grave */ '€', "E'", /* E acute */ '€', "E^", /* E circumflex */ '€', "E\"", /* E dieresis */ '€', "E:", /* E dieresis */ '€', "I`", /* I grave */ '€', "I'", /* I acute */ '€', "I^", /* I circumflex */ '€', "I\"", /* I dieresis */ '€', "I:", /* I dieresis */ '€', "D-", /* Eth */ '€', "N~", /* N tilde */ '€', "O`", /* O grave */ '€', "O'", /* O acute */ '€', "O^", /* O circumflex */ '€', "O~", /* O tilde */ '€', "O\"", /* O dieresis */ '€', "O:", /* O dieresis */ '€', "OE", /* O dieresis */ '€', "Oe", /* O dieresis */ '€', "xx", /* times sign */ '€', "O/", /* O slash */ '€', "U`", /* U grave */ '€', "U'", /* U acute */ '€', "U^", /* U circumflex */ '€', "U\"", /* U dieresis */ '€', "U:", /* U dieresis */ '€', "UE", /* U dieresis */ '€', "Ue", /* U dieresis */ '€', "Y'", /* Y acute */ '€', "P|", /* Thorn */ '€', "Th", /* Thorn */ '€', "TH", /* Thorn */ '€', "ss", /* sharp s */ '€', "a`", /* a grave */ '€', "a'", /* a acute */ '€', "a^", /* a circumflex */ '€', "a~", /* a tilde */ '€', "a\"", /* a dieresis */ '€', "a:", /* a dieresis */ '€', "ao", /* a circle */ '€', "ae", /* ae ligature */ '€', "c,", /* c cedilla */ '€', "e`", /* e grave */ '€', "e'", /* e acute */ '€', "e^", /* e circumflex */ '€', "e\"", /* e dieresis */ '€', "e:", /* e dieresis */ '€', "i`", /* i grave */ '€', "i'", /* i acute */ '€', "i^", /* i circumflex */ '€', "i\"", /* i dieresis */ '€', "i:", /* i dieresis */ '€', "d-", /* eth */ '€', "n~", /* n tilde */ '€', "o`", /* o grave */ '€', "o'", /* o acute */ '€', "o^", /* o circumflex */ '€', "o~", /* o tilde */ '€', "o\"", /* o dieresis */ '€', "o:", /* o dieresis */ '€', "oe", /* o dieresis */ '€', "-:", /* divide sign */ '€', "o/", /* o slash */ '€', "u`", /* u grave */ '€', "u'", /* u acute */ '€', "u^", /* u circumflex */ '€', "u\"", /* u dieresis */ '€', "u:", /* u dieresis */ '€', "ue", /* u dieresis */ '€', "y'", /* y acute */ '€', "th", /* thorn */ '€', "p|", /* thorn */ '€', "y\"", /* y dieresis */ '€', "y:", /* y dieresis */ 0, 0, }; KIOQ kbdq; int latin1(int k1, int k2) { int i; struct latin *l; for(l=latintab; l->l; l++) if(k1==l->c[0] && k2==l->c[1]) return l->l; return 0; } void kbdinit(void) { initq(&kbdq); setvec(Kbdvec, kbdintr, SEGIG); } . 26,28c [0x10] 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', [0x18] 'o', 'p', '[', ']', '\n', Ctrl, 'a', 's', [0x20] 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', [0x28] '\'', '`', Shift, '\\', 'z', 'x', 'c', 'v', [0x30] 'b', 'n', 'm', ',', '.', '/', Shift, No, [0x38] Latin, ' ', Caps, F|1, F|2, F|3, F|4, F|5, [0x40] F|6, F|7, F|8, F|9, F|10, Num, F|12, Home, [0x48] No, No, No, No, No, No, No, No, [0x50] No, No, No, No, No, No, No, F|11, [0x58] F|12, No, No, No, No, No, No, No, . 24c [0x00] No, 0x1b, '1', '2', '3', '4', '5', '6', . 22c uchar kbtab[] = . 19c Spec= 0x80, PF= Spec|0x20, /* num pad function key */ View= Spec|0x00, /* view (shift window up) */ F= Spec|0x40, /* function key */ Shift= Spec|0x60, Break= Spec|0x61, Ctrl= Spec|0x62, Latin= Spec|0x63, Caps= Spec|0x64, Num= Spec|0x65, No= Spec|0x7F, /* no mapping */ Home= F|13, Up= F|14, Pgup= F|15, Print= F|16, Left= View, Right= View, End= '\r', Down= View, Pgdown= View, Ins= F|20, Del= 0x7F, . 4a #include "io.h" #include "mem.h" . ## diffname pc/kbd.c 1991/0705 ## diff -e /n/bootesdump/1991/0703/sys/src/9/safari/kbd.c /n/bootesdump/1991/0705/sys/src/9/safari/kbd.c 381c INT0ENABLE; /* reenable interrupt */ . ## diffname pc/kbd.c 1991/0706 ## diff -e /n/bootesdump/1991/0705/sys/src/9/safari/kbd.c /n/bootesdump/1991/0706/sys/src/9/safari/kbd.c 380,381d 376c return; . 373c return; . 370c return; . 367c return; . 364c return; . 334c return; . 313c return; . 305c return; . 302c return; . 294c return; . 273c kbdintr(Ureg *ur) . 265c if(c==0x10) panic("^p"); . 248,262d 244,246d 6d 2a #include "mem.h" . ## diffname pc/kbd.c 1991/0711 ## diff -e /n/bootesdump/1991/0706/sys/src/9/safari/kbd.c /n/bootesdump/1991/0711/sys/src/9/safari/kbd.c 244,251d ## diffname pc/kbd.c 1991/0716 ## diff -e /n/bootesdump/1991/0711/sys/src/9/safari/kbd.c /n/bootesdump/1991/0716/sys/src/9/safari/kbd.c 241c setvec(Kbdvec, kbdintr); . ## diffname pc/kbd.c 1991/0719 ## diff -e /n/bootesdump/1991/0716/sys/src/9/safari/kbd.c /n/bootesdump/1991/0719/sys/src/9/safari/kbd.c 260c * get a character . ## diffname pc/kbd.c 1991/0730 ## diff -e /n/bootesdump/1991/0719/sys/src/9/safari/kbd.c /n/bootesdump/1991/0730/sys/src/9/safari/kbd.c 262a /* * if it's the mouse... */ if(s & Minready){ print("mousechar\n"); mouseputc(&mouseq, c); return; } . 261a s = inb(Status); . 260c * get status and character . 250c int s, c, nc; . 241a /* wait for a quiescent controller */ while((c = inb(Status)) & (Outbusy | Inready)) if(c & Inready) inb(Data); /* read controller command byte */ outb(Cmd, 0x20); while(!(inb(Status) & Inready)) ; c = inb(Data); print("input completed\n"); delay(5000); /* enable mouse and mouse interupts */ c = (c&~0x20) | 0x02; outb(Cmd, 0x60); while(inb(Status) & Outbusy) ; outb(Data, c); print("mouse enabled\n"); delay(5000); initq(&mouseq); setvec(Mousevec, kbdintr); . 239a uchar c; . 20a Cmd= 0x64, /* command port (write only) */ . 16,19c Inhibit= 0x10, /* keyboard/mouse inhibited */ Minready= 0x20, /* mouse character ready */ Rtimeout= 0x40, /* general timeout */ Parity= 0x80, /* 1 == error */ . 14c Sysflag= 0x04, /* system flag */ . ## diffname pc/kbd.c 1991/0731 ## diff -e /n/bootesdump/1991/0730/sys/src/9/safari/kbd.c /n/bootesdump/1991/0731/sys/src/9/safari/kbd.c 394c return 0; } void kbdintr(Ureg *ur) { while(kbdintr0() == 0) ; . 390c return 0; . 387c return 0; . 384c return 0; . 381c return 0; . 378c return 0; . 361c return 0; . 348c return 0; . 327c return 0; . 319c return 0; . 316c return 0; . 308c return 0; . 298,300c mymouseputc(c); return 0; . 291a if(!(s&Inready)) return -1; /* * get the character */ . 289c * get status . 276,277c int kbdintr0(void) . 269,270c /* * mouse message is three bytes * * byte 0 - 0 0 SDY SDX 1 M R L * byte 1 - DX * byte 2 - DY */ static void mymouseputc(int c) { static short msg[3]; static int nb; static uchar b[] = {0, 4, 1, 5, 2, 6, 3, 7}; static lastdx, lastdy; int diff; extern Mouseinfo mouse; /* * check byte 0 for consistency */ if(nb==0 && (c&0xc8)!=0x08) return; msg[nb] = c; if(++nb == 3){ nb = 0; if(msg[0] & 0x10) msg[1] |= 0xFF00; if(msg[0] & 0x20) msg[2] |= 0xFF00; mouse.newbuttons = b[msg[0]&7]; mouse.dx = msg[1]; mouse.dy = -msg[2]; print("%d %d\n", mouse.dx, mouse.dy); mouse.track = 1; mouseclock(); } . 267a } . 265,266c outb(Data, 0x47); while(inb(Status) & Outbusy) ; outb(Cmd, 0xA8); /* make mouse streaming (and enabled) */ mousecmd(0xEA, -1); mousecmd(0xF4, -1); /* resolution */ mousecmd(0xE8, 0x03); print("res set\n"); . 252,261c /* enable kbd/mouse xfers and interrupts */ . 245a initq(&mouseq); setvec(Mousevec, kbdintr); . 242c int c, s; . 238a static void mousecmd(int cmd, int arg) { unsigned int c; do { while(inb(Status) & Outbusy) ; outb(Cmd, 0xD4); while(inb(Status) & Outbusy) ; outb(Data, cmd); if(arg >= 0){ while(inb(Status) & Outbusy) ; outb(Data, arg); } while(!(inb(Status) & Inready)) ; c = inb(Data); } while(c == 0xFE); if(c != 0xFA) print("mouse command returns bad status %lux", c); } . 77,78c [0x50] No, No, No, No, No, No, No, KF|11, [0x58] KF|12, No, No, No, No, No, No, No, . 74,75c [0x38] Latin, ' ', Caps, KF|1, KF|2, KF|3, KF|4, KF|5, [0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, Home, . 61,62c [0x50] No, No, No, No, No, No, No, KF|11, [0x58] KF|12, No, No, No, No, No, No, No, . 58,59c [0x38] Latin, ' ', Caps, KF|1, KF|2, KF|3, KF|4, KF|5, [0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, Home, . 45c Ins= KF|20, . 36,39c Home= KF|13, Up= KF|14, Pgup= KF|15, Print= KF|16, . 27c KF= Spec|0x40, /* function key */ . 19c Parity= 0x80, . 7a #include #include #include "screen.h" . ## diffname pc/kbd.c 1991/0801 ## diff -e /n/bootesdump/1991/0731/sys/src/9/safari/kbd.c /n/bootesdump/1991/0801/sys/src/9/safari/kbd.c 336d 297,299c /* mousecmd(0xE8, 0x03); /**/ . ## diffname pc/kbd.c 1991/0803 ## diff -e /n/bootesdump/1991/0801/sys/src/9/safari/kbd.c /n/bootesdump/1991/0803/sys/src/9/safari/kbd.c 292,297c /* make mouse streaming, enabled */ if(mousecmd(0xEA) < 0 || mousecmd(0xF4) < 0) print("can't initialize mouse\n"); . 288,289c if(outready() < 0) print("kbd init failed\n"); . 285,286c if(outready() < 0) print("kbd init failed\n"); . 271a int tries; . 265c return -1; return 0; . 255,261c if(inready() < 0) return -1; . 252,253c if(outready() < 0) return -1; . 248,250c for(tries=0; tries < 10; tries++){ if(outready() < 0) return -1; . 246a int tries; . 245a int tries; for(tries = 0; (inb(Status) & Outbusy); tries++) if(tries > 1000) return -1; return 0; } /* * wait for input */ static int inready(void) { int tries; for(tries = 0; !(inb(Status) & Inready); tries++) if(tries > 1000) return -1; return 0; } /* * send a command to the mouse */ static int mousecmd(int cmd) { . 243,244c /* * wait for output no longer busy */ static int outready(void) . ## diffname pc/kbd.c 1991/0809 ## diff -e /n/bootesdump/1991/0803/sys/src/9/safari/kbd.c /n/bootesdump/1991/0809/sys/src/9/safari/kbd.c 339c static uchar b[] = {0, 1, 4, 5, 2, 3, 6, 7}; . ## diffname pc/kbd.c 1991/0821 ## diff -e /n/bootesdump/1991/0809/sys/src/9/safari/kbd.c /n/bootesdump/1991/0821/sys/src/9/safari/kbd.c 420a print("\nescape1 %lux\n", c); . ## diffname pc/kbd.c 1991/0822 ## diff -e /n/bootesdump/1991/0821/sys/src/9/safari/kbd.c /n/bootesdump/1991/0822/sys/src/9/safari/kbd.c 423a kbdputc(&kbdq, c); return 0; . 421d 419a keyup = c&0x80; c &= 0x7f; if(c > sizeof kbtab){ print("unknown key %ux\n", c|keyup); kbdputc(&kbdq, k1); return 0; } . 401,408d ## diffname pc/kbd.c 1991/0823 ## diff -e /n/bootesdump/1991/0822/sys/src/9/safari/kbd.c /n/bootesdump/1991/0823/sys/src/9/safari/kbd.c 361a spllo(); /* mouse tracking kills uart0 */ . ## diffname pc/kbd.c 1991/0904 ## diff -e /n/bootesdump/1991/0823/sys/src/9/safari/kbd.c /n/bootesdump/1991/0904/sys/src/9/safari/kbd.c 280,289c c = 0; do{ for(tries=0; tries < 10; tries++){ if(outready() < 0) return -1; outb(Cmd, 0xD4); if(outready() < 0) return -1; outb(Data, cmd); if(inready() < 0) return -1; c = inb(Data); } . ## diffname pc/kbd.c 1991/0905 ## diff -e /n/bootesdump/1991/0904/sys/src/9/safari/kbd.c /n/bootesdump/1991/0905/sys/src/9/safari/kbd.c 229a /* * predeclared */ static void kbdintr(Ureg*); . 228a /* * keyboard input q */ . ## diffname pc/kbd.c 1991/0906 ## diff -e /n/bootesdump/1991/0905/sys/src/9/safari/kbd.c /n/bootesdump/1991/0906/sys/src/9/safari/kbd.c 436c if(!keyup) kbdputc(&kbdq, c); . ## diffname pc/kbd.c 1991/0911 ## diff -e /n/bootesdump/1991/0906/sys/src/9/safari/kbd.c /n/bootesdump/1991/0911/sys/src/9/safari/kbd.c 503a return 0; case Middle: middle(2); . 460a case Middle: middle(0); break; . 379a * Ctrl key used as middle button pressed */ static void middle(int newval) { middlebutton = newval; mouse.newbuttons = mousebuttons | middlebutton; mouse.dx = 0; mouse.dy = 0; mouse.track = 1; spllo(); /* mouse tracking kills uart0 */ mouseclock(); } /* . 370c mousebuttons = b[msg[0]&7]; mouse.newbuttons = mousebuttons | middlebutton; . 233a static int mousebuttons; static int middlebutton; . 78c [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, . 62c [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, . 37a Middle= Spec|0x66, . ## diffname pc/kbd.c 1991/1108 ## diff -e /n/bootesdump/1991/0911/sys/src/9/safari/kbd.c /n/bootesdump/1991/1108/sys/src/9/safari/kbd.c 243,254d 102,229d ## diffname pc/kbd.c 1991/1207 ## diff -e /n/bootesdump/1991/1108/sys/src/9/safari/kbd.c /n/bootesdump/1991/1207/sys/src/9/safari/kbd.c 195c outb(Cmd, 0xA8); /* BUG -- should this be AE? */ . 192c outb(Data, 0x47); /* BUG -- on 6300 0x65 */ . ## diffname pc/kbd.c 1991/1210 ## diff -e /n/bootesdump/1991/1207/sys/src/9/safari/kbd.c /n/bootesdump/1991/1210/sys/src/9/safari/kbd.c 188,200c switch(machtype){ case Attnsx: /* enable kbd/mouse xfers and interrupts */ outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, 0x47); if(outready() < 0) print("kbd init failed\n"); outb(Cmd, 0xA8); /* make mouse streaming, enabled */ if(mousecmd(0xEA) < 0 || mousecmd(0xF4) < 0) print("can't initialize mouse\n"); break; case At: /* enable kbd xfers and interrupts */ outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, 0x65); break; } . 172a i8042a20(void) { outready(); outb(Cmd, 0xD1); outready(); outb(Data, 0xDF); outready(); } /* * ask 8042 to reset the 386 */ void i8042reset(void) { outready(); outb(Cmd, 0xD1); outready(); outb(Data, 0xDE); outready(); } void . 171a /* * ask 8042 to enable the use of address bit 20 */ . ## diffname pc/kbd.c 1991/1211 ## diff -e /n/bootesdump/1991/1210/sys/src/9/safari/kbd.c /n/bootesdump/1991/1211/sys/src/9/safari/kbd.c 407a return 0; . 405a kbdputc(&kbdq, c); . 399,404c if(c != -1) kbdputc(&kbdq, c); else for(i=0; i', '?', Shift, '*', . 64,66c [0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, KF|12, '7', [0x48] '8', '9', '-', '4', '5', '6', '+', '1', [0x50] '2', '3', '0', '.', No, No, No, KF|11, . 62c [0x30] 'b', 'n', 'm', ',', '.', '/', Shift, '*', . 39c No= 0x00, /* peter */ . ## diffname pc/kbd.c 1992/0811 ## diff -e /n/bootesdump/1992/0808/sys/src/9/safari/kbd.c /n/bootesdump/1992/0811/sys/src/9/pc/kbd.c 427,428c case KF|1: mbon(4); return 0; case KF|2: mbon(2); return 0; case KF|3: mbon(1); . 365a case KF|2: mboff(2); break; case KF|3: mboff(1); break; . 363,364c case KF|1: mboff(4); . 282a static void mboff(int val) { keybuttons &= ~val; mouse.newbuttons = mousebuttons | keybuttons; mouse.dx = 0; mouse.dy = 0; mouse.track = 1; spllo(); /* mouse tracking kills uart0 */ mouseclock(); } . 275,276c keybuttons |= val; mouse.newbuttons = mousebuttons | keybuttons; . 273c mbon(int val) . 260c mouse.newbuttons = mousebuttons | keybuttons; . 214a /* turn on mouse acceleration */ mousecmd(0xE7); . 108c static int keybuttons; . ## diffname pc/kbd.c 1992/0825 ## diff -e /n/bootesdump/1992/0811/sys/src/9/pc/kbd.c /n/bootesdump/1992/0825/sys/src/9/pc/kbd.c 227a break; } } /* * turn mouse acceleration on/off */ void mouseaccelerate(int on) { switch(machtype){ case Attnsx: if(on) mousecmd(0xE7); else mousecmd(0xE6); . 217c mouseaccelerate(0); . ## diffname pc/kbd.c 1992/0902 ## diff -e /n/bootesdump/1992/0825/sys/src/9/pc/kbd.c /n/bootesdump/1992/0902/sys/src/9/pc/kbd.c 239,240c switch(mousetype){ case MousePS2: . 228a case Mouseother: /* enable kbd xfers and interrupts */ outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, 0x65); break; . 219c case Mouseserial: . 197,198c switch(mousetype){ case MousePS2: . 185a i8042reset(void) { outready(); outb(Cmd, 0xD1); outready(); outb(Data, 0xDE); outready(); } void . 184a /* * ask 8042 to reset the machine */ . ## diffname pc/kbd.c 1992/0904 ## diff -e /n/bootesdump/1992/0902/sys/src/9/pc/kbd.c /n/bootesdump/1992/0904/sys/src/9/pc/kbd.c 264a break; } } /* * set mouse resolution */ void mouseres(int res) { switch(mousetype){ case MousePS2: mousecmd(0xE8); mousecmd(res); . 239,249c /* * set up a ps2 mouse */ void mouseps2(void) { if(mousetype) return; bigcursor(); setvec(Mousevec, kbdintr); /* enable kbd/mouse xfers and interrupts */ outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, 0x47); if(outready() < 0) print("kbd init failed\n"); outb(Cmd, 0xA8); /* make mouse streaming, enabled */ mousecmd(0xEA); mousecmd(0xF4); mousetype = MousePS2; . 229,237c /* set up /dev/eia0 as the mouse */ uartspecial(port, 0, &mouseq, 1200); mousetype = Mouseserial; } . 215,227c /* * setup a serial mouse */ void mouseserial(int port) { if(mousetype) return; . 210,213c /* enable kbd xfers and interrupts */ outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, 0x65); } . 114a enum { /* what kind of mouse */ Mouseother= 0, Mouseserial= 1, MousePS2= 2, }; static int mousetype; . ## diffname pc/kbd.c 1992/0918 ## diff -e /n/bootesdump/1992/0904/sys/src/9/pc/kbd.c /n/bootesdump/1992/0918/sys/src/9/pc/kbd.c 372d 328c mousebuttons = b[(msg[0]&7) | (shift ? 8 : 0)]; . 310c static uchar b[] = {0, 1, 4, 5, 2, 3, 6, 7, 0, 1, 2, 5, 2, 3, 6, 7 }; . 303a * * shift & left button is the same as middle button . 297a static int shift; . ## diffname pc/kbd.c 1992/1013 ## diff -e /n/bootesdump/1992/0918/sys/src/9/pc/kbd.c /n/bootesdump/1992/1013/sys/src/9/pc/kbd.c 202c outb(Data, 0xDE); /* set reset line high */ . 199a outb(Cmd, 0xFE); /* pulse reset line */ outready(); /* * this is the old IBM way */ outready(); . 198a /* * this works for dhog */ . 186d ## diffname pc/kbd.c 1992/1014 ## diff -e /n/bootesdump/1992/1013/sys/src/9/pc/kbd.c /n/bootesdump/1992/1014/sys/src/9/pc/kbd.c 163c for(tries=0; tries < 100; tries++){ . 133c if(tries > 10000) . ## diffname pc/kbd.c 1992/1015 ## diff -e /n/bootesdump/1992/1014/sys/src/9/pc/kbd.c /n/bootesdump/1992/1015/sys/src/9/pc/kbd.c 407c mymouseputc(&mouseq, c); . 347a return 0; . 330c return 0; . 325a USED(q); /* not */ . 317,318c static int mymouseputc(IOQ *q, int c) . 270a splx(x); . 266a if(outready() < 0) print("mouse init failed\n"); . 265c print("mouse init failed\n"); . 262,263c print("mouse init failed\n"); outb(Data, ccc); . 259a x = splhi(); ccc &= ~Cmousedis; ccc |= Cmouseint; if(outready() < 0) print("mouse init failed\n"); . 253,254c int x; . 239c if(mousetype == Mouseserial) . 230c outb(Data, ccc); outready(); . 226a ccc &= ~Ckbddis; ccc |= Csf | Ckbdint | Cscs1; if(outready() < 0) print("kbd init failed\n"); . 225a /* get current controller command byte */ outb(Cmd, 0x20); if(inready() < 0){ print("kbdinit: can't read ccc\n"); ccc = 0; } else ccc = inb(Data); . 185a outready(); . 176a } . 175c if(c != 0xFA){ print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); . 163,173c if(tries++ > 5) break; if(outready() < 0) continue; outb(Cmd, 0xD4); if(outready() < 0) continue; outb(Data, cmd); if(outready() < 0) continue; if(inready() < 0) continue; c = inb(Data); . 161a tries = 0; . 148a delay(2); } . 146,147c for(tries = 0; !(inb(Status) & Inready); tries++){ if(tries > 500) . 134a delay(2); } . 132,133c for(tries = 0; (inb(Status) & Outbusy); tries++){ if(tries > 500) . 123a static int mymouseputc(IOQ*, int); . 116a /* controller command byte */ Cscs1= (1<<6), /* scan code set 1 */ Cmousedis= (1<<5), /* mouse disable */ Ckbddis= (1<<4), /* kbd disable */ Csf= (1<<2), /* system flag */ Cmouseint= (1<<1), /* mouse interrupt enable */ Ckbdint= (1<<0), /* kbd interrupt enable */ . 108a static uchar ccc; . ## diffname pc/kbd.c 1992/1016 ## diff -e /n/bootesdump/1992/1015/sys/src/9/pc/kbd.c /n/bootesdump/1992/1016/sys/src/9/pc/kbd.c 343a splx(x); . 341a x = splhi(); . 338a int x; . 328a splx(x); . 324a x = splhi(); . 321a int x; . 309c mousecmd(0xF6); . 273c if(mousetype) . 192c } while(c == 0xFE || c == 0); . 190c break; . 188c break; . 185c break; . 182c break; . ## diffname pc/kbd.c 1992/1017 ## diff -e /n/bootesdump/1992/1016/sys/src/9/pc/kbd.c /n/bootesdump/1992/1017/sys/src/9/pc/kbd.c 581c mbon(Lbutton); . 578c mbon(Mbutton); . 575c mbon(Rbutton); . 511c mboff(Lbutton); . 508c mboff(Mbutton); . 505c mboff(Rbutton); . 457c ps2mouseputc(&mouseq, c); . 400a * microsoft 3 button, 7 bit bytes * * byte 0 - 1 L R Y7 Y6 X7 X6 * byte 1 - 0 X5 X4 X3 X2 X1 X0 * byte 2 - 0 Y5 Y4 Y3 Y2 Y1 Y0 * byte 3 - 0 M x x x x x (optional) * * shift & left button is the same as middle button (for 2 button mice) */ static int m3mouseputc(IOQ *q, int c) { static uchar msg[3]; static int nb; static uchar b[] = { 0, 4, 1, 5, 0, 4, 3, 7 }; extern Mouseinfo mouse; USED(q); /* not */ /* * check bit 6 for consistency */ if(nb==0){ if((c&0x40) != 0){ /* must be 4th (M button) byte */ mousebuttons = (mousebuttons & ~Mbutton) | ((c&0x2)?Mbutton:0); mouse.newbuttons = mousebuttons | keybuttons; mouse.dx = 0; mouse.dy = 0; mouse.track = 0; mouseclock(); return 0; } } msg[nb] = c; if(++nb == 3){ nb = 0; mousebuttons = b[(msg[0]>>4)&3 | (shift ? 4 : 0)]; mouse.newbuttons = mousebuttons | keybuttons; mouse.dx = (((msg[0]&3)<<7) | msg[1]) - 128; mouse.dy = (((msg[0]&0xc)<<5) | msg[2]) - 128; mouse.track = 1; mouseclock(); } return 0; } /* * set/change mouse configuration */ void mousectl(char *arg) { int n, x; char *field[3]; n = getfields(arg, field, 3, ' '); if(n < 1) return; if(strncmp(field[0], "serial", 6) == 0){ if(n > 1) serialmouse(atoi(field[1]), field[2], 0); else serialmouse(atoi(field[0]+6), 0, 1); } else if(strcmp(field[0], "ps2") == 0){ ps2mouse(); } else if(strcmp(field[0], "accelerated") == 0){ switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE7); splx(x); break; } } else if(strcmp(field[0], "linear") == 0){ switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE6); splx(x); break; } } else if(strcmp(field[0], "res") == 0){ if(n < 2) n = 1; else n = atoi(field[1]); switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE8); mousecmd(n); splx(x); break; } } } /* . 371d 366c ps2mouseputc(IOQ *q, int c) . 317,357c * ps/2 mouse message is three bytes . 309c mousecmd(0xEA); . 292a setvec(Mousevec, kbdintr); . 289,290c if(mousetype) error(Emouseset); . 284,285c static void ps2mouse(void) . 277c uartspecial(port, 0, &mouseq, setspeed ? 1200 : 0); if(type && *type == 'M') mouseq.putc = m3mouseputc; mouseport = port; . 274c error(Emouseset); . 270,271c static void serialmouse(int port, char *type, int setspeed) . 240a bigcursor(); . 133c static void kbdintr(Ureg*); static int ps2mouseputc(IOQ*, int); static int m3mouseputc(IOQ*, int); . 131d 111,114d 109a static int mousetype; static int mouseport; static int shift; . 51a Rbutton=4, Mbutton=2, Lbutton=1, . 6a #include "../port/error.h" . ## diffname pc/kbd.c 1992/1020 ## diff -e /n/bootesdump/1992/1017/sys/src/9/pc/kbd.c /n/bootesdump/1992/1020/sys/src/9/pc/kbd.c 634c mouseshifted = shift = 1; . 567c mouseshifted = shift = 0; . 486,491c mousebuttons(keybuttons); . 475,480c mousebuttons(keybuttons); . 433a break; case 2: serialmouse(atoi(field[1]), 0, 0); break; case 3: default: serialmouse(atoi(field[1]), field[2], 0); break; } . 430,432c switch(n){ case 1: . 427,428d 370,417d 358,359c mouse.newbuttons = b[(msg[0]&7) | (shift ? 8 : 0)] | keybuttons; . 341d 281a if(port >= 2 || port < 0) error(Ebadarg); . 138d 119d 117a extern int mouseshifted; . 112d 12a extern Mouseinfo mouse; . ## diffname pc/kbd.c 1992/1021 ## diff -e /n/bootesdump/1992/1020/sys/src/9/pc/kbd.c /n/bootesdump/1992/1021/sys/src/9/pc/kbd.c 289d 130,134d 119d 116,117d ## diffname pc/kbd.c 1992/1113 ## diff -e /n/bootesdump/1992/1021/sys/src/9/pc/kbd.c /n/bootesdump/1992/1113/sys/src/9/pc/kbd.c 355d ## diffname pc/kbd.c 1992/1217 ## diff -e /n/bootesdump/1992/1113/sys/src/9/pc/kbd.c /n/bootesdump/1992/1217/sys/src/9/pc/kbd.c 191c kprint("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); . ## diffname pc/kbd.c 1993/0226 ## diff -e /n/bootesdump/1992/1217/sys/src/9/pc/kbd.c /n/bootesdump/1993/0226/sys/src/9/pc/kbd.c 580,588d 511,519d 418,433d 351,355c buttons = b[(msg[0]&7) | (shift ? 8 : 0)] | keybuttons; dx = msg[1]; dy = -msg[2]; mousetrack(buttons, dx, dy); . 334a int buttons, dx, dy; . 13,14d ## diffname pc/kbd.c 1993/0915 ## diff -e /n/bootesdump/1993/0226/sys/src/9/pc/kbd.c /n/fornaxdump/1993/0915/sys/src/brazil/pc/kbd.c 564a } void ctps2intr(Ureg *ur) { uchar c; USED(ur); c = inb(ctport + CTstatus); if(c & Error) return; if((c & Rready) == 0) return; c = inb(ctport + CTdata); ps2mouseputc(&mouseq, c); . 292a if(ct82c710() == 0) return; . 282a * look for a chips & technologies 82c710 ps2 mouse on a TI travelmate */ static int ct82c710(void) { int c; /* on non-C&T 2fa and 3fa are input only ports */ /* get chips attention */ outb(0x2fa, 0x55); nop(); nop(); outb(0x3fa, ~0x55); nop(); nop(); outb(0x3fa, 0x36); nop(); nop(); /* tell it where its config register should be */ outb(0x3fa, 0x390>>2); nop(); nop(); outb(0x2fa, ~(0x390>>2)); nop(); nop(); /* see if this is really a 710 */ outb(0x390, 0xf); nop(); nop(); if(inb(0x391) != (0x390>>2)) return -1; /* get data port address */ outb(0x390, 0xd); nop(); nop(); c = inb(0x391); if(c == 0 || c == 0xff) return -1; ctport = c<<2; /* turn off config mode */ outb(0x390, 0xf); nop(); nop(); outb(0x391, 0xf); setvec(Mousevec, ctps2intr); /* enable for interrupts */ c = inb(ctport + CTstatus); c &= ~(Clear|Reset); c |= Enable|Intenable; outb(ctport + CTstatus, c); mousetype = MousePS2; return 0; } /* . 281a static void nop(void){}; . 229a . 174c if(tries++ > 2) . 127a static void ctps2intr(Ureg*); . 114a ulong ctport; . 27a CTdata= 0x0, /* chips & Technologies ps2 data port */ CTstatus= 0x1, /* chips & Technologies ps2 status port */ Enable= 1<<7, Clear= 1<<6, Error= 1<<5, Intenable= 1<<4, Reset= 1<<3, Tready= 1<<2, Rready= 1<<1, Idle= 1<<0, . ## diffname pc/kbd.c 1993/1113 ## diff -e /n/fornaxdump/1993/0915/sys/src/brazil/pc/kbd.c /n/fornaxdump/1993/1113/sys/src/brazil/pc/kbd.c 644c ps2mouseputc(c); . 621c kbdputc(kbdq, c); . 598c kbdputc(kbdq, c); . 584c kbdputc(kbdq, kc[i]); . 582c kbdputc(kbdq, c); . 511c ps2mouseputc(c); . 400d 393c ps2mouseputc(int c) . 292c NS16552special(port, setspeed, 0, 0, m3mouseputc); else NS16552special(port, setspeed, 0, 0, 0); . 290c if(setspeed) setspeed = 1200; . 248a kbdq = qopen(4*1024, 0, 0, 0); . 142a extern int m3mouseputc(IOQ*, int); . 141d 118,122d ## diffname pc/kbd.c 1993/1116 ## diff -e /n/fornaxdump/1993/1113/sys/src/brazil/pc/kbd.c /n/fornaxdump/1993/1116/sys/src/brazil/pc/kbd.c 248d 11d ## diffname pc/kbd.c 1993/1117 ## diff -e /n/fornaxdump/1993/1116/sys/src/brazil/pc/kbd.c /n/fornaxdump/1993/1117/sys/src/brazil/pc/kbd.c 291c NS16552special(port, setspeed, &mouseq, 0, mouseputc); . 289c NS16552special(port, setspeed, &mouseq, 0, m3mouseputc); . 136c extern int m3mouseputc(IOQ*, int), mouseputc(IOQ*, int); . ## diffname pc/kbd.c 1993/1124 ## diff -e /n/fornaxdump/1993/1117/sys/src/brazil/pc/kbd.c /n/fornaxdump/1993/1124/sys/src/brazil/pc/kbd.c 635,642c kbdq = qopen(4*1024, 0, 0, 0); setvec(Kbdvec, kbdintr, 0); /* wait for a quiescent controller */ while((c = inb(Status)) & (Outbusy | Inready)) if(c & Inready) inb(Data); /* get current controller command byte */ outb(Cmd, 0x20); if(inready() < 0){ print("kbdinit: can't read ccc\n"); ccc = 0; } else ccc = inb(Data); /* enable kbd xfers and interrupts */ ccc &= ~Ckbddis; ccc |= Csf | Ckbdint | Cscs1; if(outready() < 0) print("kbd init failed\n"); outb(Cmd, 0x60); if(outready() < 0) print("kbd init failed\n"); outb(Data, ccc); outready(); . 633c int c; . 631c kbdinit(void) . 626,627c int n, x; char *field[3]; n = getfields(arg, field, 3, ' '); if(strncmp(field[0], "serial", 6) == 0){ switch(n){ case 1: serialmouse(atoi(field[0]+6), 0, 1); break; case 2: serialmouse(atoi(field[1]), 0, 0); break; case 3: default: serialmouse(atoi(field[1]), field[2], 0); break; } } else if(strcmp(field[0], "ps2") == 0){ ps2mouse(); } else if(strcmp(field[0], "accelerated") == 0){ switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE7); splx(x); break; } } else if(strcmp(field[0], "linear") == 0){ switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE6); splx(x); break; } } else if(strcmp(field[0], "res") == 0){ if(n < 2) n = 1; else n = atoi(field[1]); switch(mousetype){ case MousePS2: x = splhi(); mousecmd(0xE8); mousecmd(n); splx(x); break; } } . 624c mousectl(char *arg) . 622a /* * set up a ps2 mouse */ static void ps2mouse(void) { int x; if(mousetype) error(Emouseset); if(ct82c710() == 0) return; /* enable kbd/mouse xfers and interrupts */ setvec(Mousevec, kbdintr, 0); x = splhi(); ccc &= ~Cmousedis; ccc |= Cmouseint; if(outready() < 0) print("mouse init failed\n"); outb(Cmd, 0x60); if(outready() < 0) print("mouse init failed\n"); outb(Data, ccc); if(outready() < 0) print("mouse init failed\n"); outb(Cmd, 0xA8); if(outready() < 0) print("mouse init failed\n"); /* make mouse streaming, enabled */ mousecmd(0xEA); mousecmd(0xF4); splx(x); mousetype = MousePS2; } /* * set/change mouse configuration */ . 620d 616c return; . 613c return; . 610c return; . 607c return; . 604c return; . 599c return; . 557c return; . 536c return; . 528c return; . 521c return; . 518c return; . 510c return; . 498c return; . 492a USED(ur, arg); . 349,483d 347c kbdintr(Ureg *ur, void *arg) . 344c * keyboard interrupt . 331c setvec(Mousevec, ctps2intr, 0); . 294a /* * ps/2 mouse message is three bytes * * byte 0 - 0 0 SDY SDX 1 M R L * byte 1 - DX * byte 2 - DY * * shift & left button is the same as middle button */ static int ps2mouseputc(int c) { static short msg[3]; static int nb; static uchar b[] = {0, 1, 4, 5, 2, 3, 6, 7, 0, 1, 2, 5, 2, 3, 6, 7 }; int buttons, dx, dy; /* * check byte 0 for consistency */ if(nb==0 && (c&0xc8)!=0x08) return 0; msg[nb] = c; if(++nb == 3){ nb = 0; if(msg[0] & 0x10) msg[1] |= 0xFF00; if(msg[0] & 0x20) msg[2] |= 0xFF00; buttons = b[(msg[0]&7) | (shift ? 8 : 0)] | keybuttons; dx = msg[1]; dy = -msg[2]; mousetrack(buttons, dx, dy); } return 0; } static void ctps2intr(Ureg *ur, void *arg) { uchar c; USED(ur, arg); c = inb(ctport + CTstatus); if(c & Error) return; if((c & Rready) == 0) return; c = inb(ctport + CTdata); ps2mouseputc(c); } . 238,272d 133,135d ## diffname pc/kbd.c 1993/1221 ## diff -e /n/fornaxdump/1993/1124/sys/src/brazil/pc/kbd.c /n/fornaxdump/1993/1221/sys/src/brazil/pc/kbd.c 253c NS16552special(port, setspeed, &mouseq, 0, NS16552mouse); . 251c NS16552special(port, setspeed, &mouseq, 0, NS16552m3mouse); . 133,134d ## diffname pc/kbd.c 1994/0205 ## diff -e /n/fornaxdump/1993/1221/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0205/sys/src/brazil/pc/kbd.c 390c if(mousetype == MousePS2) ps2mouseputc(c); . ## diffname pc/kbd.c 1994/0216 ## diff -e /n/fornaxdump/1994/0205/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0216/sys/src/brazil/pc/kbd.c 597c } else if(strcmp(field[0], "swap") == 0) mouseswap ^= 1; . ## diffname pc/kbd.c 1994/0317 ## diff -e /n/fornaxdump/1994/0216/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0317/sys/src/brazil/pc/kbd.c 625c ccc |= Csf | Ckbdint | Cscs1 | Cmousedis; . 567c ps2mouse(0); . 535a setvec(Mousevec, kbdintr, 0); . 532,533c if(outready() < 0){ splx(x); return; } . 519d 512,513c if(mousetype == MousePS2) return; . 508c ps2mouse(int frominit) . 239c if(mousetype == Mouseserial) . ## diffname pc/kbd.c 1994/0322 ## diff -e /n/fornaxdump/1994/0317/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0322/sys/src/brazil/pc/kbd.c 625a /* disable mouse */ . 569c ps2mouse(); . 508c ps2mouse(void) . ## diffname pc/kbd.c 1994/0413 ## diff -e /n/fornaxdump/1994/0322/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0413/sys/src/brazil/pc/kbd.c 10d ## diffname pc/kbd.c 1994/0503 ## diff -e /n/fornaxdump/1994/0413/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0503/sys/src/brazil/pc/kbd.c 493c collecting = 1; nk = 0; . 479a kc[nk++] = c; c = latin1(kc, nk); if(c < -1) /* need more keystrokes */ return; if(c != -1) /* valid sequence */ kbdputc(kbdq, c); else /* dump characters */ for(i=0; i= 3 || port < 0) . ## diffname pc/kbd.c 1994/0826 ## diff -e /n/fornaxdump/1994/0825/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0826/sys/src/brazil/pc/kbd.c 215a ushort *s = (ushort*)(KZERO|0x472); *s = 0x1234; /* BIOS warm-boot flag */ . ## diffname pc/kbd.c 1994/0902 ## diff -e /n/fornaxdump/1994/0826/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0902/sys/src/brazil/pc/kbd.c 599a qnoblock(kbdq, 1); . 259c ns16552special(port, setspeed, &mouseq, 0, mouseputc); . 257c ns16552special(port, setspeed, &mouseq, 0, m3mouseputc); . ## diffname pc/kbd.c 1994/0923 ## diff -e /n/fornaxdump/1994/0902/sys/src/brazil/pc/kbd.c /n/fornaxdump/1994/0923/sys/src/brazil/pc/kbd.c 229,238c x = 0xDF; for(i = 0; i < 5; i++){ x ^= 1; outready(); outb(Cmd, 0xD1); outready(); outb(Data, x); /* toggle reset */ delay(100); } . 227c * Pulse it by hand (old somewhat reliable) . 225a . 216a int i, x; . ## diffname pc/kbd.c 1995/0105 ## diff -e /n/fornaxdump/1994/0923/sys/src/brazil/pc/kbd.c /n/fornaxdump/1995/0105/sys/src/brazil/pc/kbd.c 191c print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); . ## diffname pc/kbd.c 1995/0117 ## diff -e /n/fornaxdump/1995/0105/sys/src/brazil/pc/kbd.c /n/fornaxdump/1995/0117/sys/src/brazil/pc/kbd.c 546c n = getfields(arg, field, 3, " "); . ## diffname pc/kbd.c 1995/0207 ## diff -e /n/fornaxdump/1995/0117/sys/src/brazil/pc/kbd.c /n/fornaxdump/1995/0207/sys/src/brazil/pc/kbd.c 592a else error(Ebadctl); . ## diffname pc/kbd.c 1995/0330 ## diff -e /n/fornaxdump/1995/0207/sys/src/brazil/pc/kbd.c /n/fornaxdump/1995/0330/sys/src/brazil/pc/kbd.c 484a alt = 1; . 456a } . 455c if(ctl){ if(alt && c == Del) exit(0); . 440a case Latin: alt = 0; break; . 377a static int alt; . ## diffname pc/kbd.c 1995/1216 ## diff -e /n/fornaxdump/1995/0330/sys/src/brazil/pc/kbd.c /n/fornaxdump/1995/1216/sys/src/brazil/pc/kbd.c 583a break; default: mouseaccelerate("0"); . 576a default: mouseaccelerate(field[1]); break; . ## diffname pc/kbd.c 1996/0315 ## diff -e /n/fornaxdump/1995/1216/sys/src/brazil/pc/kbd.c /n/fornaxdump/1996/0315/sys/src/brazil/pc/kbd.c 554c n = parsefields(arg, field, 3, " "); . ## diffname pc/kbd.c 1997/0327 ## diff -e /n/fornaxdump/1996/0315/sys/src/brazil/pc/kbd.c /n/emeliedump/1997/0327/sys/src/brazil/pc/kbd.c 637c ccc |= Csf | Ckbdint | Cscs1; . 619c intrenable(VectorKBD, i8042intr, 0, BUSUNKNOWN); . 549,611d 545,547d 535,542c auxputc = putc; intrenable(VectorAUX, i8042intr, 0, BUSUNKNOWN); iunlock(&i8042lock); . 532c iunlock(&i8042lock); . 529,530c print(err); outb(Cmd, 0xA8); /* auxilliary device enable */ . 526c print(err); . 523,524c print(err); outb(Cmd, 0x60); /* write control register */ . 515,521c ilock(&i8042lock); . 512,513c /* enable kbd/aux xfers and interrupts */ ccc &= ~Cauxdis; ccc |= Cauxint; . 510c char *err = "i8042: aux init failed\n"; . 504,508c void i8042auxenable(void (*putc)(int, int)) . 489c shift = 1; . 446c shift = 0; . 400,401c if(auxputc != nil) auxputc(c, shift); . 397c * if it's the aux port... . 394a unlock(&i8042lock); . 389a } . 388c if(!(s&Inready)){ unlock(&i8042lock); . 386a lock(&i8042lock); . 382,383d 378d 374,376c static int alt, caps, ctl, num, shift; . 370c i8042intr(Ureg*, void*) . 321,366d 303,319d 264,298c if(c != 0xFA){ print("i8042: %2.2ux returned to the %2.2ux command\n", c, cmd); return -1; . 254,262c ilock(&i8042lock); do{ if(tries++ > 2) break; if(outready() < 0) break; outb(Cmd, 0xD4); if(outready() < 0) break; outb(Data, cmd); if(outready() < 0) break; if(inready() < 0) break; c = inb(Data); } while(c == 0xFE || c == 0); iunlock(&i8042lock); . 251,252c c = 0; tries = 0; . 248,249c unsigned int c; int tries; . 242,246c int i8042auxcmd(int cmd) . 225c outb(Cmd, 0xFE); . 222c * newer reset the machine command . 165,210d 131a static Lock i8042lock; static uchar ccc; static void (*auxputc)(int, int); . 128c Cauxint= (1<<1), /* mouse interrupt enable */ . 125c Cauxdis= (1<<5), /* mouse disable */ . 116,120d 39,65c Home= KF|13, Up= KF|14, Pgup= KF|15, Print= KF|16, Left= View, Right= View, End= '\r', Down= View, Pgdown= View, Ins= KF|20, Del= 0x7F, . 37c PF= Spec|0x20, /* num pad function key */ View= Spec|0x00, /* view (shift window up) */ KF= Spec|0x40, /* function key */ Shift= Spec|0x60, Break= Spec|0x61, Ctrl= Spec|0x62, Latin= Spec|0x63, Caps= Spec|0x64, Num= Spec|0x65, Middle= Spec|0x66, No= 0x00, /* peter */ . 26,35c Spec= 0x80, . 24c Cmd= 0x64, /* command port (write only) */ . 14,21c Status= 0x64, /* status port */ Inready= 0x01, /* input character ready */ Outbusy= 0x02, /* output busy */ Sysflag= 0x04, /* system flag */ Cmddata= 0x08, /* cmd==0, data==1 */ Inhibit= 0x10, /* keyboard/mouse inhibited */ Minready= 0x20, /* mouse character ready */ Rtimeout= 0x40, /* general timeout */ . 12c Data= 0x60, /* data port */ . 9,10d ## diffname pc/kbd.c 1997/1101 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/pc/kbd.c /n/emeliedump/1997/1101/sys/src/brazil/pc/kbd.c 152c ushort *s = KADDR(0x472); . ## diffname pc/kbd.c 1997/1105 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/pc/kbd.c /n/emeliedump/1997/1105/sys/src/brazil/pc/kbd.c 382a if(kbdq == nil) panic("kbdinit"); . ## diffname pc/kbd.c 1998/0207 ## diff -e /n/emeliedump/1997/1105/sys/src/brazil/pc/kbd.c /n/emeliedump/1998/0207/sys/src/brazil/pc/kbd.c 264c c |= keyup; if(c != 0xFF) /* these come fairly often: CAPSLOCK U Y */ print("unknown key %ux\n", c); . ## diffname pc/kbd.c 1998/0910 ## diff -e /n/emeliedump/1998/0207/sys/src/brazil/pc/kbd.c /n/emeliedump/1998/0910/sys/src/brazil/pc/kbd.c 389c intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN); . 375c intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN); . ## diffname pc/kbd.c 1998/1006 ## diff -e /n/emeliedump/1998/0910/sys/src/brazil/pc/kbd.c /n/emeliedump/1998/1006/sys/src/brazil/pc/kbd.c 96a [0x60] No, No, No, No, No, No, No, No, [0x68] No, No, No, No, No, No, No, No, [0x70] No, No, No, No, No, No, No, No, [0x78] No, KF|14, No, No, No, No, No, No, . 80a [0x60] No, No, No, No, No, No, No, No, [0x68] No, No, No, No, No, No, No, No, [0x70] No, No, No, No, No, No, No, No, [0x78] No, KF|14, No, KF|14, No, No, No, No, . 64a [0x60] No, No, No, No, No, No, No, No, [0x68] No, No, No, No, No, No, No, No, [0x70] No, No, No, No, No, No, No, No, [0x78] No, View, No, KF|14, No, No, No, No, . ## diffname pc/kbd.c 1999/0713 ## diff -e /n/emeliedump/1998/1006/sys/src/brazil/pc/kbd.c /n/emeliedump/1999/0713/sys/src/brazil/pc/kbd.c 400a ioalloc(Data, 1, 0); ioalloc(Cmd, 1, 0); . ## diffname pc/kbd.c 1999/0714 ## diff -e /n/emeliedump/1999/0713/sys/src/brazil/pc/kbd.c /n/emeliedump/1999/0714/sys/src/brazil/pc/kbd.c 401,402c ioalloc(Data, 1, 0, "kbd"); ioalloc(Cmd, 1, 0, "kbd"); . ## diffname pc/kbd.c 1999/0819 ## diff -e /n/emeliedump/1999/0714/sys/src/brazil/pc/kbd.c /n/emeliedump/1999/0819/sys/src/brazil/pc/kbd.c 404c intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); . 387c intrenable(IrqAUX, i8042intr, 0, BUSUNKNOWN, "kbdaux"); . ## diffname pc/kbd.c 1999/1005 ## diff -e /n/emeliedump/1999/0819/sys/src/brazil/pc/kbd.c /n/emeliedump/1999/1005/sys/src/brazil/pc/kbd.c 317c if(!(c & (Spec|KF))){ . 234c static Rune kc[5]; . 91c Rune kbtabesc1[] = . 71c Rune kbtabshift[] = . 51c Rune kbtab[] = . 46c Pgdown= KF|19, . 42,43c Left= KF|17, Right= KF|18, . 28c KF= 0xF000, /* function key (begin Unicode private space) */ . ## diffname pc/kbd.c 1999/1207 ## diff -e /n/emeliedump/1999/1005/sys/src/brazil/pc/kbd.c /n/emeliedump/1999/1207/sys/src/9/pc/kbd.c 108c [0x78] No, No, No, No, No, No, No, No, . 88c [0x78] No, No, No, No, No, No, No, No, . 81c [0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7', . 68c [0x78] No, No, No, No, No, No, No, No, . 61c [0x40] KF|6, KF|7, KF|8, KF|9, KF|10, Num, Scroll, '7', . 48a Scroll= KF|21, . ## diffname pc/kbd.c 2000/0107 ## diff -e /n/emeliedump/1999/1207/sys/src/9/pc/kbd.c /n/emeliedump/2000/0107/sys/src/9/pc/kbd.c 109c [0x78] No, Up, No, No, No, No, No, No, . 89c [0x78] No, Up, No, Up, No, No, No, No, . 69c [0x78] No, View, No, Up, No, No, No, No, . 51a /* * The codes at 0x79 and 0x81 are produed by the PFU Happy Hacking keyboard. * A 'standard' keyboard doesn't produce anything above 0x58. */ . ## diffname pc/kbd.c 2002/0411 ## diff -e /n/emeliedump/2000/0107/sys/src/9/pc/kbd.c /n/emeliedump/2002/0411/sys/src/9/pc/kbd.c 434a } void kbdenable(void) { kbdq = qopen(4*1024, 0, 0, 0); if(kbdq == nil) panic("kbdinit"); qnoblock(kbdq, 1); ioalloc(Data, 1, 0, "kbd"); ioalloc(Cmd, 1, 0, "kbd"); intrenable(IrqKBD, i8042intr, 0, BUSUNKNOWN, "kbd"); . 401,410d ## diffname pc/kbd.c 2002/0417 ## diff -e /n/emeliedump/2002/0411/sys/src/9/pc/kbd.c /n/emeliedump/2002/0417/sys/src/9/pc/kbd.c 360a collecting = 0; nk = 0; . 357,358c /* * VMware uses Ctl-Alt as the key combination * to make the VM give up keyboard and mouse focus. * This has the unfortunate side effect that when you * come back into focus, Plan 9 thinks you want to type * a compose sequence (you just typed alt). * * As a clusmy hack around this, we look for ctl-alt * and don't treat it as the start of a compose sequence. */ if(!ctl){ collecting = 1; nk = 0; } . ## diffname pc/kbd.c 2002/0506 ## diff -e /n/emeliedump/2002/0417/sys/src/9/pc/kbd.c /n/emeliedump/2002/0506/sys/src/9/pc/kbd.c 453a . 228a int i8042auxcmds(uchar *cmd, int ncmd) { int i; ilock(&i8042lock); for(i=0; i