diff --git a/MiSTer.vcxproj b/MiSTer.vcxproj
index 64edaeb..46bb6d8 100644
--- a/MiSTer.vcxproj
+++ b/MiSTer.vcxproj
@@ -79,7 +79,6 @@
-
diff --git a/MiSTer.vcxproj.filters b/MiSTer.vcxproj.filters
index 17969eb..a5a7241 100644
--- a/MiSTer.vcxproj.filters
+++ b/MiSTer.vcxproj.filters
@@ -124,9 +124,6 @@
Header Files
-
- Header Files
-
Header Files
diff --git a/input.c b/input.c
index e02202f..088e099 100644
--- a/input.c
+++ b/input.c
@@ -1,6 +1,5 @@
#include
#include
-#include
#include
#include
#include
@@ -18,129 +17,97 @@
#define NUMDEV 10
-typedef struct
-{
- uint16_t vid, pid;
- char led;
- char last_l, last_r, last_u, last_d;
-
- char has_map;
- uint32_t map[32];
-
- char has_mmap;
- uint32_t mmap[32];
-
- char has_kbdmap;
- uint8_t kbdmap[256];
-} devInput;
-
-static devInput input[NUMDEV] = {0};
-static int first_joystick = -1;
-
-#define FN 0x10000
-
-#define LCTRL 0x0100
-#define LSHIFT 0x0200
-#define LALT 0x0400
-#define LGUI 0x0800
-#define RCTRL 0x1000
-#define RSHIFT 0x2000
-#define RALT 0x4000
-#define RGUI 0x8000
-#define MODMASK 0xFF00
-#define NONE 0
-
-static int ev2usb[] =
+static int ev2amiga[] =
{
NONE, //0 KEY_RESERVED
- 0x29, //1 KEY_ESC
- 0x1e, //2 KEY_1
- 0x1f, //3 KEY_2
- 0x20, //4 KEY_3
- 0x21, //5 KEY_4
- 0x22, //6 KEY_5
- 0x23, //7 KEY_6
- 0x24, //8 KEY_7
- 0x25, //9 KEY_8
- 0x26, //10 KEY_9
- 0x27, //11 KEY_0
- 0x2D, //12 KEY_MINUS
- 0x2E, //13 KEY_EQUAL
- 0x2A, //14 KEY_BACKSPACE
- 0x2B, //15 KEY_TAB
- 0x14, //16 KEY_Q
- 0x1a, //17 KEY_W
- 0x08, //18 KEY_E
- 0x15, //19 KEY_R
- 0x17, //20 KEY_T
- 0x1c, //21 KEY_Y
- 0x18, //22 KEY_U
- 0x0c, //23 KEY_I
- 0x12, //24 KEY_O
- 0x13, //25 KEY_P
- 0x2F, //26 KEY_LEFTBRACE
- 0x30, //27 KEY_RIGHTBRACE
- 0x28, //28 KEY_ENTER
- LCTRL, //29 KEY_LEFTCTRL
- 0x04, //30 KEY_A
- 0x16, //31 KEY_S
- 0x07, //32 KEY_D
- 0x09, //33 KEY_F
- 0x0a, //34 KEY_G
- 0x0b, //35 KEY_H
- 0x0d, //36 KEY_J
- 0x0e, //37 KEY_K
- 0x0f, //38 KEY_L
- 0x33, //39 KEY_SEMICOLON
- 0x34, //40 KEY_APOSTROPHE
- 0x35, //41 KEY_GRAVE
- LSHIFT, //42 KEY_LEFTSHIFT
- 0x31, //43 KEY_BACKSLASH
- 0x1d, //44 KEY_Z
- 0x1b, //45 KEY_X
- 0x06, //46 KEY_C
- 0x19, //47 KEY_V
- 0x05, //48 KEY_B
- 0x11, //49 KEY_N
- 0x10, //50 KEY_M
- 0x36, //51 KEY_COMMA
- 0x37, //52 KEY_DOT
- 0x38, //53 KEY_SLASH
- RSHIFT, //54 KEY_RIGHTSHIFT
- 0x55, //55 KEY_KPASTERISK
- LALT, //56 KEY_LEFTALT
- 0x2C, //57 KEY_SPACE
- 0x39, //58 KEY_CAPSLOCK
- 0x3a, //59 KEY_F1
- 0x3b, //60 KEY_F2
- 0x3c, //61 KEY_F3
- 0x3d, //62 KEY_F4
- 0x3e, //63 KEY_F5
- 0x3f, //64 KEY_F6
- 0x40, //65 KEY_F7
- 0x41, //66 KEY_F8
- 0x42, //67 KEY_F9
- 0x43, //68 KEY_F10
- 0x53, //69 KEY_NUMLOCK
- 0x47, //70 KEY_SCROLLLOCK
- 0x5F, //71 KEY_KP7
- 0x60, //72 KEY_KP8
- 0x61, //73 KEY_KP9
- 0x56, //74 KEY_KPMINUS
- 0x5C, //75 KEY_KP4
- 0x5D, //76 KEY_KP5
- 0x5E, //77 KEY_KP6
- 0x57, //78 KEY_KPPLUS
- 0x59, //79 KEY_KP1
- 0x5A, //80 KEY_KP2
- 0x5B, //81 KEY_KP3
- 0x62, //82 KEY_KP0
- 0x63, //83 KEY_KPDOT
+ 0x45, //1 KEY_ESC
+ 0x01, //2 KEY_1
+ 0x02, //3 KEY_2
+ 0x03, //4 KEY_3
+ 0x04, //5 KEY_4
+ 0x05, //6 KEY_5
+ 0x06, //7 KEY_6
+ 0x07, //8 KEY_7
+ 0x08, //9 KEY_8
+ 0x09, //10 KEY_9
+ 0x0a, //11 KEY_0
+ 0x0b, //12 KEY_MINUS
+ 0x0c, //13 KEY_EQUAL
+ 0x41, //14 KEY_BACKSPACE
+ 0x42, //15 KEY_TAB
+ 0x10, //16 KEY_Q
+ 0x11, //17 KEY_W
+ 0x12, //18 KEY_E
+ 0x13, //19 KEY_R
+ 0x14, //20 KEY_T
+ 0x15, //21 KEY_Y
+ 0x16, //22 KEY_U
+ 0x17, //23 KEY_I
+ 0x18, //24 KEY_O
+ 0x19, //25 KEY_P
+ 0x1a, //26 KEY_LEFTBRACE
+ 0x1b, //27 KEY_RIGHTBRACE
+ 0x44, //28 KEY_ENTER
+ 0x63, //29 KEY_LEFTCTRL
+ 0x20, //30 KEY_A
+ 0x21, //31 KEY_S
+ 0x22, //32 KEY_D
+ 0x23, //33 KEY_F
+ 0x24, //34 KEY_G
+ 0x25, //35 KEY_H
+ 0x26, //36 KEY_J
+ 0x27, //37 KEY_K
+ 0x28, //38 KEY_L
+ 0x29, //39 KEY_SEMICOLON
+ 0x2a, //40 KEY_APOSTROPHE
+ 0x00, //41 KEY_GRAVE
+ 0x60, //42 KEY_LEFTSHIFT
+ 0x0d, //43 KEY_BACKSLASH
+ 0x31, //44 KEY_Z
+ 0x32, //45 KEY_X
+ 0x33, //46 KEY_C
+ 0x34, //47 KEY_V
+ 0x35, //48 KEY_B
+ 0x36, //49 KEY_N
+ 0x37, //50 KEY_M
+ 0x38, //51 KEY_COMMA
+ 0x39, //52 KEY_DOT
+ 0x3a, //53 KEY_SLASH
+ 0x61, //54 KEY_RIGHTSHIFT
+ 0x5d, //55 KEY_KPASTERISK
+ 0x64, //56 KEY_LEFTALT
+ 0x40, //57 KEY_SPACE
+ 0x62 | CAPS_TOGGLE, //58 KEY_CAPSLOCK
+ 0x50, //59 KEY_F1
+ 0x51, //60 KEY_F2
+ 0x52, //61 KEY_F3
+ 0x53, //62 KEY_F4
+ 0x54, //63 KEY_F5
+ 0x55, //64 KEY_F6
+ 0x56, //65 KEY_F7
+ 0x57, //66 KEY_F8
+ 0x58, //67 KEY_F9
+ 0x59, //68 KEY_F10
+ NONE, //69 KEY_NUMLOCK
+ NONE, //70 KEY_SCROLLLOCK
+ 0x3d, //71 KEY_KP7
+ 0x3e, //72 KEY_KP8
+ 0x3f, //73 KEY_KP9
+ 0x4a, //74 KEY_KPMINUS
+ 0x2d, //75 KEY_KP4
+ 0x2e, //76 KEY_KP5
+ 0x2f, //77 KEY_KP6
+ 0x5e, //78 KEY_KPPLUS
+ 0x1d, //79 KEY_KP1
+ 0x1e, //80 KEY_KP2
+ 0x1f, //81 KEY_KP3
+ 0x0f, //82 KEY_KP0
+ 0x3c, //83 KEY_KPDOT
NONE, //84 ???
NONE, //85 KEY_ZENKAKU
- FN, //86 KEY_102ND
- 0x44, //87 KEY_F11
- 0x45, //88 KEY_F12
+ NONE, //86 KEY_102ND
+ 0x5f, //87 KEY_F11
+ NONE, //88 KEY_F12
NONE, //89 KEY_RO
NONE, //90 KEY_KATAKANA
NONE, //91 KEY_HIRAGANA
@@ -148,38 +115,38 @@ static int ev2usb[] =
NONE, //93 KEY_KATAKANA
NONE, //94 KEY_MUHENKAN
NONE, //95 KEY_KPJPCOMMA
- 0x28, //96 KEY_KPENTER
- RCTRL, //97 KEY_RIGHTCTRL
- 0x54, //98 KEY_KPSLASH
+ 0x43, //96 KEY_KPENTER
+ 0x63, //97 KEY_RIGHTCTRL
+ 0x5c, //98 KEY_KPSLASH
NONE, //99 KEY_SYSRQ
- RALT, //100 KEY_RIGHTALT
+ 0x65, //100 KEY_RIGHTALT
NONE, //101 KEY_LINEFEED
- 0x4A, //102 KEY_HOME
- 0x52, //103 KEY_UP
- 0x4B, //104 KEY_PAGEUP
- 0x50, //105 KEY_LEFT
- 0x4F, //106 KEY_RIGHT
- 0x4D, //107 KEY_END
- 0x51, //108 KEY_DOWN
- 0x4E, //109 KEY_PAGEDOWN
- 0x49, //110 KEY_INSERT
- 0x4C, //111 KEY_DELETE
+ 0x6a, //102 KEY_HOME
+ 0x4c, //103 KEY_UP
+ NONE, //104 KEY_PAGEUP
+ 0x4f, //105 KEY_LEFT
+ 0x4e, //106 KEY_RIGHT
+ NONE, //107 KEY_END
+ 0x4d, //108 KEY_DOWN
+ NONE, //109 KEY_PAGEDOWN
+ 0x0d, //110 KEY_INSERT
+ 0x46, //111 KEY_DELETE
NONE, //112 KEY_MACRO
NONE, //113 KEY_MUTE
NONE, //114 KEY_VOLUMEDOWN
NONE, //115 KEY_VOLUMEUP
NONE, //116 KEY_POWER
- 0x67, //117 KEY_KPEQUAL
+ NONE, //117 KEY_KPEQUAL
NONE, //118 KEY_KPPLUSMINUS
- 0x48, //119 KEY_PAUSE
+ NONE, //119 KEY_PAUSE
NONE, //120 KEY_SCALE
NONE, //121 KEY_KPCOMMA
NONE, //122 KEY_HANGEUL
NONE, //123 KEY_HANJA
NONE, //124 KEY_YEN
- LGUI, //125 KEY_LEFTMETA
- RGUI, //126 KEY_RIGHTMETA
- 0x65, //127 KEY_COMPOSE
+ 0x66, //125 KEY_LEFTMETA
+ 0x67, //126 KEY_RIGHTMETA
+ NONE, //127 KEY_COMPOSE
NONE, //128 KEY_STOP
NONE, //129 KEY_AGAIN
NONE, //130 KEY_PROPS
@@ -235,10 +202,10 @@ static int ev2usb[] =
NONE, //180 KEY_KPRIGHTPAREN
NONE, //181 KEY_NEW
NONE, //182 KEY_REDO
- NONE, //183 KEY_F13
- NONE, //184 KEY_F14
+ 0x5a, //183 KEY_F13
+ 0x5b, //184 KEY_F14
NONE, //185 KEY_F15
- NONE, //186 KEY_F16
+ 0x5f, //186 KEY_F16
NONE, //187 KEY_F17
NONE, //188 KEY_F18
NONE, //189 KEY_F19
@@ -246,7 +213,7 @@ static int ev2usb[] =
NONE, //191 KEY_F21
NONE, //192 KEY_F22
NONE, //193 KEY_F23
- RCTRL, //194 KEY_F24
+ 0x63, //194 KEY_F24
NONE, //195 ???
NONE, //196 ???
NONE, //197 ???
@@ -262,7 +229,7 @@ static int ev2usb[] =
NONE, //207 KEY_PLAY
NONE, //208 KEY_FASTFORWARD
NONE, //209 KEY_BASSBOOST
- 0x46, //210 KEY_PRINT
+ NONE, //210 KEY_PRINT
NONE, //211 KEY_HP
NONE, //212 KEY_CAMERA
NONE, //213 KEY_SOUND
@@ -310,13 +277,8 @@ static int ev2usb[] =
NONE //255 ???
};
-#define OSD 0x0100 // to be used by OSD, not the core itself
-#define OSD_OPEN 0x0200 // OSD key not forwarded to core, but queued in arm controller
-#define CAPS_LOCK_TOGGLE 0x0400 // caps lock toggle behaviour
-#define NUM_LOCK_TOGGLE 0x0800
-#define EXT 0x1000
-static int ev2ps2[] =
+static const int ev2ps2[] =
{
NONE, //0 KEY_RESERVED
0x76, //1 KEY_ESC
@@ -347,7 +309,7 @@ static int ev2ps2[] =
0x54, //26 KEY_LEFTBRACE
0x5b, //27 KEY_RIGHTBRACE
0x5a, //28 KEY_ENTER
- 0x14, //29 KEY_LEFTCTRL
+ LCTRL | 0x14, //29 KEY_LEFTCTRL
0x1c, //30 KEY_A
0x1b, //31 KEY_S
0x23, //32 KEY_D
@@ -360,7 +322,7 @@ static int ev2ps2[] =
0x4c, //39 KEY_SEMICOLON
0x52, //40 KEY_APOSTROPHE
0x0e, //41 KEY_GRAVE
- 0x12, //42 KEY_LEFTSHIFT
+ LSHIFT | 0x12, //42 KEY_LEFTSHIFT
0x5d, //43 KEY_BACKSLASH
0x1a, //44 KEY_Z
0x22, //45 KEY_X
@@ -372,9 +334,9 @@ static int ev2ps2[] =
0x41, //51 KEY_COMMA
0x49, //52 KEY_DOT
0x4a, //53 KEY_SLASH
- 0x59, //54 KEY_RIGHTSHIFT
+ RSHIFT | 0x59, //54 KEY_RIGHTSHIFT
0x7c, //55 KEY_KPASTERISK
- 0x11, //56 KEY_LEFTALT
+ LALT | 0x11, //56 KEY_LEFTALT
0x29, //57 KEY_SPACE
0x58, //58 KEY_CAPSLOCK
0x05, //59 KEY_F1
@@ -387,8 +349,8 @@ static int ev2ps2[] =
0x0a, //66 KEY_F8
0x01, //67 KEY_F9
0x09, //68 KEY_F10
- 0x77, //69 KEY_NUMLOCK
- 0x7E, //70 KEY_SCROLLLOCK
+ EMU_SWITCH_2 | 0x77, //69 KEY_NUMLOCK
+ EMU_SWITCH_1 | 0x7E, //70 KEY_SCROLLLOCK
0x6c, //71 KEY_KP7
0x75, //72 KEY_KP8
0x7d, //73 KEY_KP9
@@ -406,7 +368,7 @@ static int ev2ps2[] =
NONE, //85 KEY_ZENKAKU
NONE, //86 KEY_102ND
0x78, //87 KEY_F11
- NONE, //88 KEY_F12
+ OSD_OPEN, //88 KEY_F12
NONE, //89 KEY_RO
NONE, //90 KEY_KATAKANA
NONE, //91 KEY_HIRAGANA
@@ -415,10 +377,10 @@ static int ev2ps2[] =
NONE, //94 KEY_MUHENKAN
NONE, //95 KEY_KPJPCOMMA
EXT | 0x5a, //96 KEY_KPENTER
- EXT | 0x14, //97 KEY_RIGHTCTRL
+ RCTRL | EXT | 0x14, //97 KEY_RIGHTCTRL
EXT | 0x4a, //98 KEY_KPSLASH
NONE, //99 KEY_SYSRQ
- EXT | 0x11, //100 KEY_RIGHTALT
+ RALT | EXT | 0x11, //100 KEY_RIGHTALT
NONE, //101 KEY_LINEFEED
EXT | 0x6c, //102 KEY_HOME
EXT | 0x75, //103 KEY_UP
@@ -443,8 +405,8 @@ static int ev2ps2[] =
NONE, //122 KEY_HANGEUL
NONE, //123 KEY_HANJA
NONE, //124 KEY_YEN
- EXT | 0x1f, //125 KEY_LEFTMETA
- EXT | 0x27, //126 KEY_RIGHTMETA
+ LGUI | EXT | 0x1f, //125 KEY_LEFTMETA
+ RGUI | EXT | 0x27, //126 KEY_RIGHTMETA
NONE, //127 KEY_COMPOSE
NONE, //128 KEY_STOP
NONE, //129 KEY_AGAIN
@@ -505,14 +467,14 @@ static int ev2ps2[] =
NONE, //184 KEY_F14
NONE, //185 KEY_F15
NONE, //186 KEY_F16
- NONE, //187 KEY_F17
- NONE, //188 KEY_F18
- NONE, //189 KEY_F19
- NONE, //190 KEY_F20
+ EMU_SWITCH_1 | 1, //187 KEY_F17
+ EMU_SWITCH_1 | 2, //188 KEY_F18
+ EMU_SWITCH_1 | 3, //189 KEY_F19
+ EMU_SWITCH_1 | 4, //190 KEY_F20
NONE, //191 KEY_F21
NONE, //192 KEY_F22
NONE, //193 KEY_F23
- NONE, //194 KEY_F24
+ RCTRL | EXT | 0x14, //194 KEY_F24
NONE, //195 ???
NONE, //196 ???
NONE, //197 ???
@@ -576,6 +538,344 @@ static int ev2ps2[] =
NONE //255 ???
};
+/*
+
+// unmapped atari keys:
+// 0x63 KP (
+// 0x64 KP )
+
+// keycode translation table for atari
+const unsigned short usb2atari[] = {
+MISS, // 00: NoEvent
+MISS, // 01: Overrun Error
+MISS, // 02: POST fail
+MISS, // 03: ErrorUndefined
+0x1e, // 04: a
+0x30, // 05: b
+0x2e, // 06: c
+0x20, // 07: d
+0x12, // 08: e
+0x21, // 09: f
+0x22, // 0a: g
+0x23, // 0b: h
+0x17, // 0c: i
+0x24, // 0d: j
+0x25, // 0e: k
+0x26, // 0f: l
+0x32, // 10: m
+0x31, // 11: n
+0x18, // 12: o
+0x19, // 13: p
+0x10, // 14: q
+0x13, // 15: r
+0x1f, // 16: s
+0x14, // 17: t
+0x16, // 18: u
+0x2f, // 19: v
+0x11, // 1a: w
+0x2d, // 1b: x
+0x15, // 1c: y
+0x2c, // 1d: z
+0x02, // 1e: 1
+0x03, // 1f: 2
+0x04, // 20: 3
+0x05, // 21: 4
+0x06, // 22: 5
+0x07, // 23: 6
+0x08, // 24: 7
+0x09, // 25: 8
+0x0a, // 26: 9
+0x0b, // 27: 0
+0x1c, // 28: Return
+0x01, // 29: Escape
+0x0e, // 2a: Backspace
+0x0f, // 2b: Tab
+0x39, // 2c: Space
+0x0c, // 2d: -
+0x0d, // 2e: =
+0x1a, // 2f: [
+0x1b, // 30: ]
+0x29, // 31: backslash, only on us keyboard
+0x29, // 32: Europe 1, only on int. keyboard
+0x27, // 33: ;
+0x28, // 34: '
+0x2b, // 35: `
+0x33, // 36: ,
+0x34, // 37: .
+0x35, // 38: /
+0x3a | CAPS_LOCK_TOGGLE, // 39: Caps Lock
+0x3b, // 3a: F1
+0x3c, // 3b: F2
+0x3d, // 3c: F3
+0x3e, // 3d: F4
+0x3f, // 3e: F5
+0x40, // 3f: F6
+0x41, // 40: F7
+0x42, // 41: F8
+0x43, // 42: F9
+0x44, // 43: F10
+MISS, // 44: F11
+OSD_OPEN, // 45: F12
+MISS, // 46: Print Screen
+NUM_LOCK_TOGGLE, // 47: Scroll Lock
+MISS, // 48: Pause
+0x52, // 49: Insert
+0x47, // 4a: Home
+0x62, // 4b: Page Up
+0x53, // 4c: Delete
+MISS, // 4d: End
+0x61, // 4e: Page Down
+0x4d, // 4f: Right Arrow
+0x4b, // 50: Left Arrow
+0x50, // 51: Down Arrow
+0x48, // 52: Up Arrow
+NUM_LOCK_TOGGLE, // 53: Num Lock
+0x65, // 54: KP /
+0x66, // 55: KP *
+0x4a, // 56: KP -
+0x4e, // 57: KP +
+0x72, // 58: KP Enter
+0x6d, // 59: KP 1
+0x6e, // 5a: KP 2
+0x6f, // 5b: KP 3
+0x6a, // 5c: KP 4
+0x6b, // 5d: KP 5
+0x6c, // 5e: KP 6
+0x67, // 5f: KP 7
+0x68, // 60: KP 8
+0x69, // 61: KP 9
+0x70, // 62: KP 0
+0x71, // 63: KP .
+0x60, // 64: Europe 2
+OSD_OPEN, // 65: App
+MISS, // 66: Power
+MISS, // 67: KP =
+MISS, // 68: F13
+MISS, // 69: F14
+MISS, // 6a: F15
+0x52, // 6b: insert (for keyrah)
+NUM_LOCK_TOGGLE | 1, // 6c: F17
+NUM_LOCK_TOGGLE | 2, // 6d: F18
+NUM_LOCK_TOGGLE | 3, // 6e: F19
+NUM_LOCK_TOGGLE | 4 // 6f: F20
+};
+*/
+
+/*
+
+// Archimedes unmapped keys
+// Missing sterling
+// Missing kp_hash
+// Missing button_1
+// Missing button_2
+// Missing button_3
+// Missing button_4
+// Missing button_5
+
+// keycode translation table
+const unsigned short usb2archie[] = {
+MISS, // 00: NoEvent
+MISS, // 01: Overrun Error
+MISS, // 02: POST fail
+MISS, // 03: ErrorUndefined
+0x3c, // 04: a
+0x52, // 05: b
+0x50, // 06: c
+0x3e, // 07: d
+0x29, // 08: e
+0x3f, // 09: f
+0x40, // 0a: g
+0x41, // 0b: h
+0x2e, // 0c: i
+0x42, // 0d: j
+0x43, // 0e: k
+0x44, // 0f: l
+0x54, // 10: m
+0x53, // 11: n
+0x2f, // 12: o
+0x30, // 13: p
+0x27, // 14: q
+0x2a, // 15: r
+0x3d, // 16: s
+0x2b, // 17: t
+0x2d, // 18: u
+0x51, // 19: v
+0x28, // 1a: w
+0x4f, // 1b: x
+0x2c, // 1c: y
+0x4e, // 1d: z
+0x11, // 1e: 1
+0x12, // 1f: 2
+0x13, // 20: 3
+0x14, // 21: 4
+0x15, // 22: 5
+0x16, // 23: 6
+0x17, // 24: 7
+0x18, // 25: 8
+0x19, // 26: 9
+0x1a, // 27: 0
+0x47, // 28: Return
+0x00, // 29: Escape
+0x1e, // 2a: Backspace
+0x26, // 2b: Tab
+0x5f, // 2c: Space
+0x1b, // 2d: -
+0x1c, // 2e: =
+0x31, // 2f: [
+0x32, // 30: ]
+0x33, // 31: backslash (only on us keyboards)
+0x33, // 32: Europe 1 (only on international kbds)
+0x45, // 33: ;
+0x46, // 34: '
+0x10, // 35: `
+0x55, // 36: ,
+0x56, // 37: .
+0x57, // 38: /
+0x5d, // 39: Caps Lock
+0x01, // 3a: F1
+0x02, // 3b: F2
+0x03, // 3c: F3
+0x04, // 3d: F4
+0x05, // 3e: F5
+0x06, // 3f: F6
+0x07, // 40: F7
+0x08, // 41: F8
+0x09, // 42: F9
+0x0a, // 43: F10
+0x0b, // 44: F11
+0x0c, // 45: F12 - Used heavily by the archie... OSD moved to printscreen.
+// 0x0d, // 46: Print Screen
+OSD_OPEN, // 46: Print Screen
+0x0e, // 47: Scroll Lock
+0x0f, // 48: Pause
+0x1f, // 49: Insert
+0x20, // 4a: Home
+0x21, // 4b: Page Up
+0x34, // 4c: Delete
+0x35, // 4d: End
+0x36, // 4e: Page Down
+0x64, // 4f: Right Arrow
+0x62, // 50: Left Arrow
+0x63, // 51: Down Arrow
+0x59, // 52: Up Arrow
+0x22, // 53: Num Lock
+0x23, // 54: KP /
+0x24, // 55: KP *
+0x3a, // 56: KP -
+0x4b, // 57: KP +
+0x67, // 58: KP Enter
+0x5a, // 59: KP 1
+0x5b, // 5a: KP 2
+0x5c, // 5b: KP 3
+0x48, // 5c: KP 4
+0x49, // 5d: KP 5
+0x4a, // 5e: KP 6
+0x37, // 5f: KP 7
+0x38, // 60: KP 8
+0x39, // 61: KP 9
+0x65, // 62: KP 0
+0x66, // 63: KP decimal
+MISS, // 64: Europe 2
+0x72, // 65: App (maps to middle mouse button)
+MISS, // 66: Power
+MISS, // 67: KP =
+MISS, // 68: F13
+MISS, // 69: F14
+MISS, // 6a: F15
+0x1f, // 6b: insert (for keyrah)
+MISS, // 6c: F17
+MISS, // 6d: F18
+MISS, // 6e: F19
+MISS, // 6f: F20
+};
+*/
+
+/*
+unsigned short modifier_keycode(unsigned char index)
+{
+// usb modifer bits:
+//0 1 2 3 4 5 6 7
+//LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI
+
+if (core_type == CORE_TYPE_MINIMIG2)
+{
+static const unsigned short amiga_modifier[] = { 0x63, 0x60, 0x64, 0x66, 0x63, 0x61, 0x65, 0x67 };
+return amiga_modifier[index];
+}
+
+if (core_type == CORE_TYPE_MIST)
+{
+static const unsigned short atari_modifier[] = { 0x1d, 0x2a, 0x38, MISS, 0x1d, 0x36, 0x38, MISS };
+return atari_modifier[index];
+}
+
+if (core_type == CORE_TYPE_8BIT)
+{
+static const unsigned short ps2_modifier[] = { 0x14, 0x12, 0x11, EXT | 0x1f, EXT | 0x14, 0x59, EXT | 0x11, EXT | 0x27 };
+return ps2_modifier[index];
+}
+
+if (core_type == CORE_TYPE_ARCHIE)
+{
+static const unsigned short archie_modifier[] = { 0x36, 0x4c, 0x5e, MISS, 0x61, 0x58, 0x60, MISS };
+return archie_modifier[index];
+}
+
+return MISS;
+}
+*/
+
+
+uint32_t get_ps2_code(uint16_t key)
+{
+ if (key > 255) return NONE;
+ return ev2ps2[key];
+}
+
+uint32_t get_amiga_code(uint16_t key)
+{
+ if (key > 255) return NONE;
+ return ev2amiga[key];
+}
+
+uint32_t get_atari_code(uint16_t key)
+{
+ if (key > 255) return NONE;
+ return 0; // ev2atari[key];
+}
+
+uint32_t get_archie_code(uint16_t key)
+{
+ if (key > 255) return NONE;
+ return 0; // ev2archie[key];
+}
+
+static uint32_t modifier = 0;
+
+uint32_t get_key_mod()
+{
+ return modifier & MODMASK;
+}
+
+typedef struct
+{
+ uint16_t vid, pid;
+ char led;
+ char last_l, last_r, last_u, last_d;
+
+ char has_map;
+ uint32_t map[32];
+
+ char has_mmap;
+ uint32_t mmap[32];
+
+ char has_kbdmap;
+ uint8_t kbdmap[256];
+} devInput;
+
+static devInput input[NUMDEV] = { 0 };
+static int first_joystick = -1;
+
int mfd = -1;
int mwd = -1;
@@ -789,51 +1089,51 @@ uint16_t get_map_pid()
static char kr_fn_table[] =
{
- 0x54, 0x48, // pause/break
- 0x55, 0x46, // prnscr
- 0x50, 0x4a, // home
- 0x4f, 0x4d, // end
- 0x52, 0x4b, // pgup
- 0x51, 0x4e, // pgdown
- 0x3a, 0x44, // f11
- 0x3b, 0x45, // f12
+ KEY_KPSLASH, KEY_PAUSE,
+ KEY_KPASTERISK, KEY_PRINT,
+ KEY_LEFT, KEY_HOME,
+ KEY_RIGHT, KEY_END,
+ KEY_UP, KEY_PAGEUP,
+ KEY_DOWN, KEY_PAGEDOWN,
+ KEY_F1, KEY_F11,
+ KEY_F2, KEY_F12,
- 0x3c, 0x6c, // EMU_MOUSE
- 0x3d, 0x6d, // EMU_JOY0
- 0x3e, 0x6e, // EMU_JOY1
- 0x3f, 0x6f, // EMU_NONE
+ KEY_F3, KEY_F17, // EMU_MOUSE
+ KEY_F4, KEY_F18, // EMU_JOY0
+ KEY_F5, KEY_F19, // EMU_JOY1
+ KEY_F6, KEY_F20, // EMU_NONE
- //Emulate keypad for A600
- 0x1E, 0x59, //KP1
- 0x1F, 0x5A, //KP2
- 0x20, 0x5B, //KP3
- 0x21, 0x5C, //KP4
- 0x22, 0x5D, //KP5
- 0x23, 0x5E, //KP6
- 0x24, 0x5F, //KP7
- 0x25, 0x60, //KP8
- 0x26, 0x61, //KP9
- 0x27, 0x62, //KP0
- 0x2D, 0x56, //KP-
- 0x2E, 0x57, //KP+
- 0x31, 0x55, //KP*
- 0x2F, 0x68, //KP(
- 0x30, 0x69, //KP)
- 0x37, 0x63, //KP.
- 0x28, 0x58 //KP Enter
+ //Emulate keypad for A600
+ KEY_1, KEY_KP1,
+ KEY_2, KEY_KP2,
+ KEY_3, KEY_KP3,
+ KEY_4, KEY_KP4,
+ KEY_5, KEY_KP5,
+ KEY_6, KEY_KP6,
+ KEY_7, KEY_KP7,
+ KEY_8, KEY_KP8,
+ KEY_9, KEY_KP9,
+ KEY_0, KEY_KP0,
+ KEY_MINUS, KEY_KPMINUS,
+ KEY_EQUAL, KEY_KPPLUS,
+ KEY_BACKSLASH, KEY_KPASTERISK,
+ KEY_LEFTBRACE, KEY_F13, //KP(
+ KEY_RIGHTBRACE, KEY_F14, //KP)
+ KEY_DOT, KEY_KPDOT,
+ KEY_ENTER, KEY_KPENTER
};
static int keyrah_trans(int key, int press)
{
static int fn = 0;
- if (key == 0x53) return 0x68;
- if (key == 0x47) return 0x69;
- if (key == 0x49) return 0x6b; // workaround!
+ if (key == KEY_NUMLOCK) return KEY_F13; // numlock -> f13
+ if (key == KEY_SCROLLLOCK) return KEY_F14; // scrlock -> f14
+ if (key == KEY_INSERT) return KEY_F16; // insert -> f16. workaround!
- if (key == FN)
+ if (key == KEY_102ND)
{
- if (!press && fn == 1) menu_key_set(KEY_AMI_MENU);
+ if (!press && fn == 1) menu_key_set(KEY_F12);
fn = press ? 1 : 0;
return 0;
}
@@ -987,95 +1287,12 @@ static void joy_analog(int num, int axis, int offset)
}
}
-static int input_cb_x86(struct input_event *ev, int dev)
-{
- if(user_io_osd_is_visible() || ev->type != EV_KEY || !is_x86_core() || ev->code>255) return 0;
-
- int code = ev2ps2[ev->code];
- if (code == NONE) return 0;
-
- //pause
- if ((code & 0xff) == 0xE1)
- {
- // pause does not have a break code
- if (ev->value != 1)
- {
- // Pause key sends E11477E1F014E077
- static const unsigned char c[] = { 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 };
- const unsigned char *p = c;
-
- spi_uio_cmd_cont(UIO_KEYBOARD);
-
- printf("PS2 PAUSE CODE: ");
- while (*p)
- {
- printf("%x ", *p);
- spi8(*p++);
- }
- printf("\n");
-
- DisableIO();
- }
- }
- // print screen
- else if ((code & 0xff) == 0xE2)
- {
- if (ev->value <= 1)
- {
- static const unsigned char c[2][8] = {
- { 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12, 0x00, 0x00 },
- { 0xE0, 0x12, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00 }
- };
-
- const unsigned char *p = c[ev->value];
-
- spi_uio_cmd_cont(UIO_KEYBOARD);
-
- printf("PS2 PRINT CODE: ");
- while (*p)
- {
- printf("%x ", *p);
- spi8(*p++);
- }
- printf("\n");
-
- DisableIO();
- }
- }
- else
- {
- spi_uio_cmd_cont(UIO_KEYBOARD);
- /*
- iprintf("PS2 KBD ");
- if (code & EXT) iprintf("e0 ");
- if (code & BREAK) iprintf("f0 ");
- iprintf("%x\n", code & 0xff);
- */
-
- // prepend extended code flag if required
- if (code & EXT) spi8(0xe0);
-
- // prepend break code if required
- if (!ev->value) spi8(0xf0);
-
- // send code itself
- spi8(code & 0xff);
-
- DisableIO();
- }
-
- return 1;
-}
-
static void input_cb(struct input_event *ev, int dev)
{
static int key_mapped = 0;
static uint8_t modifiers = 0;
static char keys[6] = { 0,0,0,0,0,0 };
- // repeat events won't be processed
- if (ev->type == EV_KEY && ev->value > 1) return;
-
int map_skip = (ev->type == EV_KEY && ev->code == 57 && mapping_dev >= 0 && mapping_type==1);
int cancel = (ev->type == EV_KEY && ev->code == 1);
int enter = (ev->type == EV_KEY && ev->code == 28);
@@ -1086,9 +1303,12 @@ static void input_cb(struct input_event *ev, int dev)
case EV_KEY:
if (ev->code >= 272 && ev->code <= 279)
{
- unsigned char mask = 1 << (ev->code - 272);
- mouse_btn = (ev->value) ? mouse_btn | mask : mouse_btn & ~mask;
- user_io_mouse(mouse_btn, 0, 0);
+ if (ev->value <= 1)
+ {
+ unsigned char mask = 1 << (ev->code - 272);
+ mouse_btn = (ev->value) ? mouse_btn | mask : mouse_btn & ~mask;
+ user_io_mouse(mouse_btn, 0, 0);
+ }
return;
}
break;
@@ -1148,7 +1368,7 @@ static void input_cb(struct input_event *ev, int dev)
{
if (mapping_type == 2)
{
- if (ev->value && ev->code < 256)
+ if (ev->value == 1 && ev->code < 256)
{
if(mapping_dev < 0)
{
@@ -1175,7 +1395,7 @@ static void input_cb(struct input_event *ev, int dev)
if (mapping_dev == dev && mapping_button < mapping_count)
{
- if (ev->value)
+ if (ev->value == 1)
{
if (!mapping_button) memset(input[dev].map, 0, sizeof(input[dev].map));
@@ -1188,7 +1408,7 @@ static void input_cb(struct input_event *ev, int dev)
key_mapped = 1;
}
}
- else
+ else if(ev->value == 0)
{
if (key_mapped) mapping_button++;
key_mapped = 0;
@@ -1250,7 +1470,7 @@ static void input_cb(struct input_event *ev, int dev)
{
if (ev->code == input[dev].map[i])
{
- joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i);
+ if(ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i);
return;
}
}
@@ -1261,7 +1481,7 @@ static void input_cb(struct input_event *ev, int dev)
{
if (ev->code == input[dev].map[i])
{
- joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i);
+ if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << i, ev->value, i);
return;
}
}
@@ -1270,7 +1490,7 @@ static void input_cb(struct input_event *ev, int dev)
{
if (ev->code == input[dev].mmap[i])
{
- joy_digital((first_joystick == dev) ? 0 : 1, 1 << (i - 8), ev->value, i - 8);
+ if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 1 << (i - 8), ev->value, i - 8);
return;
}
}
@@ -1278,11 +1498,11 @@ static void input_cb(struct input_event *ev, int dev)
if (ev->code == input[dev].map[17])
{
- joy_digital((first_joystick == dev) ? 0 : 1, 0, ev->value, 17);
+ if (ev->value <= 1) joy_digital((first_joystick == dev) ? 0 : 1, 0, ev->value, 17);
return;
}
- if (ev->code == input[dev].mmap[15])
+ if (ev->code == input[dev].mmap[15] && (ev->value <= 1))
{
mouse_emu = ev->value ? mouse_emu | 1 : mouse_emu & ~1;
printf("mouse_emu = %d\n", mouse_emu);
@@ -1312,7 +1532,7 @@ static void input_cb(struct input_event *ev, int dev)
{
if (ev->code == input[dev].map[i])
{
- joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i);
+ if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 1 << i, ev->value, i);
return;
}
}
@@ -1320,7 +1540,7 @@ static void input_cb(struct input_event *ev, int dev)
if (ev->code == input[dev].map[16])
{
- joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 0, ev->value, 16);
+ if (ev->value <= 1) joy_digital((user_io_get_kbdemu() == EMU_JOY0) ? 0 : 1, 0, ev->value, 16);
return;
}
}
@@ -1363,14 +1583,14 @@ static void input_cb(struct input_event *ev, int dev)
if (ev->code == input[dev].mmap[15])
{
- mouse_sniper = ev->value;
+ if (ev->value <= 1) mouse_sniper = ev->value;
return;
}
}
if (ev->code == input[dev].map[16])
{
- if (ev->value)
+ if (ev->value == 1)
{
kbd_mouse_emu = !kbd_mouse_emu;
printf("kbd_mouse_emu = %d\n", kbd_mouse_emu);
@@ -1394,34 +1614,27 @@ static void input_cb(struct input_event *ev, int dev)
input[dev].has_kbdmap = 1;
}
- int key = input[dev].kbdmap[ev->code] ? input[dev].kbdmap[ev->code] : ev->code;
- key = (key < (sizeof(ev2usb) / sizeof(ev2usb[0]))) ? ev2usb[key] : NONE;
- if(key != NONE)
- {
- static uint16_t mod = 0;
+ static uint16_t mod = 0;
- //Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION
- int keyrah = (mist_cfg.keyrah_mode && (((((uint32_t)input[dev].vid) << 16) | input[dev].pid) == mist_cfg.keyrah_mode));
+ // replace MENU key by RGUI to allow using Right Amiga on reduced keyboards
+ // (it also disables the use of Menu for OSD)
+ uint16_t code = ev->code;
+ if (mist_cfg.key_menu_as_rgui && code == 139) code = 126;
- if (keyrah) key = keyrah_trans(key, ev->value);
- if (key & 0xffff)
- {
- unsigned short reset_m = mod >> 8;
- if (key == 0x4c) reset_m |= 0x100;
- user_io_check_reset(reset_m, (keyrah && !mist_cfg.reset_combo) ? 1 : mist_cfg.reset_combo);
+ //Keyrah v2: USB\VID_18D8&PID_0002\A600/A1200_MULTIMEDIA_EXTENSION_VERSION
+ int keyrah = (mist_cfg.keyrah_mode && (((((uint32_t)input[dev].vid) << 16) | input[dev].pid) == mist_cfg.keyrah_mode));
+ if (keyrah) code = keyrah_trans(code, ev->value);
- if (key & MODMASK)
- {
- if (ev->value) mod |= key;
- else mod &= ~key;
- }
- key = (mod & MODMASK) | (key & ~MODMASK);
+ uint32_t ps2code = get_ps2_code(code);
+ if (ev->value) modifier |= ps2code;
+ else modifier &= ~ps2code;
- menu_mod_set(mod >> 8);
- user_io_kbd((uint16_t)key, ev->value);
- }
- return;
- }
+ uint16_t reset_m = (modifier & MODMASK) >> 8;
+ if (code == 111) reset_m |= 0x100;
+ user_io_check_reset(reset_m, (keyrah && !mist_cfg.reset_combo) ? 1 : mist_cfg.reset_combo);
+
+ user_io_kbd(code, ev->value);
+ return;
}
break;
@@ -1615,8 +1828,7 @@ int input_test(int getchar)
}
}
-
- if(!input_cb_x86(&ev, i)) input_cb(&ev, i);
+ input_cb(&ev, i);
//sumulate digital directions from analog
if (ev.type == EV_ABS && !(ev.code<=1 && mouse_emu && !user_io_osd_is_visible()))
diff --git a/input.h b/input.h
index c73bdaa..77061f6 100644
--- a/input.h
+++ b/input.h
@@ -2,11 +2,33 @@
#ifndef EVINPUT_H
#define EVINPUT_H
+#include
+
#define HID_LED_NUM_LOCK 1
#define HID_LED_CAPS_LOCK 2
#define HID_LED_SCROLL_LOCK 4
#define HID_LED_MASK 7
+#define NONE 0xFF
+#define LCTRL 0x000100
+#define LSHIFT 0x000200
+#define LALT 0x000400
+#define LGUI 0x000800
+#define RCTRL 0x001000
+#define RSHIFT 0x002000
+#define RALT 0x004000
+#define RGUI 0x008000
+#define MODMASK 0x00FF00
+
+#define OSD 0x010000 // to be used by OSD, not the core itself
+#define OSD_OPEN 0x020000 // OSD key not forwarded to core, but queued in arm controller
+#define CAPS_TOGGLE 0x040000 // caps lock toggle behaviour
+#define EXT 0x080000
+#define EMU_SWITCH_1 0x100000
+#define EMU_SWITCH_2 0x200000
+
+#define UPSTROKE 0x400000
+
void set_kbdled(int mask, int state);
int get_kbdled(int mask);
int toggle_kbdled(int mask);
@@ -22,4 +44,10 @@ void finish_map_setting(int dismiss);
uint16_t get_map_vid();
uint16_t get_map_pid();
+uint32_t get_key_mod();
+uint32_t get_ps2_code(uint16_t key);
+uint32_t get_amiga_code(uint16_t key);
+uint32_t get_atari_code(uint16_t key);
+uint32_t get_archie_code(uint16_t key);
+
#endif
diff --git a/keycodes.h b/keycodes.h
deleted file mode 100644
index e41f558..0000000
--- a/keycodes.h
+++ /dev/null
@@ -1,509 +0,0 @@
-// http://wiki.amigaos.net/index.php/Keymap_Library
-// http://www.win.tue.nl/~aeb/linux/kbd/scancodes-14.html
-
-#include "osd.h"
-
-#ifndef KEYCODES_H
-#define KEYCODES_H
-
-#define MISS 0xff
-#define KEYCODE_MAX (0x6f)
-
-// The original minimig had the keyboard connected to the FPGA. Thus all key events (even for OSD)
-// came from the FPGA core. The MIST has the keyboard attached to the arm controller. To be compatible
-// with the minimig core all keys (incl. OSD!) are forwarded to the FPGA and the OSD keys are returned.
-// These keys are tagged with the "OSD" flag
-// The atari/mist core does not forwards keys through the FPGA but queues them inside the arm controller.
-// Keys flagged with "OSD_OPEN" are used to open the OSD in non-minimig. They can have a keycode which
-// will be sent into the core
-
-#define OSD 0x0100 // to be used by OSD, not the core itself
-#define OSD_OPEN 0x0200 // OSD key not forwarded to core, but queued in arm controller
-#define CAPS_LOCK_TOGGLE 0x0400 // caps lock toggle behaviour
-#define NUM_LOCK_TOGGLE 0x0800
-#define EXT 0x1000 // extended PS/2 keycode
-
-// amiga unmapped:
-// 0x5a KP-( (mapped on Keyrah)
-// 0x5b KP-) (mapped on Keyrah)
-// codes >= 0x69 are for OSD only and are not sent to the amiga itself
-
-// keycode translation table
-const unsigned short usb2ami[] = {
- MISS, // 00: NoEvent
- MISS, // 01: Overrun Error
- MISS, // 02: POST fail
- MISS, // 03: ErrorUndefined
- 0x20, // 04: a
- 0x35, // 05: b
- 0x33, // 06: c
- 0x22, // 07: d
- 0x12, // 08: e
- 0x23, // 09: f
- 0x24, // 0a: g
- 0x25, // 0b: h
- 0x17, // 0c: i
- 0x26, // 0d: j
- 0x27, // 0e: k
- 0x28, // 0f: l
- 0x37, // 10: m
- 0x36, // 11: n
- 0x18, // 12: o
- 0x19, // 13: p
- 0x10, // 14: q
- 0x13, // 15: r
- 0x21, // 16: s
- 0x14, // 17: t
- 0x16, // 18: u
- 0x34, // 19: v
- 0x11, // 1a: w
- 0x32, // 1b: x
- 0x15, // 1c: y
- 0x31, // 1d: z
- 0x01, // 1e: 1
- 0x02, // 1f: 2
- 0x03, // 20: 3
- 0x04, // 21: 4
- 0x05, // 22: 5
- 0x06, // 23: 6
- 0x07, // 24: 7
- 0x08, // 25: 8
- 0x09, // 26: 9
- 0x0a, // 27: 0
- 0x44, // 28: Return
- 0x45, // 29: Escape
- 0x41, // 2a: Backspace
- 0x42, // 2b: Tab
- 0x40, // 2c: Space
- 0x0b, // 2d: -
- 0x0c, // 2e: =
- 0x1a, // 2f: [
- 0x1b, // 30: ]
- 0x0d, // 31: backslash (only on us keyboards)
- 0x2b, // 32: Europe 1 (only on international keyboards)
- 0x29, // 33: ;
- 0x2a, // 34: '
- 0x00, // 35: `
- 0x38, // 36: ,
- 0x39, // 37: .
- 0x3a, // 38: /
- 0x62 | CAPS_LOCK_TOGGLE, // 39: Caps Lock
- 0x50, // 3a: F1
- 0x51, // 3b: F2
- 0x52, // 3c: F3
- 0x53, // 3d: F4
- 0x54, // 3e: F5
- 0x55, // 3f: F6
- 0x56, // 40: F7
- 0x57, // 41: F8
- 0x58, // 42: F9
- 0x59, // 43: F10
- 0x5f, // 44: F11
- OSD_OPEN, // 45: F12 (OSD)
- 0x6e | OSD, // 46: Print Screen (OSD)
- NUM_LOCK_TOGGLE, // 47: Scroll Lock (OSD)
- 0x6f | OSD, // 48: Pause
- 0x0d, // 49: backslash to avoid panic in Germany ;)
- 0x6a, // 4a: Home
- 0x6c | OSD, // 4b: Page Up (OSD)
- 0x46, // 4c: Delete
- MISS, // 4d: End
- 0x6d | OSD, // 4e: Page Down (OSD)
- 0x4e, // 4f: Right Arrow
- 0x4f, // 50: Left Arrow
- 0x4d, // 51: Down Arrow
- 0x4c, // 52: Up Arrow
- NUM_LOCK_TOGGLE, // 53: Num Lock
- 0x5c, // 54: KP /
- 0x5d, // 55: KP *
- 0x4a, // 56: KP -
- 0x5e, // 57: KP +
- 0x43, // 58: KP Enter
- 0x1d, // 59: KP 1
- 0x1e, // 5a: KP 2
- 0x1f, // 5b: KP 3
- 0x2d, // 5c: KP 4
- 0x2e, // 5d: KP 5
- 0x2f, // 5e: KP 6
- 0x3d, // 5f: KP 7
- 0x3e, // 60: KP 8
- 0x3f, // 61: KP 9
- 0x0f, // 62: KP 0
- 0x3c, // 63: KP .
- 0x30, // 64: Europe 2
- 0x69 | OSD, // 65: App
- MISS, // 66: Power
- MISS, // 67: KP =
- 0x5a, // 68: KP (
- 0x5b, // 69: KP )
- MISS, // 6a: F15
- 0x5f, // 6b: help (for keyrah)
- NUM_LOCK_TOGGLE | 1, // 6c: F17
- NUM_LOCK_TOGGLE | 2, // 6d: F18
- NUM_LOCK_TOGGLE | 3, // 6e: F19
- NUM_LOCK_TOGGLE | 4 // 6f: F20
-};
-
-// unmapped atari keys:
-// 0x63 KP (
-// 0x64 KP )
-
-// keycode translation table for atari
-const unsigned short usb2atari[] = {
- MISS, // 00: NoEvent
- MISS, // 01: Overrun Error
- MISS, // 02: POST fail
- MISS, // 03: ErrorUndefined
- 0x1e, // 04: a
- 0x30, // 05: b
- 0x2e, // 06: c
- 0x20, // 07: d
- 0x12, // 08: e
- 0x21, // 09: f
- 0x22, // 0a: g
- 0x23, // 0b: h
- 0x17, // 0c: i
- 0x24, // 0d: j
- 0x25, // 0e: k
- 0x26, // 0f: l
- 0x32, // 10: m
- 0x31, // 11: n
- 0x18, // 12: o
- 0x19, // 13: p
- 0x10, // 14: q
- 0x13, // 15: r
- 0x1f, // 16: s
- 0x14, // 17: t
- 0x16, // 18: u
- 0x2f, // 19: v
- 0x11, // 1a: w
- 0x2d, // 1b: x
- 0x15, // 1c: y
- 0x2c, // 1d: z
- 0x02, // 1e: 1
- 0x03, // 1f: 2
- 0x04, // 20: 3
- 0x05, // 21: 4
- 0x06, // 22: 5
- 0x07, // 23: 6
- 0x08, // 24: 7
- 0x09, // 25: 8
- 0x0a, // 26: 9
- 0x0b, // 27: 0
- 0x1c, // 28: Return
- 0x01, // 29: Escape
- 0x0e, // 2a: Backspace
- 0x0f, // 2b: Tab
- 0x39, // 2c: Space
- 0x0c, // 2d: -
- 0x0d, // 2e: =
- 0x1a, // 2f: [
- 0x1b, // 30: ]
- 0x29, // 31: backslash, only on us keyboard
- 0x29, // 32: Europe 1, only on int. keyboard
- 0x27, // 33: ;
- 0x28, // 34: '
- 0x2b, // 35: `
- 0x33, // 36: ,
- 0x34, // 37: .
- 0x35, // 38: /
- 0x3a | CAPS_LOCK_TOGGLE, // 39: Caps Lock
- 0x3b, // 3a: F1
- 0x3c, // 3b: F2
- 0x3d, // 3c: F3
- 0x3e, // 3d: F4
- 0x3f, // 3e: F5
- 0x40, // 3f: F6
- 0x41, // 40: F7
- 0x42, // 41: F8
- 0x43, // 42: F9
- 0x44, // 43: F10
- MISS, // 44: F11
- OSD_OPEN, // 45: F12
- MISS, // 46: Print Screen
- NUM_LOCK_TOGGLE, // 47: Scroll Lock
- MISS, // 48: Pause
- 0x52, // 49: Insert
- 0x47, // 4a: Home
- 0x62, // 4b: Page Up
- 0x53, // 4c: Delete
- MISS, // 4d: End
- 0x61, // 4e: Page Down
- 0x4d, // 4f: Right Arrow
- 0x4b, // 50: Left Arrow
- 0x50, // 51: Down Arrow
- 0x48, // 52: Up Arrow
- NUM_LOCK_TOGGLE, // 53: Num Lock
- 0x65, // 54: KP /
- 0x66, // 55: KP *
- 0x4a, // 56: KP -
- 0x4e, // 57: KP +
- 0x72, // 58: KP Enter
- 0x6d, // 59: KP 1
- 0x6e, // 5a: KP 2
- 0x6f, // 5b: KP 3
- 0x6a, // 5c: KP 4
- 0x6b, // 5d: KP 5
- 0x6c, // 5e: KP 6
- 0x67, // 5f: KP 7
- 0x68, // 60: KP 8
- 0x69, // 61: KP 9
- 0x70, // 62: KP 0
- 0x71, // 63: KP .
- 0x60, // 64: Europe 2
- OSD_OPEN, // 65: App
- MISS, // 66: Power
- MISS, // 67: KP =
- MISS, // 68: F13
- MISS, // 69: F14
- MISS, // 6a: F15
- 0x52, // 6b: insert (for keyrah)
- NUM_LOCK_TOGGLE | 1, // 6c: F17
- NUM_LOCK_TOGGLE | 2, // 6d: F18
- NUM_LOCK_TOGGLE | 3, // 6e: F19
- NUM_LOCK_TOGGLE | 4 // 6f: F20
-};
-
-// keycode translation table for ps2 emulation
-const unsigned short usb2ps2[] = {
- MISS, // 00: NoEvent
- MISS, // 01: Overrun Error
- MISS, // 02: POST fail
- MISS, // 03: ErrorUndefined
- 0x1c, // 04: a
- 0x32, // 05: b
- 0x21, // 06: c
- 0x23, // 07: d
- 0x24, // 08: e
- 0x2b, // 09: f
- 0x34, // 0a: g
- 0x33, // 0b: h
- 0x43, // 0c: i
- 0x3b, // 0d: j
- 0x42, // 0e: k
- 0x4b, // 0f: l
- 0x3a, // 10: m
- 0x31, // 11: n
- 0x44, // 12: o
- 0x4d, // 13: p
- 0x15, // 14: q
- 0x2d, // 15: r
- 0x1b, // 16: s
- 0x2c, // 17: t
- 0x3c, // 18: u
- 0x2a, // 19: v
- 0x1d, // 1a: w
- 0x22, // 1b: x
- 0x35, // 1c: y
- 0x1a, // 1d: z
- 0x16, // 1e: 1
- 0x1e, // 1f: 2
- 0x26, // 20: 3
- 0x25, // 21: 4
- 0x2e, // 22: 5
- 0x36, // 23: 6
- 0x3d, // 24: 7
- 0x3e, // 25: 8
- 0x46, // 26: 9
- 0x45, // 27: 0
- 0x5a, // 28: Return
- 0x76, // 29: Escape
- 0x66, // 2a: Backspace
- 0x0d, // 2b: Tab
- 0x29, // 2c: Space
- 0x4e, // 2d: -
- 0x55, // 2e: =
- 0x54, // 2f: [
- 0x5b, // 30: ]
- 0x5d, // 31: backslash
- 0x5d, // 32: Europe 1
- 0x4c, // 33: ;
- 0x52, // 34: '
- 0x0e, // 35: `
- 0x41, // 36: ,
- 0x49, // 37: .
- 0x4a, // 38: /
- 0x58, // 39: Caps Lock
- 0x05, // 3a: F1
- 0x06, // 3b: F2
- 0x04, // 3c: F3
- 0x0c, // 3d: F4
- 0x03, // 3e: F5
- 0x0b, // 3f: F6
- 0x83, // 40: F7
- 0x0a, // 41: F8
- 0x01, // 42: F9
- 0x09, // 43: F10
- 0x78, // 44: F11
- OSD_OPEN | 0x07, // 45: F12 (OSD)
- EXT | 0x7c, // 46: Print Screen
- NUM_LOCK_TOGGLE, // 47: Scroll Lock
- 0x77, // 48: Pause (special key handled inside user_io)
- EXT | 0x70, // 49: Insert
- EXT | 0x6c, // 4a: Home
- EXT | 0x7d, // 4b: Page Up
- EXT | 0x71, // 4c: Delete
- EXT | 0x69, // 4d: End
- EXT | 0x7a, // 4e: Page Down
- EXT | 0x74, // 4f: Right Arrow
- EXT | 0x6b, // 50: Left Arrow
- EXT | 0x72, // 51: Down Arrow
- EXT | 0x75, // 52: Up Arrow
- NUM_LOCK_TOGGLE, // 53: Num Lock
- EXT | 0x4a, // 54: KP /
- 0x7c, // 55: KP *
- 0x7b, // 56: KP -
- 0x79, // 57: KP +
- EXT | 0x5a, // 58: KP Enter
- 0x69, // 59: KP 1
- 0x72, // 5a: KP 2
- 0x7a, // 5b: KP 3
- 0x6b, // 5c: KP 4
- 0x73, // 5d: KP 5
- 0x74, // 5e: KP 6
- 0x6c, // 5f: KP 7
- 0x75, // 60: KP 8
- 0x7d, // 61: KP 9
- 0x70, // 62: KP 0
- 0x71, // 63: KP .
- 0x61, // 64: Europe 2
- OSD_OPEN | EXT | 0x2f, // 65: App
- EXT | 0x37, // 66: Power
- 0x0f, // 67: KP =
- 0x77, // 68: Num Lock
- 0x7e, // 69: Scroll Lock
- 0x18, // 6a: F15
- EXT | 0x70, // 6b: insert (for keyrah)
- NUM_LOCK_TOGGLE | 1, // 6c: F17
- NUM_LOCK_TOGGLE | 2, // 6d: F18
- NUM_LOCK_TOGGLE | 3, // 6e: F19
- NUM_LOCK_TOGGLE | 4 // 6f: F20
-};
-
-// Archimedes unmapped keys
-// Missing sterling
-// Missing kp_hash
-// Missing button_1
-// Missing button_2
-// Missing button_3
-// Missing button_4
-// Missing button_5
-
-// keycode translation table
-const unsigned short usb2archie[] = {
- MISS, // 00: NoEvent
- MISS, // 01: Overrun Error
- MISS, // 02: POST fail
- MISS, // 03: ErrorUndefined
- 0x3c, // 04: a
- 0x52, // 05: b
- 0x50, // 06: c
- 0x3e, // 07: d
- 0x29, // 08: e
- 0x3f, // 09: f
- 0x40, // 0a: g
- 0x41, // 0b: h
- 0x2e, // 0c: i
- 0x42, // 0d: j
- 0x43, // 0e: k
- 0x44, // 0f: l
- 0x54, // 10: m
- 0x53, // 11: n
- 0x2f, // 12: o
- 0x30, // 13: p
- 0x27, // 14: q
- 0x2a, // 15: r
- 0x3d, // 16: s
- 0x2b, // 17: t
- 0x2d, // 18: u
- 0x51, // 19: v
- 0x28, // 1a: w
- 0x4f, // 1b: x
- 0x2c, // 1c: y
- 0x4e, // 1d: z
- 0x11, // 1e: 1
- 0x12, // 1f: 2
- 0x13, // 20: 3
- 0x14, // 21: 4
- 0x15, // 22: 5
- 0x16, // 23: 6
- 0x17, // 24: 7
- 0x18, // 25: 8
- 0x19, // 26: 9
- 0x1a, // 27: 0
- 0x47, // 28: Return
- 0x00, // 29: Escape
- 0x1e, // 2a: Backspace
- 0x26, // 2b: Tab
- 0x5f, // 2c: Space
- 0x1b, // 2d: -
- 0x1c, // 2e: =
- 0x31, // 2f: [
- 0x32, // 30: ]
- 0x33, // 31: backslash (only on us keyboards)
- 0x33, // 32: Europe 1 (only on international kbds)
- 0x45, // 33: ;
- 0x46, // 34: '
- 0x10, // 35: `
- 0x55, // 36: ,
- 0x56, // 37: .
- 0x57, // 38: /
- 0x5d, // 39: Caps Lock
- 0x01, // 3a: F1
- 0x02, // 3b: F2
- 0x03, // 3c: F3
- 0x04, // 3d: F4
- 0x05, // 3e: F5
- 0x06, // 3f: F6
- 0x07, // 40: F7
- 0x08, // 41: F8
- 0x09, // 42: F9
- 0x0a, // 43: F10
- 0x0b, // 44: F11
- 0x0c, // 45: F12 - Used heavily by the archie... OSD moved to printscreen.
- // 0x0d, // 46: Print Screen
- OSD_OPEN, // 46: Print Screen
- 0x0e, // 47: Scroll Lock
- 0x0f, // 48: Pause
- 0x1f, // 49: Insert
- 0x20, // 4a: Home
- 0x21, // 4b: Page Up
- 0x34, // 4c: Delete
- 0x35, // 4d: End
- 0x36, // 4e: Page Down
- 0x64, // 4f: Right Arrow
- 0x62, // 50: Left Arrow
- 0x63, // 51: Down Arrow
- 0x59, // 52: Up Arrow
- 0x22, // 53: Num Lock
- 0x23, // 54: KP /
- 0x24, // 55: KP *
- 0x3a, // 56: KP -
- 0x4b, // 57: KP +
- 0x67, // 58: KP Enter
- 0x5a, // 59: KP 1
- 0x5b, // 5a: KP 2
- 0x5c, // 5b: KP 3
- 0x48, // 5c: KP 4
- 0x49, // 5d: KP 5
- 0x4a, // 5e: KP 6
- 0x37, // 5f: KP 7
- 0x38, // 60: KP 8
- 0x39, // 61: KP 9
- 0x65, // 62: KP 0
- 0x66, // 63: KP decimal
- MISS, // 64: Europe 2
- 0x72, // 65: App (maps to middle mouse button)
- MISS, // 66: Power
- MISS, // 67: KP =
- MISS, // 68: F13
- MISS, // 69: F14
- MISS, // 6a: F15
- 0x1f, // 6b: insert (for keyrah)
- MISS, // 6c: F17
- MISS, // 6d: F18
- MISS, // 6e: F19
- MISS, // 6f: F20
-};
-
-#endif
diff --git a/menu.c b/menu.c
index f742bdc..18bec9a 100644
--- a/menu.c
+++ b/menu.c
@@ -415,52 +415,42 @@ const uint8_t keycode_table[128] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
-static uint8_t GetASCIIKey(unsigned char keycode)
+static uint8_t GetASCIIKey(uint32_t keycode)
{
- if (keycode & KEY_AMI_UPSTROKE)
+ if (keycode & UPSTROKE)
return 0;
- return keycode_table[keycode & 0x7F];
+ return keycode_table[get_amiga_code(keycode & 0xFFFF) & 0x7F];
}
/* the Atari core handles OSD keys competely inside the core */
-static unsigned char menu_key = 0;
-static unsigned char menu_mod = 0;
+static uint32_t menu_key = 0;
-void menu_key_set(unsigned char c)
+void menu_key_set(uint32_t c)
{
- //iprintf("OSD enqueue: %x\n", c);
+ //printf("OSD enqueue: %x\n", c);
menu_key = c;
}
-void menu_mod_set(uint8_t m)
-{
- menu_mod = m;
-}
-
// get key status
-static uint8_t menu_key_get(void)
+static uint32_t menu_key_get(void)
{
- static unsigned char c2;
+ static uint32_t c2;
static unsigned long delay;
static unsigned long repeat;
static unsigned char repeat2;
- unsigned char c1, c;
+ uint32_t c1, c;
c1 = menu_key;
-
- // OsdKeyGet permanently returns the last key event.
-
- // generate normal "key-pressed" event
c = 0;
if (c1 != c2) c = c1;
c2 = c1;
// inject a fake "MENU_KEY" if no menu is visible and the menu key is loaded
- if (!user_io_osd_is_visible() && is_menu_core()) c = KEY_AMI_MENU;
+ if (!user_io_osd_is_visible() && is_menu_core()) c = KEY_F12;
// generate repeat "key-pressed" events
- if ((c1 & KEY_AMI_UPSTROKE) || (!c1))
+ if ((c1 & UPSTROKE) || (!c1))
{
repeat = GetTimer(REPEATDELAY);
}
@@ -475,10 +465,9 @@ static uint8_t menu_key_get(void)
{
static unsigned char last_but = 0;
unsigned char but = user_io_menu_button();
- if (!but && last_but) c = KEY_AMI_MENU;
+ if (!but && last_but) c = KEY_F12;
last_but = but;
}
-
return(c);
}
@@ -486,7 +475,7 @@ void HandleUI(void)
{
char *p;
char s[40];
- unsigned char i, c, m, up, down, select, menu, right, left, plus, minus;
+ unsigned char i, m, up, down, select, menu, right, left, plus, minus;
uint8_t mod;
unsigned long len;
static hardfileTYPE t_hardfile[2]; // temporary copy of former hardfile configuration
@@ -502,7 +491,7 @@ void HandleUI(void)
char usb_id[64];
// get user control codes
- c = menu_key_get();
+ uint32_t c = menu_key_get();
// decode and set events
menu = false;
@@ -516,9 +505,9 @@ void HandleUI(void)
switch (c)
{
- case KEY_AMI_MENU:
+ case KEY_F12:
menu = true;
- menu_key_set(KEY_AMI_MENU | KEY_AMI_UPSTROKE);
+ menu_key_set(KEY_F12 | UPSTROKE);
break;
// Within the menu the esc key acts as the menu key. problem:
@@ -526,35 +515,35 @@ void HandleUI(void)
// break code for the ESC key when the key is released will
// reach the core which never saw the make code. Simple solution:
// react on break code instead of make code
- case KEY_AMI_ESC | KEY_AMI_UPSTROKE:
+ case KEY_ESC | UPSTROKE:
if (menustate != MENU_NONE2)
menu = true;
break;
- case KEY_AMI_ENTER:
- case KEY_AMI_SPACE:
+ case KEY_ENTER:
+ case KEY_SPACE:
select = true;
break;
- case KEY_AMI_UP:
+ case KEY_UP:
up = true;
break;
- case KEY_AMI_DOWN:
+ case KEY_DOWN:
down = true;
break;
- case KEY_AMI_LEFT:
+ case KEY_LEFT:
left = true;
break;
- case KEY_AMI_RIGHT:
+ case KEY_RIGHT:
right = true;
break;
- case KEY_AMI_KPPLUS:
- case 0x0c: // =/+
+ case KEY_KPPLUS:
+ case KEY_EQUAL: // =/+
plus = true;
break;
- case KEY_AMI_KPMINUS:
- case 0x0b: // -/_
+ case KEY_KPMINUS:
+ case KEY_MINUS: // -/_
minus = true;
break;
-
+/*
case 0x01: // 1: 1280x720 mode
if (user_io_osd_is_visible) mist_cfg.video_mode = 0;
break;
@@ -562,6 +551,7 @@ void HandleUI(void)
case 0x02: // 2: 1280x1024 mode
if (user_io_osd_is_visible) mist_cfg.video_mode = 1;
break;
+*/
}
if (menu || select || up || down || left || right)
@@ -633,7 +623,7 @@ void HandleUI(void)
case MENU_NONE2:
if (menu)
{
- if (menu_mod & 0x44) //Alt+Menu
+ if (get_key_mod() & (LALT|RALT)) //Alt+Menu
{
OsdSetSize(16);
SelectFile("RBF", 0, MENU_FIRMWARE_CORE_FILE_SELECTED, MENU_NONE1, 0);
@@ -1832,7 +1822,7 @@ void HandleUI(void)
else if (menusub == 11)
menustate = MENU_NONE1;
}
- else if (c == KEY_AMI_BACK) // eject all floppies
+ else if (c == KEY_BACKSPACE) // eject all floppies
{
for (i = 0; i <= drives; i++)
df[i].status = 0;
@@ -1934,25 +1924,25 @@ void HandleUI(void)
ScrollLongName(); // scrolls file name if longer than display line
- if (c == KEY_AMI_HOME)
+ if (c == KEY_HOME)
{
ScanDirectory(SelectedPath, SCAN_INIT, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
}
- if (c == KEY_AMI_BACK)
+ if (c == KEY_BACKSPACE)
{
changeDir("..");
menustate = MENU_FILE_SELECT1;
}
- if ((c == KEY_AMI_PGUP) || (c == KEY_AMI_LEFT))
+ if ((c == KEY_PAGEUP) || (c == KEY_LEFT))
{
ScanDirectory(SelectedPath, SCAN_PREV_PAGE, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
}
- if ((c == KEY_AMI_PGDN) || (c == KEY_AMI_RIGHT))
+ if ((c == KEY_PAGEDOWN) || (c == KEY_RIGHT))
{
ScanDirectory(SelectedPath, SCAN_NEXT_PAGE, fs_pFileExt, fs_Options);
menustate = MENU_FILE_SELECT1;
diff --git a/menu.h b/menu.h
index 0493542..0f2e36b 100644
--- a/menu.h
+++ b/menu.h
@@ -3,23 +3,6 @@
#include "fdd.h" // for adfTYPE definition
-#define KEY_AMI_UPSTROKE 0x80
-#define KEY_AMI_MENU 0x69
-#define KEY_AMI_PGUP 0x6C
-#define KEY_AMI_PGDN 0x6D
-#define KEY_AMI_HOME 0x6A
-#define KEY_AMI_ESC 0x45
-#define KEY_AMI_KPENTER 0x43
-#define KEY_AMI_ENTER 0x44
-#define KEY_AMI_BACK 0x41
-#define KEY_AMI_SPACE 0x40
-#define KEY_AMI_UP 0x4C
-#define KEY_AMI_DOWN 0x4D
-#define KEY_AMI_LEFT 0x4F
-#define KEY_AMI_RIGHT 0x4E
-#define KEY_AMI_KPPLUS 0x5E
-#define KEY_AMI_KPMINUS 0x4A
-
// UI strings, used by boot messages
extern const char *config_filter_msg[];
extern const char *config_memory_chip_msg[];
@@ -40,7 +23,7 @@ void ShowSplash();
void HideSplash();
void EjectAllFloppies();
-void menu_key_set(unsigned char c);
-void menu_mod_set(uint8_t m);
+void menu_key_set(uint32_t c);
+void menu_mod_set(uint32_t m);
#endif
diff --git a/user_io.c b/user_io.c
index dbe7bf2..70b76f3 100644
--- a/user_io.c
+++ b/user_io.c
@@ -10,7 +10,6 @@
#include "user_io.h"
#include "archie.h"
#include "debug.h"
-#include "keycodes.h"
#include "ikbd.h"
#include "spi.h"
#include "mist_cfg.h"
@@ -334,28 +333,6 @@ void user_io_detect_core_type()
}
}
-unsigned short usb2amiga(unsigned char k)
-{
- // replace MENU key by RGUI to allow using Right Amiga on reduced keyboards
- // (it also disables the use of Menu for OSD)
- if (mist_cfg.key_menu_as_rgui && k == 0x65)
- {
- return 0x67;
- }
- return usb2ami[k];
-}
-
-unsigned short usb2ps2code(unsigned char k)
-{
- // replace MENU key by RGUI e.g. to allow using RGUI on reduced keyboards without physical key
- // (it also disables the use of Menu for OSD)
- if (mist_cfg.key_menu_as_rgui && k == 0x65)
- {
- return EXT | 0x27;
- }
- return usb2ps2[k];
-}
-
void user_io_analog_joystick(unsigned char joystick, char valueX, char valueY)
{
if (core_type == CORE_TYPE_8BIT)
@@ -816,6 +793,8 @@ void kbd_reply(char code)
spi_uio_cmd8(UIO_KEYBOARD, code);
}
+static uint8_t use_ps2ctl = 0;
+
void user_io_poll()
{
if ((core_type != CORE_TYPE_MINIMIG2) &&
@@ -1214,7 +1193,6 @@ void user_io_poll()
if (core_type == CORE_TYPE_ARCHIE) archie_poll();
- static uint8_t use_ps2ctl = 0;
static uint8_t leds = 0;
if(use_ps2ctl)
{
@@ -1316,12 +1294,36 @@ char user_io_user_button()
return((!user_io_menu_button() && (fpga_get_buttons() & BUTTON_USR)) ? 1 : 0);
}
-static void send_keycode(unsigned short code)
+static void send_keycode(unsigned short key, int press)
{
if (core_type == CORE_TYPE_MINIMIG2)
{
- // amiga has "break" marker in msb
- if (code & BREAK) code = (code & 0xff) | 0x80;
+ if (press > 1) return;
+
+ uint32_t code = get_amiga_code(key);
+ if (code == NONE) return;
+
+ if (code & CAPS_TOGGLE)
+ {
+ if (press = 1)
+ {
+ // send alternating make and break codes for caps lock
+ if(caps_lock_toggle) code |= 0x80;
+ caps_lock_toggle = !caps_lock_toggle;
+ set_kbd_led(HID_LED_CAPS_LOCK, caps_lock_toggle);
+ }
+ else
+ {
+ return;
+ }
+ }
+ else
+ {
+ // amiga has "break" marker in msb
+ if (!press) code |= 0x80;
+ }
+
+ code &= 0xff;
// send immediately if possible
if (CheckTimer(kbd_timer) && (kbd_fifo_w == kbd_fifo_r))
@@ -1332,63 +1334,103 @@ static void send_keycode(unsigned short code)
{
kbd_fifo_enqueue(code);
}
+ return;
}
if (core_type == CORE_TYPE_MIST)
{
+ if (press > 1) return;
+
+ uint32_t code = get_atari_code(key);
+ if (code == NONE) return;
+
// atari has "break" marker in msb
- if (code & BREAK) code = (code & 0xff) | 0x80;
+ if (!press) code = (code & 0xff) | 0x80;
ikbd_keyboard(code);
+ return;
}
if (core_type == CORE_TYPE_8BIT)
{
- // send ps2 keycodes for those cores that prefer ps2
- spi_uio_cmd_cont(UIO_KEYBOARD);
+ uint32_t code = get_ps2_code(key);
+ if (code == NONE) return;
- // "pause" has a complex code
- if ((code & 0xff) == 0x77)
+ //pause
+ if ((code & 0xff) == 0xE1)
{
// pause does not have a break code
- if (!(code & BREAK))
+ if (press != 1)
{
// Pause key sends E11477E1F014E077
- static const unsigned char c[] = {
- 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 };
+ static const unsigned char c[] = { 0xe1, 0x14, 0x77, 0xe1, 0xf0, 0x14, 0xf0, 0x77, 0x00 };
const unsigned char *p = c;
- iprintf("PS2 KBD ");
+ spi_uio_cmd_cont(UIO_KEYBOARD);
+
+ printf("PS2 PAUSE CODE: ");
while (*p)
{
- iprintf("%x ", *p);
+ printf("%x ", *p);
spi8(*p++);
}
- iprintf("\n");
+ printf("\n");
+
+ DisableIO();
+ }
+ }
+ // print screen
+ else if ((code & 0xff) == 0xE2)
+ {
+ if (press <= 1)
+ {
+ static const unsigned char c[2][8] = {
+ { 0xE0, 0xF0, 0x7C, 0xE0, 0xF0, 0x12, 0x00, 0x00 },
+ { 0xE0, 0x12, 0xE0, 0x7C, 0x00, 0x00, 0x00, 0x00 }
+ };
+
+ const unsigned char *p = c[press];
+
+ spi_uio_cmd_cont(UIO_KEYBOARD);
+
+ printf("PS2 PRINT CODE: ");
+ while (*p)
+ {
+ printf("%x ", *p);
+ spi8(*p++);
+ }
+ printf("\n");
+
+ DisableIO();
}
}
else
{
- /*
- iprintf("PS2 KBD ");
- if (code & EXT) iprintf("e0 ");
- if (code & BREAK) iprintf("f0 ");
- iprintf("%x\n", code & 0xff);
- */
+ if (press > 1 && !use_ps2ctl) return;
+
+ spi_uio_cmd_cont(UIO_KEYBOARD);
// prepend extended code flag if required
if (code & EXT) spi8(0xe0);
// prepend break code if required
- if (code & BREAK) spi8(0xf0);
+ if (!press) spi8(0xf0);
// send code itself
spi8(code & 0xff);
- }
- DisableIO();
+ DisableIO();
+ }
}
- if (core_type == CORE_TYPE_ARCHIE) archie_kbd(code);
+ if (core_type == CORE_TYPE_ARCHIE)
+ {
+ if (press > 1) return;
+
+ uint32_t code = get_archie_code(key);
+ if (code == NONE) return;
+
+ archie_kbd(code);
+ }
}
void user_io_mouse(unsigned char b, int16_t x, int16_t y)
@@ -1423,19 +1465,6 @@ LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI
#define EMU_BTN3 (2+(keyrah*4)) // left alt
#define EMU_BTN4 (3+(keyrah*4)) // left gui (usually windows key)
-unsigned short keycode(unsigned char in)
-{
- if (core_type == CORE_TYPE_MINIMIG2) return usb2amiga(in);
-
- // atari st and the 8 bit core (currently only used for atari 800)
- // use the same key codes
- if (core_type == CORE_TYPE_MIST) return usb2atari[in];
- if (core_type == CORE_TYPE_ARCHIE) return usb2archie[in];
- if (core_type == CORE_TYPE_8BIT) return usb2ps2code(in);
-
- return MISS;
-}
-
extern configTYPE config;
void user_io_check_reset(unsigned short modifiers, char useKeys)
@@ -1473,58 +1502,19 @@ void user_io_check_reset(unsigned short modifiers, char useKeys)
}
}
-unsigned short modifier_keycode(unsigned char index)
-{
- /* usb modifer bits:
- 0 1 2 3 4 5 6 7
- LCTRL LSHIFT LALT LGUI RCTRL RSHIFT RALT RGUI
- */
-
- if (core_type == CORE_TYPE_MINIMIG2)
- {
- static const unsigned short amiga_modifier[] = { 0x63, 0x60, 0x64, 0x66, 0x63, 0x61, 0x65, 0x67 };
- return amiga_modifier[index];
- }
-
- if (core_type == CORE_TYPE_MIST)
- {
- static const unsigned short atari_modifier[] = { 0x1d, 0x2a, 0x38, MISS, 0x1d, 0x36, 0x38, MISS };
- return atari_modifier[index];
- }
-
- if (core_type == CORE_TYPE_8BIT)
- {
- static const unsigned short ps2_modifier[] = { 0x14, 0x12, 0x11, EXT | 0x1f, EXT | 0x14, 0x59, EXT | 0x11, EXT | 0x27 };
- return ps2_modifier[index];
- }
-
- if (core_type == CORE_TYPE_ARCHIE)
- {
- static const unsigned short archie_modifier[] = { 0x36, 0x4c, 0x5e, MISS, 0x61, 0x58, 0x60, MISS };
- return archie_modifier[index];
- }
-
- return MISS;
-}
-
void user_io_osd_key_enable(char on)
{
iprintf("OSD is now %s\n", on ? "visible" : "invisible");
osd_is_visible = on;
}
-static char key_used_by_osd(unsigned short s)
+static char key_used_by_osd(uint32_t s)
{
// this key is only used to open the OSD and has no keycode
- if ((s & OSD_OPEN) && !(s & 0xff)) return true;
+ if (s & OSD_OPEN) return 1;
// no keys are suppressed if the OSD is inactive
- if (!osd_is_visible) return false;
-
- // in atari mode eat all keys if the OSD is online,
- // else none as it's up to the core to forward keys
- // to the OSD
- return((core_type == CORE_TYPE_MIST) || (core_type == CORE_TYPE_ARCHIE) || (core_type == CORE_TYPE_8BIT));
+ return osd_is_visible;
}
void user_io_kbd(uint16_t key, int press)
@@ -1534,105 +1524,37 @@ void user_io_kbd(uint16_t key, int press)
(core_type == CORE_TYPE_ARCHIE) ||
(core_type == CORE_TYPE_8BIT))
{
- uint8_t m = key >> 8;
- uint8_t k = key & 0xFF;
-
- static unsigned char modifier = 0;
-
- // handle modifier keys
- if (m != modifier)
+ if (key)
{
- for (int i = 0; i<8; i++)
- {
- uint16_t code = modifier_keycode(i);
-
- // Do we have a downstroke on a modifier key?
- if ((m & (1 << i)) && !(modifier & (1 << i)))
- {
- if (code != MISS)
- {
- if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- if(!osd_is_visible) send_keycode(code);
- }
- }
-
- if (!(m & (1 << i)) && (modifier & (1 << i)))
- {
- if (code != MISS)
- {
- if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- if (!osd_is_visible) send_keycode(BREAK | code);
- }
- }
- }
-
- modifier = m;
- }
-
- // check if there are keys in the pressed list which aren't
- // reported anymore
- if (k)
- {
- uint16_t code = keycode(k);
+ uint32_t code = get_ps2_code(key);
if (!press)
{
- if (is_menu_core()) printf("keycode(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
+ if (is_menu_core()) printf("PS2 code(break)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- if (code != MISS)
+ if (code & OSD_OPEN) menu_key_set(UPSTROKE | KEY_F12);
+ else if (osd_is_visible) menu_key_set(UPSTROKE | key);
+ else
{
- if (code & OSD_OPEN)
- {
- menu_key_set(KEY_AMI_UPSTROKE | KEY_AMI_MENU);
- }
- else
- {
- // special OSD key handled internally
- if (osd_is_visible) menu_key_set(KEY_AMI_UPSTROKE | usb2amiga(k));
- }
-
- if (!key_used_by_osd(code) && !(code & CAPS_LOCK_TOGGLE) && !(code & NUM_LOCK_TOGGLE))
- {
- send_keycode(BREAK | code);
- }
+ send_keycode(key, press);
}
}
else
{
- if (is_menu_core()) printf("keycode(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
+ if (is_menu_core()) printf("PS2 code(make)%s for core: %d(0x%X)\n", (code & EXT) ? "(ext)" : "", code & 255, code & 255);
- if ((k <= KEYCODE_MAX) && code != MISS)
+ if (code & OSD_OPEN)
{
- // If OSD is visible, then all keys are sent into the OSD
- // using Amiga key codes since the OSD itself uses Amiga key codes
- // for historical reasons. If the OSD is invisble then only
- // those keys marked for OSD in the core specific table are
- // sent for OSD handling.
- if (code & OSD_OPEN)
+ if (press == 1) menu_key_set(KEY_F12);
+ }
+ else if (osd_is_visible)
+ {
+ if (press == 1) menu_key_set(key);
+ }
+ else
+ {
+ if ((code & EMU_SWITCH_1) || ((code & EMU_SWITCH_2) && !use_ps2ctl))
{
- menu_key_set(KEY_AMI_MENU);
- }
- else
- {
- // special OSD key handled internally
- if (osd_is_visible)
- {
- menu_key_set(usb2amiga(k));
- }
- }
-
- // no further processing of any key that is currently
- // redirected to the OSD
- if (!key_used_by_osd(code))
- {
- if (code & CAPS_LOCK_TOGGLE)
- {
- // send alternating make and break codes for caps lock
- send_keycode((code & 0xff) | (caps_lock_toggle ? BREAK : 0));
- caps_lock_toggle = !caps_lock_toggle;
-
- set_kbd_led(HID_LED_CAPS_LOCK, caps_lock_toggle);
- }
- else if (code & NUM_LOCK_TOGGLE)
+ if (press == 1)
{
// num lock has four states indicated by leds:
// all off: normal
@@ -1640,7 +1562,7 @@ void user_io_kbd(uint16_t key, int press)
// num lock on, scroll lock off: joy0 emu
// num lock off, scroll lock on: joy1 emu
- switch (code ^ NUM_LOCK_TOGGLE)
+ switch (code & 0xff)
{
case 1:
if (!joy_force) emu_mode = EMU_MOUSE;
@@ -1670,10 +1592,10 @@ void user_io_kbd(uint16_t key, int press)
if (emu_mode == EMU_MOUSE || emu_mode == EMU_JOY1) set_kbd_led(HID_LED_SCROLL_LOCK, true);
else set_kbd_led(HID_LED_SCROLL_LOCK, false);
}
- else
- {
- send_keycode((press == 2) ? code & ~EXT : code);
- }
+ }
+ else
+ {
+ send_keycode(key, press);
}
}
}