No more borders at OpenGL rendering, if window has different aspect ratio than 1...
[mercenary-reloaded.git] / src / libkeyboard / keyboard.c
index f6d5cce..630cf30 100644 (file)
@@ -20,6 +20,7 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
+#include "../../include/keycodes.h"
 #include "../libsdl/print.h"
 #include "keyboard.h"
 
 
 /* stolen from UAE */
 static struct keycodes {
-       const char *key;
+       enum keycode key;
        uint8_t code;
 } keycodes[] = {
-       { "A", 0x20 }, { "B", 0x35 }, { "C", 0x33 }, { "D", 0x22 },
-       { "E", 0x12 }, { "F", 0x23 }, { "G", 0x24 }, { "H", 0x25 },
-       { "I", 0x17 }, { "J", 0x26 }, { "K", 0x27 }, { "L", 0x28 },
-       { "M", 0x37 }, { "N", 0x36 }, { "O", 0x18 }, { "P", 0x19 },
-       { "Q", 0x10 }, { "R", 0x13 }, { "S", 0x21 }, { "T", 0x14 },
-       { "U", 0x16 }, { "V", 0x34 }, { "W", 0x11 }, { "X", 0x32 },
-       { "Y", 0x15 }, { "Z", 0x31 },
-
-       { "0", 0x0A }, { "1", 0x01 }, { "2", 0x02 }, { "3", 0x03 },
-       { "4", 0x04 }, { "5", 0x05 }, { "6", 0x06 }, { "7", 0x07 },
-       { "8", 0x08 }, { "9", 0x09 },
-
-       { "NP0", 0x0F }, { "NP1", 0x1D }, { "NP2", 0x1E }, { "NP3", 0x1F },
-       { "NP4", 0x2D }, { "NP5", 0x2E }, { "NP6", 0x2F }, { "NP7", 0x3D },
-       { "NP8", 0x3E }, { "NP9", 0x3F },
-
-       { "NPDIV", 0x5C }, { "NPMUL", 0x5D }, { "NPSUB", 0x4A },
-       { "NPADD", 0x5E }, { "NPDEL", 0x3C }, { "NPLPAREN", 0x5A },
-       { "NPRPAREN", 0x5B },
-
-       { "F1", 0x50 }, { "F2", 0x51 }, { "F3", 0x52 }, { "F4", 0x53 },
-       { "F5", 0x54 }, { "F6", 0x55 }, { "F7", 0x56 }, { "F8", 0x57 },
-       { "F9", 0x58 }, { "F10", 0x59 },
-
-       { "UP", 0x4C }, { "DN", 0x4D }, { "LF", 0x4F }, { "RT", 0x4E },
-
-       { "SPC", 0x40 }, { "BS", 0x41 }, { "TAB", 0x42 }, { "ENT", 0x43 },
-       { "RET", 0x44 }, { "ESC", 0x45 }, { "DEL", 0x46 },
-
-       { "LSH", 0x60 }, { "RSH", 0x61 }, { "CAPSLOCK", 0x62 },
-       { "CTRL", 0x63 }, { "LALT", 0x64 }, { "RALT", 0x65 }, { "LAMI", 0x66 },
-       { "RAMI", 0x67 }, { "HELP", 0x5F },
-
-       { "LBRACKET", 0x1A }, { "RBRACKET", 0x1B }, { "SEMICOLON", 0x29 },
-       { "COMMA", 0x38 }, { "PERIOD", 0x39 }, { "SLASH", 0x3A },
-       { "BACKSLASH", 0x0D }, { "QUOTE", 0x2A }, { "NUMBERSIGN", 0x2B },
-       { "LTGT", 0x30 }, { "BACKQUOTE", 0x00 }, { "MINUS", 0x0B },
-       { "EQUAL", 0x0C },
-
-       { NULL, 0 },
+       { KEYCODE_a, 0x20 },
+       { KEYCODE_b, 0x35 },
+       { KEYCODE_c, 0x33 },
+       { KEYCODE_d, 0x22 },
+       { KEYCODE_e, 0x12 },
+       { KEYCODE_f, 0x23 },
+       { KEYCODE_g, 0x24 },
+       { KEYCODE_h, 0x25 },
+       { KEYCODE_i, 0x17 },
+       { KEYCODE_j, 0x26 },
+       { KEYCODE_k, 0x27 },
+       { KEYCODE_l, 0x28 },
+       { KEYCODE_m, 0x37 },
+       { KEYCODE_n, 0x36 },
+       { KEYCODE_o, 0x18 },
+       { KEYCODE_p, 0x19 },
+       { KEYCODE_q, 0x10 },
+       { KEYCODE_r, 0x13 },
+       { KEYCODE_s, 0x21 },
+       { KEYCODE_t, 0x14 },
+       { KEYCODE_u, 0x16 },
+       { KEYCODE_v, 0x34 },
+       { KEYCODE_w, 0x11 },
+       { KEYCODE_x, 0x32 },
+       { KEYCODE_y, 0x15 },
+       { KEYCODE_z, 0x31 },
+
+       { KEYCODE_0, 0x0A },
+       { KEYCODE_1, 0x01 },
+       { KEYCODE_2, 0x02 },
+       { KEYCODE_3, 0x03 },
+       { KEYCODE_4, 0x04 },
+       { KEYCODE_5, 0x05 },
+       { KEYCODE_6, 0x06 },
+       { KEYCODE_7, 0x07 },
+       { KEYCODE_8, 0x08 },
+       { KEYCODE_9, 0x09 },
+
+       { KEYCODE_KP_0, 0x0F },
+       { KEYCODE_KP_1, 0x1D },
+       { KEYCODE_KP_2, 0x1E },
+       { KEYCODE_KP_3, 0x1F },
+       { KEYCODE_KP_4, 0x2D },
+       { KEYCODE_KP_5, 0x2E },
+       { KEYCODE_KP_6, 0x2F },
+       { KEYCODE_KP_7, 0x3D },
+       { KEYCODE_KP_8, 0x3E },
+       { KEYCODE_KP_9, 0x3F },
+
+       { KEYCODE_KP_DIVIDE, 0x5C },
+       { KEYCODE_KP_MULTIPLY, 0x5D },
+       { KEYCODE_KP_MINUS, 0x4A },
+       { KEYCODE_KP_PLUS, 0x5E },
+       { KEYCODE_KP_PERIOD, 0x3C },
+       { KEYCODE_KP_ENTER, 0x43 },
+       { KEYCODE_KP_LPAREN, 0x5A },
+       { KEYCODE_KP_RPAREN, 0x5B },
+
+       { KEYCODE_F1, 0x50 },
+       { KEYCODE_F2, 0x51 },
+       { KEYCODE_F3, 0x52 },
+       { KEYCODE_F4, 0x53 },
+       { KEYCODE_F5, 0x54 },
+       { KEYCODE_F6, 0x55 },
+       { KEYCODE_F7, 0x56 },
+       { KEYCODE_F8, 0x57 },
+       { KEYCODE_F9, 0x58 },
+       { KEYCODE_F10, 0x59 },
+
+       { KEYCODE_UP, 0x4C },
+       { KEYCODE_DOWN, 0x4D },
+       { KEYCODE_LEFT, 0x4F },
+       { KEYCODE_RIGHT, 0x4E },
+
+       { KEYCODE_SPACE, 0x40 },
+       { KEYCODE_BACKSPACE, 0x41 },
+       { KEYCODE_TAB, 0x42 },
+       { KEYCODE_RETURN, 0x44 },
+       { KEYCODE_ESCAPE, 0x45 },
+       { KEYCODE_DELETE, 0x46 },
+
+       { KEYCODE_LSHIFT, 0x60 },
+       { KEYCODE_RSHIFT, 0x61 },
+       { KEYCODE_CAPSLOCK, 0x62 },
+       { KEYCODE_LCTRL, 0x63 },
+       { KEYCODE_RCTRL, 0x63 },
+       { KEYCODE_LALT, 0x64 },
+       { KEYCODE_RALT, 0x65 },
+       { KEYCODE_LAMIGA, 0x66 },
+       { KEYCODE_RAMIGA, 0x67 },
+       { KEYCODE_HELP, 0x5F },
+
+       { KEYCODE_LBRACKET, 0x1A },
+       { KEYCODE_RBRACKET, 0x1B },
+       { KEYCODE_SEMICOLON, 0x29 },
+       { KEYCODE_COMMA, 0x38 },
+       { KEYCODE_PERIOD, 0x39 },
+       { KEYCODE_SLASH, 0x3A },
+       { KEYCODE_BACKSLASH, 0x0D },
+       { KEYCODE_QUOTE, 0x2A },
+       { KEYCODE_NUMBERSIGN, 0x2B },
+       { KEYCODE_LTGT, 0x30 },
+       { KEYCODE_BACKQUOTE, 0x00 },
+       { KEYCODE_MINUS, 0x0B },
+       { KEYCODE_EQUAL, 0x0C },
+
+       { KEYCODE_UNDEFINED, 0xff },
 };
 
 static uint8_t buffer[16];
@@ -95,12 +163,14 @@ uint16_t emulate_keyboard_read(uint32_t address)
        case CIAASDR:
                if (buffer_len == 0)
                        return 0xffff;
-               value = buffer[--buffer_len];
-               /* rotate and negate */
-               value = ~ROL(value);
+               value = buffer[0];
 #ifdef DEBUG_KEYS
-               printf("sending key code %02x\n", buffer[buffer_len]);
+               printf("sending amiga code 0x%02x\n", value);
 #endif
+               /* rotate and negate */
+               value = ~ROL(value);
+               /* remove first entry from buffer */
+               buffer_len--;
                for (i = 0; i < buffer_len; i++)
                        buffer[i] = buffer[i + 1];
                return 0xff00 | value;
@@ -109,19 +179,25 @@ uint16_t emulate_keyboard_read(uint32_t address)
        return 0xffff;
 }
 
-void set_key(const char *key, int down)
+/* schedule given key to queue,
+ * down == 0: up
+ * down == 1: down
+ */
+void set_amiga_key(enum keycode key, int down)
 {
        int code = -1, isdown;
        int i;
 
-       for (i = 0; keycodes[i].key; i++) {
-               if (!strcmp(keycodes[i].key, key)) {
+       for (i = 0; keycodes[i].key != KEYCODE_UNDEFINED; i++) {
+               if (keycodes[i].key == key) {
                        code = keycodes[i].code;
                        break;
                }
        }
        if (code < 0 || code >= 0x80) {
-               print_error("Key code '%s' unknown, please fix!\n", key);
+#ifdef DEBUG_KEYS
+               printf("Key code '%d' unknown, ignoring!\n", key);
+#endif
                return;
        }
 
@@ -142,13 +218,13 @@ void set_key(const char *key, int down)
        }
 
        if (buffer_len == buffer_size) {
-               print_error("keyboard buffer overflow\n");
+               print_info("keyboard buffer overflow\n");
                return;
        }
 
        buffer[buffer_len++] = code;
 #ifdef DEBUG_KEYS
-       printf("Converting key '%s' to code 0x%02x\n", key, code);
+       printf("Converting keycode %d to amiga code 0x%02x\n", key, code);
 #endif
 }