diff options
Diffstat (limited to 'c64/kbd.c')
| -rw-r--r-- | c64/kbd.c | 248 |
1 files changed, 248 insertions, 0 deletions
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;
+}
|
