// kbd.c // // 20060803 Markku Alén #include "kbd.h" static int row_tbl[256]; static int col_tbl[256]; static int matrix[8]; static void init_key(int key, int row, int col) { row_tbl[key % sizeof(row_tbl)] = row; col_tbl[key % sizeof(col_tbl)] = col; } void kbd_init(void) { int i; for(i = sizeof(matrix) / sizeof(matrix[0]);i-- > 0;) matrix[i] = 0; for(i = sizeof(row_tbl) / sizeof(row_tbl[0]);i-- > 0;) row_tbl[i] = 0; for(i = sizeof(col_tbl) / sizeof(col_tbl[0]);i-- > 0;) col_tbl[i] = 0; init_key(KEY_COMMODORE, 7, 5); init_key(KEY_INST_DEL, 0, 0); init_key(KEY_LEFT_SHIFT, 1, 7); init_key(KEY_RIGHT_SHIFT, 6, 4); init_key(KEY_VER_CURSOR, 0, 7); init_key(KEY_HOR_CURSOR, 0, 2); init_key(KEY_F1, 0, 4); init_key(KEY_F3, 0, 5); init_key(KEY_F5, 0, 6); init_key(KEY_F7, 0, 3); init_key(KEY_CTRL, 7, 2); init_key(KEY_CLR_HOME, 6, 3); init_key(KEY_RUN_STOP, 7, 7); init_key(KEY_RETURN, 0, 1); init_key(KEY_SPACE, 7, 4); init_key(KEY_ARROW_LEFT, 7, 1); init_key(KEY_ARROW_UP, 6, 6); init_key(KEY_PLUS, 5, 0); init_key(KEY_MINUS, 5, 3); init_key(KEY_MULTIPLY, 6, 1); init_key(KEY_DIVIDE, 6, 7); init_key(KEY_COLON, 5, 5); init_key(KEY_SEMICOLON, 6, 2); init_key(KEY_EQUAL, 6, 5); init_key(KEY_COMMA, 5, 7); init_key(KEY_DOT, 5, 4); init_key(KEY_POUND, 6, 0); init_key(KEY_AT, 5, 6); init_key(KEY_NUMBER_0, 4, 3); init_key(KEY_NUMBER_1, 7, 0); init_key(KEY_NUMBER_2, 7, 3); init_key(KEY_NUMBER_3, 1, 0); init_key(KEY_NUMBER_4, 1, 3); init_key(KEY_NUMBER_5, 2, 0); init_key(KEY_NUMBER_6, 2, 3); init_key(KEY_NUMBER_7, 3, 0); init_key(KEY_NUMBER_8, 3, 3); init_key(KEY_NUMBER_9, 4, 0); init_key(KEY_LETTER_A, 1, 2); init_key(KEY_LETTER_B, 3, 4); init_key(KEY_LETTER_C, 2, 4); init_key(KEY_LETTER_D, 2, 2); init_key(KEY_LETTER_E, 1, 6); init_key(KEY_LETTER_F, 2, 5); init_key(KEY_LETTER_G, 3, 2); init_key(KEY_LETTER_H, 3, 5); init_key(KEY_LETTER_I, 4, 1); init_key(KEY_LETTER_J, 4, 2); init_key(KEY_LETTER_K, 4, 5); init_key(KEY_LETTER_L, 5, 2); init_key(KEY_LETTER_M, 4, 4); init_key(KEY_LETTER_N, 4, 7); init_key(KEY_LETTER_O, 4, 6); init_key(KEY_LETTER_P, 5, 1); init_key(KEY_LETTER_Q, 7, 6); init_key(KEY_LETTER_R, 2, 1); init_key(KEY_LETTER_S, 1, 5); init_key(KEY_LETTER_T, 2, 6); init_key(KEY_LETTER_U, 3, 6); init_key(KEY_LETTER_V, 3, 7); init_key(KEY_LETTER_W, 1, 1); init_key(KEY_LETTER_X, 2, 7); init_key(KEY_LETTER_Y, 3, 1); init_key(KEY_LETTER_Z, 1, 4); } void kbd_down(int key) { int row, col; row = row_tbl[key]; col = col_tbl[key]; matrix[row] |= (1 << col); } void kbd_up(int key) { int row, col; row = row_tbl[key]; col = col_tbl[key]; matrix[row] &= ~(1 << col); } void kbd_push(int key, int down) { (void)(down ? kbd_down(key) : kbd_up(key)); } void kbd_ascii_push(int c, int down) { int i, j, key; static const struct __ascii_key { int c; int key[2]; }ascii_key_tbl[] = { {'\x09', KEY_CTRL}, {'\x07', KEY_INST_DEL}, {'\x08', KEY_CLR_HOME}, {'\x1b', KEY_RUN_STOP}, {'\x0d', KEY_RETURN}, {' ', KEY_SPACE}, {'!', KEY_LEFT_SHIFT, KEY_NUMBER_1}, {'\"', KEY_LEFT_SHIFT, KEY_NUMBER_2}, {'#', KEY_POUND}, {'$', KEY_LEFT_SHIFT, KEY_NUMBER_4}, {'%', KEY_LEFT_SHIFT, KEY_NUMBER_5}, {'&', KEY_LEFT_SHIFT, KEY_NUMBER_6}, {'\'', KEY_LEFT_SHIFT, KEY_NUMBER_7}, {'(', KEY_LEFT_SHIFT, KEY_NUMBER_8}, {')', KEY_LEFT_SHIFT, KEY_NUMBER_9}, {'*', KEY_MULTIPLY}, {'+', KEY_PLUS}, {',', KEY_COMMA}, {'-', KEY_MINUS}, {'.', KEY_DOT}, {'/', KEY_DIVIDE}, {'0', KEY_NUMBER_0}, {'1', KEY_NUMBER_1}, {'2', KEY_NUMBER_2}, {'3', KEY_NUMBER_3}, {'4', KEY_NUMBER_4}, {'5', KEY_NUMBER_5}, {'6', KEY_NUMBER_6}, {'7', KEY_NUMBER_7}, {'8', KEY_NUMBER_8}, {'9', KEY_NUMBER_9}, {':', KEY_COLON}, {';', KEY_SEMICOLON}, {'<', KEY_LEFT_SHIFT, KEY_COMMA}, {'=', KEY_EQUAL}, {'>', KEY_LEFT_SHIFT, KEY_DOT}, {'?', KEY_LEFT_SHIFT, KEY_DIVIDE}, {'@', KEY_AT}, {'A', KEY_LETTER_A}, {'B', KEY_LETTER_B}, {'C', KEY_LETTER_C}, {'D', KEY_LETTER_D}, {'E', KEY_LETTER_E}, {'F', KEY_LETTER_F}, {'G', KEY_LETTER_G}, {'H', KEY_LETTER_H}, {'I', KEY_LETTER_I}, {'J', KEY_LETTER_J}, {'K', KEY_LETTER_K}, {'L', KEY_LETTER_L}, {'M', KEY_LETTER_M}, {'N', KEY_LETTER_N}, {'O', KEY_LETTER_O}, {'P', KEY_LETTER_P}, {'Q', KEY_LETTER_Q}, {'R', KEY_LETTER_R}, {'S', KEY_LETTER_S}, {'T', KEY_LETTER_T}, {'U', KEY_LETTER_U}, {'V', KEY_LETTER_V}, {'W', KEY_LETTER_W}, {'X', KEY_LETTER_X}, {'Y', KEY_LETTER_Y}, {'Z', KEY_LETTER_Z}, {'[', KEY_LEFT_SHIFT, KEY_COLON}, {']', KEY_LEFT_SHIFT, KEY_SEMICOLON}, {'^', KEY_ARROW_UP}, {'a', KEY_LETTER_A}, {'b', KEY_LETTER_B}, {'c', KEY_LETTER_C}, {'d', KEY_LETTER_D}, {'e', KEY_LETTER_E}, {'f', KEY_LETTER_F}, {'g', KEY_LETTER_G}, {'h', KEY_LETTER_H}, {'i', KEY_LETTER_I}, {'j', KEY_LETTER_J}, {'k', KEY_LETTER_K}, {'l', KEY_LETTER_L}, {'m', KEY_LETTER_M}, {'n', KEY_LETTER_N}, {'o', KEY_LETTER_O}, {'p', KEY_LETTER_P}, {'q', KEY_LETTER_Q}, {'r', KEY_LETTER_R}, {'s', KEY_LETTER_S}, {'t', KEY_LETTER_T}, {'u', KEY_LETTER_U}, {'v', KEY_LETTER_V}, {'w', KEY_LETTER_W}, {'x', KEY_LETTER_X}, {'y', KEY_LETTER_Y}, {'z', KEY_LETTER_Z}, {'~', KEY_ARROW_LEFT}, {'\0'}, }; for(i = sizeof(ascii_key_tbl) / sizeof(ascii_key_tbl[0]);i-- > 0;) { if(ascii_key_tbl[i].c == c) { for(j = sizeof(ascii_key_tbl[0].key) / sizeof(ascii_key_tbl[0].key[0]);j-- > 0;) { key = ascii_key_tbl[i].key[j]; if(key != 0) { kbd_push(key, down); } } } } } int kbd_data(int row_data) { int i; int col_data; col_data = 0xff; for(i = 8;i-- > 0;) { if((row_data & (1 << i)) == 0) { col_data &= ~matrix[i]; } } return col_data; }