1*41078Swilliam /*- 2*41078Swilliam * Copyright (c) 1990 The Regents of the University of California. 3*41078Swilliam * All rights reserved. 4*41078Swilliam * 5*41078Swilliam * This code is derived from software contributed to Berkeley by 6*41078Swilliam * William Jolitz. 7*41078Swilliam * 8*41078Swilliam * %sccs.include.noredist.c% 9*41078Swilliam * 10*41078Swilliam * @(#)kbd.c 7.1 (Berkeley) 04/24/90 11*41078Swilliam */ 12*41078Swilliam 13*41078Swilliam #define L 0x01 /* locking function */ 14*41078Swilliam #define SHF 0x02 /* keyboard shift */ 15*41078Swilliam #define ALT 0x04 /* alternate shift -- alternate chars */ 16*41078Swilliam #define NUM 0x08 /* numeric shift cursors vs. numeric */ 17*41078Swilliam #define CTL 0x10 /* control shift -- allows ctl function */ 18*41078Swilliam #define CPS 0x20 /* caps shift -- swaps case of letter */ 19*41078Swilliam #define ASCII 0x40 /* ascii code for this key */ 20*41078Swilliam #define STP 0x80 /* stop output */ 21*41078Swilliam 22*41078Swilliam typedef unsigned char u_char; 23*41078Swilliam 24*41078Swilliam u_char inb(); 25*41078Swilliam 26*41078Swilliam u_char action[] = { 27*41078Swilliam 0, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 0- 7 */ 28*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 8-15 */ 29*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 16-23 */ 30*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, CTL, ASCII, ASCII, /* scan 24-31 */ 31*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 32-39 */ 32*41078Swilliam ASCII, ASCII, SHF , ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 40-47 */ 33*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, SHF, ASCII, /* scan 48-55 */ 34*41078Swilliam ALT, ASCII, CPS|L, 0, 0, ASCII, 0, 0, /* scan 56-63 */ 35*41078Swilliam 0, 0, 0, 0, 0, NUM|L, STP|L, ASCII, /* scan 64-71 */ 36*41078Swilliam ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, ASCII, /* scan 72-79 */ 37*41078Swilliam ASCII, ASCII, ASCII, ASCII, 0, 0, 0, 0, /* scan 80-87 */ 38*41078Swilliam 0,0,0,0,0,0,0,0, 39*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 40*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, } ; 41*41078Swilliam 42*41078Swilliam u_char unshift[] = { /* no shift */ 43*41078Swilliam 0, 033 , '1' , '2' , '3' , '4' , '5' , '6' , /* scan 0- 7 */ 44*41078Swilliam '7' , '8' , '9' , '0' , '-' , '=' , 0177 ,'\t' , /* scan 8-15 */ 45*41078Swilliam 46*41078Swilliam 'q' , 'w' , 'e' , 'r' , 't' , 'y' , 'u' , 'i' , /* scan 16-23 */ 47*41078Swilliam 'o' , 'p' , '[' , ']' , '\r' , CTL , 'a' , 's' , /* scan 24-31 */ 48*41078Swilliam 49*41078Swilliam 'd' , 'f' , 'g' , 'h' , 'j' , 'k' , 'l' , ';' , /* scan 32-39 */ 50*41078Swilliam '\'' , '`' , SHF , '\\' , 'z' , 'x' , 'c' , 'v' , /* scan 40-47 */ 51*41078Swilliam 52*41078Swilliam 'b' , 'n' , 'm' , ',' , '.' , '/' , SHF , '*', /* scan 48-55 */ 53*41078Swilliam ALT , ' ' , CPS|L, 0, 0, ' ' , 0, 0, /* scan 56-63 */ 54*41078Swilliam 55*41078Swilliam 0, 0, 0, 0, 0, NUM|L, STP|L, '7', /* scan 64-71 */ 56*41078Swilliam '8', '9', '-', '4', '5', '6', '+', '1', /* scan 72-79 */ 57*41078Swilliam 58*41078Swilliam '2', '3', '0', '.', 0, 0, 0, 0, /* scan 80-87 */ 59*41078Swilliam 0,0,0,0,0,0,0,0, 60*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 61*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, } ; 62*41078Swilliam 63*41078Swilliam u_char shift[] = { /* shift shift */ 64*41078Swilliam 0, 033 , '!' , '@' , '#' , '$' , '%' , '^' , /* scan 0- 7 */ 65*41078Swilliam '&' , '*' , '(' , ')' , '_' , '+' , 0177 ,'\t' , /* scan 8-15 */ 66*41078Swilliam 'Q' , 'W' , 'E' , 'R' , 'T' , 'Y' , 'U' , 'I' , /* scan 16-23 */ 67*41078Swilliam 'O' , 'P' , '[' , ']' , '\r' , CTL , 'A' , 'S' , /* scan 24-31 */ 68*41078Swilliam 'D' , 'F' , 'G' , 'H' , 'J' , 'K' , 'L' , ':' , /* scan 32-39 */ 69*41078Swilliam '"' , '~' , SHF , '|' , 'Z' , 'X' , 'C' , 'V' , /* scan 40-47 */ 70*41078Swilliam 'B' , 'N' , 'M' , '<' , '>' , '?' , SHF , '*', /* scan 48-55 */ 71*41078Swilliam ALT , ' ' , CPS|L, 0, 0, ' ' , 0, 0, /* scan 56-63 */ 72*41078Swilliam 0, 0, 0, 0, 0, NUM|L, STP|L, '7', /* scan 64-71 */ 73*41078Swilliam '8', '9', '-', '4', '5', '6', '+', '1', /* scan 72-79 */ 74*41078Swilliam '2', '3', '0', '.', 0, 0, 0, 0, /* scan 80-87 */ 75*41078Swilliam 0,0,0,0,0,0,0,0, 76*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 77*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, } ; 78*41078Swilliam 79*41078Swilliam u_char ctl[] = { /* CTL shift */ 80*41078Swilliam 0, 033 , '!' , 000 , '#' , '$' , '%' , 036 , /* scan 0- 7 */ 81*41078Swilliam '&' , '*' , '(' , ')' , 037 , '+' , 034 ,'\177', /* scan 8-15 */ 82*41078Swilliam 021 , 027 , 005 , 022 , 024 , 031 , 025 , 011 , /* scan 16-23 */ 83*41078Swilliam 017 , 020 , 033 , 035 , '\r' , CTL , 001 , 013 , /* scan 24-31 */ 84*41078Swilliam 004 , 006 , 007 , 010 , 012 , 013 , 014 , ';' , /* scan 32-39 */ 85*41078Swilliam '\'' , '`' , SHF , 034 , 032 , 030 , 003 , 026 , /* scan 40-47 */ 86*41078Swilliam 002 , 016 , 015 , '<' , '>' , '?' , SHF , '*', /* scan 48-55 */ 87*41078Swilliam ALT , ' ' , CPS|L, 0, 0, ' ' , 0, 0, /* scan 56-63 */ 88*41078Swilliam CPS|L, 0, 0, 0, 0, 0, 0, 0, /* scan 64-71 */ 89*41078Swilliam 0, 0, 0, 0, 0, 0, 0, 0, /* scan 72-79 */ 90*41078Swilliam 0, 0, 0, 0, 0, 0, 0, 0, /* scan 80-87 */ 91*41078Swilliam 0, 0, 033, '7' , '4' , '1' , 0, NUM|L, /* scan 88-95 */ 92*41078Swilliam '8' , '5' , '2' , 0, STP|L, '9' , '6' , '3' , /*scan 96-103*/ 93*41078Swilliam '.' , 0, '*' , '-' , '+' , 0, 0, 0, /*scan 104-111*/ 94*41078Swilliam 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, } ; 95*41078Swilliam 96*41078Swilliam #ifdef notdef 97*41078Swilliam struct key { 98*41078Swilliam u_short action; /* how this key functions */ 99*41078Swilliam char ascii[8]; /* ascii result character indexed by shifts */ 100*41078Swilliam }; 101*41078Swilliam #endif 102*41078Swilliam 103*41078Swilliam u_char shfts, ctls, alts, caps, num, stp; 104*41078Swilliam 105*41078Swilliam #define KBSTATP 0x64 /* kbd status port */ 106*41078Swilliam #define KBS_INP_BUF_FUL 0x02 /* kbd char ready */ 107*41078Swilliam #define KBDATAP 0x60 /* kbd data port */ 108*41078Swilliam #define KBSTATUSPORT 0x61 /* kbd status */ 109*41078Swilliam 110*41078Swilliam u_char odt; 111*41078Swilliam 112*41078Swilliam u_char kbd() { 113*41078Swilliam u_char dt, brk, act; 114*41078Swilliam 115*41078Swilliam loop: 116*41078Swilliam do { 117*41078Swilliam while (inb(0x64)&2) ; 118*41078Swilliam dt = inb(0x60); 119*41078Swilliam } while (dt == odt); 120*41078Swilliam odt = dt; 121*41078Swilliam 122*41078Swilliam brk = dt & 0x80 ; dt = dt & 0x7f ; 123*41078Swilliam 124*41078Swilliam act = action[dt]; 125*41078Swilliam if (act&SHF) { 126*41078Swilliam if(brk) shfts = 0; else shfts = 1; 127*41078Swilliam } 128*41078Swilliam if (act&ALT) { 129*41078Swilliam if(brk) alts = 0; else alts = 1; 130*41078Swilliam } 131*41078Swilliam if (act&NUM) { 132*41078Swilliam if (act&L) { 133*41078Swilliam if(!brk) num ^= 1; 134*41078Swilliam } else if(brk) num = 0; else num = 1; 135*41078Swilliam } 136*41078Swilliam if (act&CTL) { 137*41078Swilliam if(brk) ctls = 0; else ctls = 1; 138*41078Swilliam } 139*41078Swilliam if (act&CPS) { 140*41078Swilliam if (act&L) { 141*41078Swilliam if(!brk) caps ^= 1; 142*41078Swilliam } else if(brk) caps = 0; else caps = 1; 143*41078Swilliam } 144*41078Swilliam if (act&STP) { 145*41078Swilliam if (act&L) { 146*41078Swilliam if(!brk) stp ^= 1; 147*41078Swilliam } else if(brk) stp = 0; else stp = 1; 148*41078Swilliam } 149*41078Swilliam if ((act&ASCII) && !brk) { 150*41078Swilliam u_char chr; 151*41078Swilliam 152*41078Swilliam if (shfts){ 153*41078Swilliam chr = shift[dt] ; } else { 154*41078Swilliam if (ctls) { 155*41078Swilliam chr = ctl[dt] ; } else { 156*41078Swilliam chr = unshift[dt] ; } } 157*41078Swilliam if (caps && (chr >= 'a' && chr <= 'z')) { 158*41078Swilliam chr -= 'a' - 'A' ; 159*41078Swilliam } 160*41078Swilliam return(chr); 161*41078Swilliam } 162*41078Swilliam goto loop; 163*41078Swilliam } 164