## diffname carrera/kbd.c 1993/0907 ## diff -e /dev/null /n/fornaxdump/1993/0907/sys/src/brazil/carrera/kbd.c 0a #include "u.h" #include "../port/lib.h" #include "mem.h" #include "dat.h" #include "fns.h" #include "io.h" #include "../port/error.h" #include "devtab.h" enum { /* * commands */ Krdcmd= 0x20, /* read command byte */ Kwrcmd= 0x60, /* write command byte */ Kselftest= 0xAA, /* self test */ Ktest= 0xAB, /* keyboard test */ Kdisable= 0xAD, /* disable keyboard */ Kenable= 0xAE, /* enable keyboard */ Krdin= 0xC0, /* read input port */ Krdout= 0xD0, /* read output port */ Kwrout= 0xD1, /* write output port */ Krdtest= 0xE0, /* read test inputs */ Kwrlights= 0xED, /* set lights */ Kreset= 0xF0, /* soft reset */ /* * magic characters */ Msetscan= 0xF0, /* set scan type (0 == unix) */ Menable= 0xF4, /* enable the keyboard */ Mdisable= 0xF5, /* disable the keyboard */ Mdefault= 0xF6, /* set defaults */ Mreset= 0xFF, /* reset the keyboard */ /* * responses from keyboard */ Rok= 0xAA, /* self test OK */ Recho= 0xEE, /* ??? */ Rack= 0xFA, /* command acknowledged */ Rfail= 0xFC, /* self test failed */ Rresend= 0xFE, /* ??? */ Rovfl= 0xFF, /* input overflow */ /* * command register bits */ Cintena= 1<<0, /* enable output interrupt */ Csystem= 1<<2, /* set system */ Cinhibit= 1<<3, /* inhibit override */ Cdisable= 1<<4, /* disable keyboard */ /* * output port bits */ Osoft= 1<<0, /* soft reset bit (must be 1?) */ Oparity= 1<<1, /* force bad parity */ Omemtype= 1<<2, /* simm type (1 = 4Mb, 0 = 1Mb) */ Obigendian= 1<<3, /* big endian */ Ointena= 1<<4, /* enable interrupt */ Oclear= 1<<5, /* clear expansion slot interrupt */ /* * status bits */ Sobf= 1<<0, /* output buffer full */ Sibf= 1<<1, /* input buffer full */ Ssys= 1<<2, /* set by self-test */ Slast= 1<<3, /* last access was to data */ Senabled= 1<<4, /* keyboard is enabled */ Stxtimeout= 1<<5, /* transmit to kybd has timed out */ Srxtimeout= 1<<6, /* receive from kybd has timed out */ Sparity= 1<<7, /* parity on byte was even */ /* * light bits */ L1= 1<<0, /* light 1, network activity */ L2= 1<<2, /* light 2, caps lock */ L3= 1<<1, /* light 3, no label */ }; #define KBDCTL (*(uchar*)(KeyboardIO+Keyctl)) #define KBDDAT (*(uchar*)(KeyboardIO+Keydat)) #define OUTWAIT while(KBDCTL & Sibf); kdbdly(1) #define INWAIT while(!(KBDCTL & Sobf)); kdbdly(1) #define ACKWAIT INWAIT ; if(KBDDAT != Rack) print("bad response\n"); kdbdly(1) enum { 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, Up= Spec|0x70, /* key has come up */ No= Spec|0x7F, /* no mapping */ Tmask= Spec|0x60, }; uchar keymap[] = { [0] No, No, No, No, No, No, No, F|1, '\033', No, No, No, No, '\t', '`', F|2, [0x10] No, Ctrl, Shift, Shift, Shift, 'q', '1', F|3, No, Shift, 'z', 's', 'a', 'w', '2', F|4, [0x20] No, 'c', 'x', 'd', 'e', '4', '3', F|5, No, ' ', 'v', 'f', 't', 'r', '5', F|6, [0x30] No, 'n', 'b', 'h', 'g', 'y', '6', F|7, No, View, 'm', 'j', 'u', '7', '8', F|8, [0x40] No, ',', 'k', 'i', 'o', '0', '9', F|9, No, '.', '/', 'l', ';', 'p', '-', F|10, [0x50] No, No, '\'', No, '[', '=', F|11, '\r', Latin, Shift, '\n', ']', '\\', No, F|12, Break, [0x60] View, View, Break, Shift, '\177', No, '\b', No, No, '1', View, '4', '7', ',', No, No, [0x70] '0', '.', '2', '5', '6', '8', PF|1, PF|2, No, '\n', '3', No, PF|4, '9', PF|3, No, [0x80] No, No, No, No, '-', No, No, No, }; uchar skeymap[] = { [0] No, No, No, No, No, No, No, F|1, '\033', No, No, No, No, '\t', '~', F|2, [0x10] No, Ctrl, Shift, Shift, Shift, 'Q', '!', F|3, No, Shift, 'Z', 'S', 'A', 'W', '@', F|4, [0x20] No, 'C', 'X', 'D', 'E', '$', '#', F|5, No, ' ', 'V', 'F', 'T', 'R', '%', F|6, [0x30] No, 'N', 'B', 'H', 'G', 'Y', '^', F|7, No, View, 'M', 'J', 'U', '&', '*', F|8, [0x40] No, '<', 'K', 'I', 'O', ')', '(', F|9, No, '>', '?', 'L', ':', 'P', '_', F|10, [0x50] No, No, '"', No, '{', '+', F|11, '\r', Latin, Shift, '\n', '}', '|', No, F|12, Break, [0x60] View, View, Break, Shift, '\177', No, '\b', No, No, '1', View, '4', '7', ',', No, No, [0x70] '0', '.', '2', '5', '6', '8', PF|1, PF|2, No, '\n', '3', No, PF|4, '9', PF|3, No, [0x80] No, No, No, No, '-', No, No, No, }; struct Kbd { Lock; int l; } kbd; void kdbdly(int l) { int i; l *= 21; for(i=0; i 0x87) return 1; /* * convert */ if(shifted) ch = skeymap[code]; else ch = keymap[code]; iprint("code %d %d\n", code, ch); /* * normal character */ if(!(ch & Spec)){ if(ctrled) ch &= 0x1f; switch(lstate){ case 1: kc[0] = ch; lstate = 2; if(ch == 'X') lstate = 3; break; case 2: kc[1] = ch; c = latin1(kc); nk = 2; putit: lstate = 0; if(c != -1) kbdputc(kbdq, c); else { for(i=0; i 0x87) return 1; if(upcode){ ch = keymap[code]; . 195a static int upcode; . 170d 155c l *= 21; /* experimentally determined */ . ## diffname carrera/kbd.c 1993/1001 ## diff -e /n/fornaxdump/1993/0908/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1993/1001/sys/src/brazil/carrera/kbd.c 185a } void mouseintr(void) { uchar code; kbdwait(); code = KBDDAT; print("mouse intr %d\n", code); . 171d 169c if(KBDCTL & Sobf) . ## diffname carrera/kbd.c 1993/1003 ## diff -e /n/fornaxdump/1993/1001/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1993/1003/sys/src/brazil/carrera/kbd.c 393a mousecmd(0xEA); mousecmd(0xF4); . 392a OUTWAIT; KBDCTL = Kmseena; . 390c KBDDAT = Csystem | Cinhibit | Cintena | Cmseint; . 344a /* * send a command to the mouse */ static int mousecmd(int cmd) { int tries; unsigned int c; c = 0; tries = 0; do{ if(tries++ > 2) break; OUTWAIT; KBDCTL = 0xD4; OUTWAIT; KBDDAT = cmd; OUTWAIT; kbdwait(); c = KBDDAT; } while(c == 0xFE || c == 0); if(c != 0xFA){ print("mouse returns %2.2ux to the %2.2ux command\n", c, cmd); return -1; } return 0; } . 193,194c c = KBDDAT; /* * 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; buttons = b[msg[0]&7]; dx = msg[1]; dy = -msg[2]; mousetrack(buttons, dx, dy); } . 190c uchar c; static int nb; int buttons, dx, dy; static short msg[3]; static uchar b[] = {0, 1, 4, 5, 2, 3, 6, 7, 0, 1, 2, 5, 2, 3, 6, 7 }; . 48a Cmseint= 1<<1, /* enable mouse interrupt */ . 21a Kmseena= 0xA8, /* enable mouse */ . ## diffname carrera/kbd.c 1994/0201 ## diff -e /n/fornaxdump/1993/1003/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0201/sys/src/brazil/carrera/kbd.c 451,452c mousecmd(0xEA); /* streaming */ mousecmd(0xE8); /* set resolution */ mousecmd(3); mousecmd(0xF4); /* enabled */ . ## diffname carrera/kbd.c 1994/0306 ## diff -e /n/fornaxdump/1994/0201/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0306/sys/src/brazil/carrera/kbd.c 446,449d 444c KBDDAT = ccc; . 442c KBDCTL = 0x60; . 438,440d 421,436c /* enable kbd xfers and interrupts */ ccc &= ~Ckbddis; ccc |= Csf | Ckbdint | Cscs1 | Cmouseint; . 417,419c KBDCTL = 0x20; if(kbdwait() == 0) { print("kbdinit: can't read ccc\n"); ccc = 0; } else ccc = KBDDAT; . 413,415c /* wait for a quiescent controller */ . 337,351c USED(l); . 331c kbdputc(kbdq, c); . 306,329c else { switch(c){ case Caps: caps ^= 1; return; case Num: num ^= 1; return; case Shift: shift = 1; return; case Latin: lstate = 1; return; case Ctrl: ctl = 1; return; } . 304c return; . 301c kbdputc(kbdq, c); . 296c kc[4] = c; . 292c kc[lstate-2] = c; . 284,287c else for(i=0; i='a') c += 'A' - 'a'; . 254c else if(esc2){ esc2--; return; } else if(shift) c = kbtabshift[c]; else c = kbtab[c]; . 245,252c if(esc1){ c = kbtabesc1[c]; esc1 = 0; . 242,243c keyup = c&0x80; c &= 0x7f; if(c > sizeof kbtab){ print("unknown key %ux\n", c|keyup); return; } . 237,239c if(c == 0xe0){ esc1 = 1; return; } else if(c == 0xe1){ esc2 = 2; return; . 235c * e0's is the first of a 2 character sequence . 232c c = KBDDAT; . 228,229c static int shift; int keyup; . 226c static int esc1, esc2; static int caps; static int ctl; static int num; static int lstate; . 222c void . 178,188d 150a static uchar ccc; . 145d 125,142c 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, '\n', Ctrl, No, No, [0x20] No, No, No, No, No, No, No, No, [0x28] No, No, Shift, No, No, No, No, No, [0x30] 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, Left, No, Right, No, End, [0x50] Down, Pgdown, Ins, Del, No, No, No, No, [0x58] No, No, No, No, No, No, No, No, . 105,122c 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, '*', [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, [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, [0x58] KF|12, No, No, No, No, No, No, No, . 90,102c [0x00] No, 0x1b, '1', '2', '3', '4', '5', '6', [0x08] '7', '8', '9', '0', '-', '=', '\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, '*', [0x38] Latin, ' ', Ctrl, KF|1, KF|2, KF|3, KF|4, KF|5, [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, [0x58] KF|12, No, No, No, No, No, No, No, . 88c uchar kbtab[] = . 74,79c Spec= 0x80, 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 */ 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, . 47,63d 45a . 14,37d 12a /* 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 */ . ## diffname carrera/kbd.c 1994/0415 ## diff -e /n/fornaxdump/1994/0306/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0415/sys/src/brazil/carrera/kbd.c 372c return; . ## diffname carrera/kbd.c 1994/0423 ## diff -e /n/fornaxdump/1994/0415/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0423/sys/src/brazil/carrera/kbd.c 372c . ## diffname carrera/kbd.c 1994/0427 ## diff -e /n/fornaxdump/1994/0423/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0427/sys/src/brazil/carrera/kbd.c 372c return 0; . ## diffname carrera/kbd.c 1994/0428 ## diff -e /n/fornaxdump/1994/0427/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0428/sys/src/brazil/carrera/kbd.c 372c . ## diffname carrera/kbd.c 1994/0503 ## diff -e /n/fornaxdump/1994/0428/sys/src/brazil/carrera/kbd.c /n/fornaxdump/1994/0503/sys/src/brazil/carrera/kbd.c 371a return 0; . 307c collecting = 1; nk = 0; . 292a 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 #include "screen.h" . ## diffname carrera/kbd.c 1997/1101 ## diff -e /n/emeliedump/1997/0327/sys/src/brazil/carrera/kbd.c /n/emeliedump/1997/1101/sys/src/brazil/carrera/kbd.c 9c #define Image IMAGE #include . ## diffname carrera/kbd.c 1997/1105 ## diff -e /n/emeliedump/1997/1101/sys/src/brazil/carrera/kbd.c /n/emeliedump/1997/1105/sys/src/brazil/carrera/kbd.c 358a if(kbdq == nil) panic("kbdinit"); . ## diffname carrera/kbd.c 1998/0417 ## diff -e /n/emeliedump/1997/1105/sys/src/brazil/carrera/kbd.c /n/emeliedump/1998/0417/sys/src/brazil/carrera/kbd.c 413c else if(strcmp(field[0], "accelerated") == 0){ . 404c if(strncmp(field[0], "reset", 5) == 0){ . 400c mousectl(char* field[], int) . ## diffname carrera/kbd.c 1999/0119 ## diff -e /n/emeliedump/1998/0417/sys/src/brazil/carrera/kbd.c /n/emeliedump/1999/0119/sys/src/brazil/carrera/kbd.c 10a #include . ## diffname carrera/kbd.c 1999/1005 ## diff -e /n/emeliedump/1999/0119/sys/src/brazil/carrera/kbd.c /n/emeliedump/1999/1005/sys/src/brazil/carrera/kbd.c 202c static Rune kc[5]; . 111c Rune kbtabesc1[] = . 95c Rune kbtabshift[] = . 79c Rune kbtab[] = . 50c KF= 0xF000, /* function key (begin Unicode private space) */ . ## diffname carrera/kbd.c 1999/1104 ## diff -e /n/emeliedump/1999/1005/sys/src/brazil/carrera/kbd.c /n/emeliedump/1999/1104/sys/src/9/carrera/kbd.c 68c Pgdown= KF|19, . 64,65c Left= KF|17, Right= KF|18, . ## diffname carrera/kbd.c 2001/0527 # deleted ## diff -e /n/emeliedump/1999/1104/sys/src/9/carrera/kbd.c /n/emeliedump/2001/0527/sys/src/9/carrera/kbd.c 1,421d