Wed, 09 Feb 2011 22:05:42 +0000
merge heads
src/keyboard.c | file | annotate | diff | revisions | |
src/keyboard.h | file | annotate | diff | revisions | |
src/main.c | file | annotate | diff | revisions |
1.1 diff -r 9883eb142f70 -r 934ae2efdd01 src/keyboard.c 1.2 --- a/src/keyboard.c Wed Feb 09 17:11:48 2011 +0000 1.3 +++ b/src/keyboard.c Wed Feb 09 22:05:42 2011 +0000 1.4 @@ -128,6 +128,29 @@ 1.5 { SDLK_DELETE, 0, 0x7f } // Dlete 1.6 }; 1.7 1.8 +/** 1.9 + * List of special key codes 1.10 + */ 1.11 +enum { 1.12 + KEY_ALL_UP = 0x40, ///< All keys up 1.13 + KEY_LIST_END = 0x80, ///< End of key code list 1.14 + KEY_BEGIN_MOUSE = 0xCF, ///< Mouse data follows 1.15 + KEY_BEGIN_KEYBOARD = 0xDF, ///< Keyboard data follows 1.16 +}; 1.17 + 1.18 +/** 1.19 + * List of keyboard commands 1.20 + */ 1.21 +enum { 1.22 + KEY_CMD_RESET = 0x92, ///< Reset keyboard 1.23 + KEY_CMD_CAPSLED_OFF = 0xB1, ///< Caps Lock LED off--CHECK! 1.24 + KEY_CMD_CAPSLED_ON = 0xB0, ///< Caps Lock LED on --CHECK! 1.25 + KEY_CMD_NUMLED_OFF = 0xA1, ///< Num Lock LED off --CHECK! 1.26 + KEY_CMD_NUMLED_ON = 0xA0, ///< Num Lock LED on --CHECK! 1.27 + KEY_CMD_MOUSE_ENABLE = 0xD0, ///< Enable mouse 1.28 + KEY_CMD_MOUSE_DISABLE = 0xD1 ///< Disable mouse 1.29 +}; 1.30 + 1.31 void keyboard_init(KEYBOARD_STATE *ks) 1.32 { 1.33 // Set all key states to "not pressed" 1.34 @@ -141,29 +164,40 @@ 1.35 1.36 void keyboard_event(KEYBOARD_STATE *ks, SDL_Event *ev) 1.37 { 1.38 - // Ignore non-keyboard events 1.39 - if ((ev->type != SDL_KEYDOWN) && (ev->type != SDL_KEYUP)) return; 1.40 + int v = 0; 1.41 + switch (ev->type) { 1.42 + case SDL_KEYDOWN: 1.43 + // Key down (pressed) 1.44 + v = 1; 1.45 + break; 1.46 + case SDL_KEYUP: 1.47 + // Key up (released) 1.48 + v = 0; 1.49 + break; 1.50 + default: 1.51 + // Not a keyboard event 1.52 + return; 1.53 + } 1.54 1.55 // scan the keymap 1.56 - int keyidx = 0; 1.57 - bool found = false; 1.58 - for (keyidx=0; keyidx < sizeof(keymap)/sizeof(keymap[0]); keyidx++) { 1.59 - if (keymap[keyidx].key == ev->key.keysym.sym) { 1.60 - found = true; 1.61 - break; 1.62 + for (int i=0; i < sizeof(keymap)/sizeof(keymap[0]); i++) { 1.63 + if (keymap[i].key == ev->key.keysym.sym) { 1.64 + // Keycode match. Is this an Extended Map key? 1.65 + if (keymap[i].extended) { 1.66 + // Yes -- need ALT set when pressing the key for this to be a match 1.67 + if (ev->key.keysym.mod & KMOD_ALT) { 1.68 + ks->keystate[keymap[i].scancode] = v; 1.69 + break; 1.70 + } 1.71 + } else { 1.72 + // Standard Map key. ALT must NOT be pressed for this to be a match 1.73 + if (!(ev->key.keysym.mod & KMOD_ALT)) { 1.74 + ks->keystate[keymap[i].scancode] = v; 1.75 + break; 1.76 + } 1.77 + } 1.78 } 1.79 } 1.80 - 1.81 - switch (ev->type) { 1.82 - // key pressed 1.83 - case SDL_KEYDOWN: 1.84 - ks->keystate[keymap[keyidx].scancode] = 1; 1.85 - break; 1.86 - // key released 1.87 - case SDL_KEYUP: 1.88 - ks->keystate[keymap[keyidx].scancode] = 0; 1.89 - break; 1.90 - } 1.91 } 1.92 1.93 void keyboard_scan(KEYBOARD_STATE *ks)
2.1 diff -r 9883eb142f70 -r 934ae2efdd01 src/keyboard.h 2.2 --- a/src/keyboard.h Wed Feb 09 17:11:48 2011 +0000 2.3 +++ b/src/keyboard.h Wed Feb 09 22:05:42 2011 +0000 2.4 @@ -11,7 +11,7 @@ 2.5 int keystate[0x80]; 2.6 2.7 /// Keyboard buffer 2.8 - char buffer[KEYBOARD_BUFFER_SIZE]; 2.9 + uint8_t buffer[KEYBOARD_BUFFER_SIZE]; 2.10 2.11 /// Read pointer 2.12 size_t readp; 2.13 @@ -24,6 +24,7 @@ 2.14 2.15 /// Transmit Interrupt Enable 2.16 bool txie; 2.17 + 2.18 /// Receive Interrupt Enable 2.19 bool rxie; 2.20 } KEYBOARD_STATE;
3.1 diff -r 9883eb142f70 -r 934ae2efdd01 src/main.c 3.2 --- a/src/main.c Wed Feb 09 17:11:48 2011 +0000 3.3 +++ b/src/main.c Wed Feb 09 22:05:42 2011 +0000 3.4 @@ -340,6 +340,7 @@ 3.5 // TODO: this is a LEVEL, not an EDGE! 3.6 m68k_set_irq(3); 3.7 } else { 3.8 + lastirq_fdc = wd2797_get_irq(&state.fdc_ctx); 3.9 m68k_set_irq(0); 3.10 } 3.11
4.1 diff -r 9883eb142f70 -r 934ae2efdd01 src/utils.h 4.2 --- a/src/utils.h Wed Feb 09 17:11:48 2011 +0000 4.3 +++ b/src/utils.h Wed Feb 09 22:05:42 2011 +0000 4.4 @@ -1,5 +1,7 @@ 4.5 -#ifndef _H_UTILS 4.6 -#define _H_UTILS 4.7 +#ifndef _UTILS_H 4.8 +#define _UTILS_H 4.9 + 4.10 +#include <stdio.h> 4.11 4.12 #ifndef NDEBUG 4.13 /// Log a message to stderr 4.14 @@ -11,4 +13,7 @@ 4.15 #define LOG_IF(cond, x, ...) 4.16 #endif 4.17 4.18 +/// Get the number of elements in an array 4.19 +#define NELEMS(x) (sizeof(x)/sizeof(x[0])) 4.20 + 4.21 #endif // _H_UTILS