From a5d7e68af96d9b62821d8fd47f5039c5bae5d421 Mon Sep 17 00:00:00 2001 From: Reiner Herrmann Date: Fri, 10 Feb 2012 14:25:38 +0100 Subject: added original sam_player code --- c64/kbd.c | 248 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 248 insertions(+) create mode 100644 c64/kbd.c (limited to 'c64/kbd.c') diff --git a/c64/kbd.c b/c64/kbd.c new file mode 100644 index 0000000..827d808 --- /dev/null +++ b/c64/kbd.c @@ -0,0 +1,248 @@ +// 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; +} -- cgit v1.2.3