1*56877Sakito /* 2*56877Sakito * Copyright (c) 1992 OMRON Corporation. 3*56877Sakito * Copyright (c) 1992 The Regents of the University of California. 4*56877Sakito * All rights reserved. 5*56877Sakito * 6*56877Sakito * This code is derived from software contributed to Berkeley by 7*56877Sakito * OMRON Corporation. 8*56877Sakito * 9*56877Sakito * %sccs.include.redist.c% 10*56877Sakito * 11*56877Sakito * @(#)kbd.c 7.1 (Berkeley) 11/17/92 12*56877Sakito */ 13*56877Sakito 14*56877Sakito /* 15*56877Sakito * kbd.c -- 16*56877Sakito * 17*56877Sakito */ 18*56877Sakito 19*56877Sakito 20*56877Sakito #include "bmc.h" 21*56877Sakito #if NBMC > 0 22*56877Sakito 23*56877Sakito #include "param.h" 24*56877Sakito #include "kbdreg.h" 25*56877Sakito 26*56877Sakito 27*56877Sakito struct kbd_keymap kbd_keymap[] = { 28*56877Sakito KC_IGNORE, 0, 0, /* 0 [0x00] */ 29*56877Sakito KC_IGNORE, 0, 0, /* 1 [0x01] */ 30*56877Sakito KC_IGNORE, 0, 0, /* 2 [0x02] */ 31*56877Sakito KC_IGNORE, 0, 0, /* 3 [0x03] */ 32*56877Sakito KC_IGNORE, 0, 0, /* 4 [0x04] */ 33*56877Sakito KC_IGNORE, 0, 0, /* 5 [0x05] */ 34*56877Sakito KC_IGNORE, 0, 0, /* 6 [0x06] */ 35*56877Sakito KC_IGNORE, 0, 0, /* 7 [0x07] */ 36*56877Sakito KC_IGNORE, 0, 0, /* 8 [0x08] */ 37*56877Sakito KC_CODE, 0x09, 0x09, /* 9 [0x09] TAB */ 38*56877Sakito KC_SHIFT, KS_CTRL, KS_CTRL, /* 10 [0x0A] CTRL */ 39*56877Sakito KC_IGNORE, 0, 0, /* 11 [0x0B] */ 40*56877Sakito KC_SHIFT, KS_SHIFT, KS_SHIFT, /* 12 [0x0C] SHIFT */ 41*56877Sakito KC_SHIFT, KS_SHIFT, KS_SHIFT, /* 13 [0x0D] SHIFT */ 42*56877Sakito KC_IGNORE, 0, 0, /* 14 [0x0E] */ 43*56877Sakito KC_SHIFT, KS_META, KS_META, /* 15 [0x0F] META */ 44*56877Sakito KC_CODE, 0x1B, 0x1B, /* 16 [0x10] ESC */ 45*56877Sakito KC_CODE, 0x08, 0x08, /* 17 [0x11] BS */ 46*56877Sakito KC_CODE, 0x0D, 0x0D, /* 18 [0x12] CR */ 47*56877Sakito KC_IGNORE, 0, 0, /* 19 [0x13] */ 48*56877Sakito KC_CODE, 0x20, 0x20, /* 20 [0x14] SP */ 49*56877Sakito KC_CODE, 0x7F, 0x7F, /* 21 [0x15] DEL */ 50*56877Sakito KC_IGNORE, 0, 0, /* 22 [0x16] */ 51*56877Sakito KC_IGNORE, 0, 0, /* 23 [0x17] */ 52*56877Sakito KC_IGNORE, 0, 0, /* 24 [0x18] */ 53*56877Sakito KC_IGNORE, 0, 0, /* 25 [0x19] */ 54*56877Sakito KC_IGNORE, 0, 0, /* 26 [0x1A] */ 55*56877Sakito KC_IGNORE, 0, 0, /* 27 [0x1B] */ 56*56877Sakito KC_IGNORE, 0, 0, /* 28 [0x1C] */ 57*56877Sakito KC_IGNORE, 0, 0, /* 29 [0x1D] */ 58*56877Sakito KC_IGNORE, 0, 0, /* 30 [0x1E] */ 59*56877Sakito KC_IGNORE, 0, 0, /* 31 [0x1F] */ 60*56877Sakito KC_IGNORE, 0, 0, /* 32 [0x20] */ 61*56877Sakito KC_IGNORE, 0, 0, /* 33 [0x21] */ 62*56877Sakito KC_CODE, 0x31, 0x21, /* 34 [0x22] 1 */ 63*56877Sakito KC_CODE, 0x32, 0x22, /* 35 [0x23] 2 */ 64*56877Sakito KC_CODE, 0x33, 0x23, /* 36 [0x24] 3 */ 65*56877Sakito KC_CODE, 0x34, 0x24, /* 37 [0x25] 4 */ 66*56877Sakito KC_CODE, 0x35, 0x25, /* 38 [0x26] 5 */ 67*56877Sakito KC_CODE, 0x36, 0x26, /* 39 [0x27] 6 */ 68*56877Sakito KC_CODE, 0x37, 0x27, /* 40 [0x28] 7 */ 69*56877Sakito KC_CODE, 0x38, 0x28, /* 41 [0x29] 8 */ 70*56877Sakito KC_CODE, 0x39, 0x29, /* 42 [0x2A] 9 */ 71*56877Sakito KC_CODE, 0x30, 0x30, /* 43 [0x2B] 0 */ 72*56877Sakito KC_CODE, 0x2D, 0x3D, /* 44 [0x2C] - */ 73*56877Sakito KC_CODE, 0x5E, 0x7E, /* 45 [0x2D] ^ */ 74*56877Sakito KC_CODE, 0x5C, 0x7C, /* 46 [0x2E] \ */ 75*56877Sakito KC_IGNORE, 0, 0, /* 47 [0x2F] */ 76*56877Sakito KC_IGNORE, 0, 0, /* 48 [0x30] */ 77*56877Sakito KC_IGNORE, 0, 0, /* 49 [0x31] */ 78*56877Sakito KC_CODE, 0x71, 0x51, /* 50 [0x32] q */ 79*56877Sakito KC_CODE, 0x77, 0x57, /* 51 [0x33] w */ 80*56877Sakito KC_CODE, 0x65, 0x45, /* 52 [0x34] e */ 81*56877Sakito KC_CODE, 0x72, 0x52, /* 53 [0x35] r */ 82*56877Sakito KC_CODE, 0x74, 0x54, /* 54 [0x36] t */ 83*56877Sakito KC_CODE, 0x79, 0x59, /* 55 [0x37] y */ 84*56877Sakito KC_CODE, 0x75, 0x55, /* 56 [0x38] u */ 85*56877Sakito KC_CODE, 0x69, 0x49, /* 57 [0x39] i */ 86*56877Sakito KC_CODE, 0x6F, 0x4F, /* 58 [0x3A] o */ 87*56877Sakito KC_CODE, 0x70, 0x50, /* 59 [0x3B] p */ 88*56877Sakito KC_CODE, 0x40, 0x60, /* 60 [0x3C] @ */ 89*56877Sakito KC_CODE, 0x5B, 0x7B, /* 61 [0x3D] [ */ 90*56877Sakito KC_IGNORE, 0, 0, /* 62 [0x3E] */ 91*56877Sakito KC_IGNORE, 0, 0, /* 63 [0x3F] */ 92*56877Sakito KC_IGNORE, 0, 0, /* 64 [0x40] */ 93*56877Sakito KC_IGNORE, 0, 0, /* 65 [0x41] */ 94*56877Sakito KC_CODE, 0x61, 0x41, /* 66 [0x42] a */ 95*56877Sakito KC_CODE, 0x73, 0x53, /* 67 [0x43] s */ 96*56877Sakito KC_CODE, 0x64, 0x44, /* 68 [0x44] d */ 97*56877Sakito KC_CODE, 0x66, 0x46, /* 69 [0x45] f */ 98*56877Sakito KC_CODE, 0x67, 0x47, /* 70 [0x46] g */ 99*56877Sakito KC_CODE, 0x68, 0x48, /* 71 [0x47] h */ 100*56877Sakito KC_CODE, 0x6A, 0x4A, /* 72 [0x48] j */ 101*56877Sakito KC_CODE, 0x6B, 0x4B, /* 73 [0x49] k */ 102*56877Sakito KC_CODE, 0x6C, 0x4C, /* 74 [0x4A] l */ 103*56877Sakito KC_CODE, 0x3B, 0x2B, /* 75 [0x4B] ; */ 104*56877Sakito KC_CODE, 0x3A, 0x2A, /* 76 [0x4C] : */ 105*56877Sakito KC_CODE, 0x5D, 0x7D, /* 77 [0x4D] ] */ 106*56877Sakito KC_IGNORE, 0, 0, /* 78 [0x4E] */ 107*56877Sakito KC_IGNORE, 0, 0, /* 79 [0x4F] */ 108*56877Sakito KC_IGNORE, 0, 0, /* 80 [0x50] */ 109*56877Sakito KC_IGNORE, 0, 0, /* 81 [0x51] */ 110*56877Sakito KC_CODE, 0x7A, 0x5A, /* 82 [0x52] z */ 111*56877Sakito KC_CODE, 0x78, 0x58, /* 83 [0x53] x */ 112*56877Sakito KC_CODE, 0x63, 0x43, /* 84 [0x54] c */ 113*56877Sakito KC_CODE, 0x76, 0x56, /* 85 [0x55] v */ 114*56877Sakito KC_CODE, 0x62, 0x42, /* 86 [0x56] b */ 115*56877Sakito KC_CODE, 0x6E, 0x4E, /* 87 [0x57] n */ 116*56877Sakito KC_CODE, 0x6D, 0x4D, /* 88 [0x58] m */ 117*56877Sakito KC_CODE, 0x6B, 0x3C, /* 89 [0x59] , */ 118*56877Sakito KC_CODE, 0x6C, 0x3E, /* 90 [0x5A] . */ 119*56877Sakito KC_CODE, 0x3B, 0x3F, /* 91 [0x5B] / */ 120*56877Sakito KC_CODE, 0x5F, 0x5F, /* 92 [0x5C] _ */ 121*56877Sakito KC_IGNORE, 0, 0, /* 93 [0x5D] */ 122*56877Sakito KC_IGNORE, 0, 0, /* 94 [0x5E] */ 123*56877Sakito KC_IGNORE, 0, 0, /* 95 [0x5F] */ 124*56877Sakito KC_IGNORE, 0, 0, /* 96 [0x60] */ 125*56877Sakito KC_IGNORE, 0, 0, /* 97 [0x61] */ 126*56877Sakito KC_IGNORE, 0, 0, /* 98 [0x62] */ 127*56877Sakito KC_IGNORE, 0, 0, /* 99 [0x63] */ 128*56877Sakito KC_IGNORE, 0, 0, /* 100 [0x64] */ 129*56877Sakito KC_IGNORE, 0, 0, /* 101 [0x65] */ 130*56877Sakito KC_IGNORE, 0, 0, /* 102 [0x66] */ 131*56877Sakito KC_IGNORE, 0, 0, /* 103 [0x67] */ 132*56877Sakito KC_IGNORE, 0, 0, /* 104 [0x68] */ 133*56877Sakito KC_IGNORE, 0, 0, /* 105 [0x69] */ 134*56877Sakito KC_IGNORE, 0, 0, /* 106 [0x6A] */ 135*56877Sakito KC_IGNORE, 0, 0, /* 107 [0x6B] */ 136*56877Sakito KC_IGNORE, 0, 0, /* 108 [0x6C] */ 137*56877Sakito KC_IGNORE, 0, 0, /* 109 [0x6D] */ 138*56877Sakito KC_IGNORE, 0, 0, /* 110 [0x6E] */ 139*56877Sakito KC_IGNORE, 0, 0, /* 111 [0x6F] */ 140*56877Sakito KC_IGNORE, 0, 0, /* 112 [0x70] */ 141*56877Sakito KC_IGNORE, 0, 0, /* 113 [0x71] */ 142*56877Sakito KC_IGNORE, 0, 0, /* 114 [0x72] */ 143*56877Sakito KC_IGNORE, 0, 0, /* 115 [0x73] */ 144*56877Sakito KC_IGNORE, 0, 0, /* 116 [0x74] */ 145*56877Sakito KC_IGNORE, 0, 0, /* 117 [0x75] */ 146*56877Sakito KC_IGNORE, 0, 0, /* 118 [0x76] */ 147*56877Sakito KC_IGNORE, 0, 0, /* 119 [0x77] */ 148*56877Sakito KC_IGNORE, 0, 0, /* 120 [0x78] */ 149*56877Sakito KC_IGNORE, 0, 0, /* 121 [0x79] */ 150*56877Sakito KC_IGNORE, 0, 0, /* 122 [0x7A] */ 151*56877Sakito KC_IGNORE, 0, 0, /* 123 [0x7B] */ 152*56877Sakito KC_IGNORE, 0, 0, /* 124 [0x7C] */ 153*56877Sakito KC_IGNORE, 0, 0, /* 125 [0x7D] */ 154*56877Sakito KC_IGNORE, 0, 0, /* 126 [0x7E] */ 155*56877Sakito KC_IGNORE, 0, 0, /* 127 [0x7F] */ 156*56877Sakito }; 157*56877Sakito 158*56877Sakito int shift_flag = 0; 159*56877Sakito int ctrl_flag = 0; 160*56877Sakito int meta_flag = 0; 161*56877Sakito 162*56877Sakito kbd_decode(code) 163*56877Sakito register u_char code; 164*56877Sakito { 165*56877Sakito register unsigned int c, updown; 166*56877Sakito 167*56877Sakito if (code & 0x80) 168*56877Sakito updown = 1; 169*56877Sakito else 170*56877Sakito updown = 0; 171*56877Sakito 172*56877Sakito code &= 0x7F; 173*56877Sakito 174*56877Sakito c = kbd_keymap[code].km_type; 175*56877Sakito 176*56877Sakito switch(c) { 177*56877Sakito 178*56877Sakito case KC_CODE: 179*56877Sakito if (updown) 180*56877Sakito c = KC_IGNORE; 181*56877Sakito break; 182*56877Sakito 183*56877Sakito case KC_SHIFT: 184*56877Sakito switch(kbd_keymap[code].km_code[0]) { 185*56877Sakito case KS_SHIFT: 186*56877Sakito shift_flag = 1 - updown; 187*56877Sakito break; 188*56877Sakito 189*56877Sakito case KS_CTRL: 190*56877Sakito ctrl_flag = 1 - updown; 191*56877Sakito break; 192*56877Sakito 193*56877Sakito case KS_META: 194*56877Sakito meta_flag = 1 - updown; 195*56877Sakito break; 196*56877Sakito } 197*56877Sakito break; 198*56877Sakito 199*56877Sakito default: 200*56877Sakito break; 201*56877Sakito } 202*56877Sakito 203*56877Sakito c |= kbd_keymap[code].km_code[shift_flag]; 204*56877Sakito 205*56877Sakito if (kbd_keymap[code].km_type == KC_CODE) { 206*56877Sakito if (meta_flag) 207*56877Sakito c |= 0x0080; 208*56877Sakito if (ctrl_flag) 209*56877Sakito c &= 0xFF1F; 210*56877Sakito } 211*56877Sakito 212*56877Sakito return(c); 213*56877Sakito } 214*56877Sakito #endif 215