Add USB keyboard support to MSX emu

master
jean-marcharvengt 2023-05-28 08:58:33 +02:00
rodzic e664552ed1
commit fd4650802a
2 zmienionych plików z 288 dodań i 65 usunięć

Wyświetl plik

@ -40,11 +40,11 @@ const unsigned short key_map1[]={
#define keylables_map0_2 (char *)" zxcvbnm,.;/"
#define keylables_map0_3 (char *)" +\x10-"
const unsigned short key_map0[] = {
0x0A +1,0x0B +1,0x0C +1,0x0D +1,0x0E +1,0x0F +1,0x10 +1,0x11 +1,0x12 +1,0x13 +1,0x26 +1, //lowecase
0,0x14 +1,0x15 +1,0x16 +1,0x17 +1,0x18 +1,0x19 +1,0x1A +1,0x1B +1,0x1C +1,0x1D +1,
0,0x1F +1,0x20 +1,0x21 +1,0x22 +1,0x23 +1,0x24 +1,0x25 +1,0x1E +1,0,0,0,
0,0,0,0, //U L R D
0,0,0x27 +1,0
'q','w','e','r','t','y','u','i','o','p',0x7F,
0,'a','s','d','f','g','h','j','k','l',0x0A,
0,'z','x','c','v','b','n','m',',','.',';','/',
0,0,0,0,
0,'+',' ','-'
};
#define keylables_map1_0 (char *)"1234567890 "
@ -53,12 +53,11 @@ const unsigned short key_map0[] = {
#define keylables_map1_3 (char *)" "
const unsigned short key_map1[] = {
1+1,2+1,3+1,4+1,5+1,6+1,7+1,8+1,9+1,0+1,0, // digit keys
// '1','2','3','4','5','6','7','8','9','0',0, // digit keys
0, 0,0,0,0,0,0,0,0,0,0,
'1','2','3','4','5','6','7','8','9','0',0, // digit keys
0x09, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,
0,0,' ',0
0x99,0x97,0x96,0x98, //U L R D
0,'+',' ','-'
};
#define keylables_map2_0 (char *)"!\"#$%^&*()@"
@ -66,12 +65,11 @@ const unsigned short key_map1[] = {
#define keylables_map2_2 (char *)" <>:?"
#define keylables_map2_3 (char *)" =\x10_"
const unsigned short key_map2[] = {
// '!','"','#','$','%','^','&','*','(',')','@', // shiftothers
0, 0,0,0,0,0,0,0,0,0,0,
'!','"','#','$','%','^','&','*','(',')','@', // shiftothers
0, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,'<','>',':','?',
0,0,0,0,
0,0,0,0
0x99,0x97,0x96,0x98, //U L R D
0,'=',' ','_'
};
#define keylables_map3_0 (char *)"\x11\x12\x13\x14\x15\x16\x17\x18 "
@ -80,7 +78,7 @@ const unsigned short key_map2[] = {
#define keylables_map3_3 (char *)" "
const unsigned short key_map3[] = {
0, 0,0,0,0,0,0,0,0,0,0,
0x81, 0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x8A,0x8B,0,
0, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,

Wyświetl plik

@ -270,7 +270,9 @@ char *ROMNames[MAXMAPPERS+1] =
};
static byte JoyState;
static int hk = 0;
static int k = 0;
static int iusbhk; // USB keyboard key
static unsigned char linebuffer[WIDTH];
@ -292,9 +294,23 @@ static void * loc_Malloc(int size) {
*/
void emu_KeyboardOnDown(int keymodifer, int key) {
int keyCode = -1;
if ((key >=0xc0) && (key <=0xdf)) {
keyCode = ((key-0xc0) & 0x1f) + 0x7f;
}
else {
keyCode = key & 0x7f;
}
//emu_printi(keyCode);
if (keyCode != -1) {
iusbhk = keyCode;
}
}
void emu_KeyboardOnUp(int keymodifer, int key) {
iusbhk = 0;
}
void msx_Init(void)
@ -320,9 +336,6 @@ void msx_Init(void)
}
static int hk = 0;
static int k = 0;
void msx_Input(int click) {
k = emu_GetPad();
@ -1146,52 +1159,256 @@ void msx_Start(char * Cartridge)
emu_printf("init done");
}
struct { byte Pos,Mask; } Keys[] =
//International Matrix (WIP) codes
#define INV_KEY { 0xff,0xff }
#define AK_0 {0,0x01} //'0'
#define AK_1 {0,0x02} //'1'
#define AK_2 {0,0x04} //'2'
#define AK_3 {0,0x08} //'3'
#define AK_4 {0,0x10} //'4'
#define AK_5 {0,0x20} //'5'
#define AK_6 {0,0x40} //'6'
#define AK_7 {0,0x80} //'7'
#define AK_8 {1,0x01} //'8'
#define AK_9 {1,0x02} //'9'
#define AK_Q {4,0x40} //'q'
#define AK_W {5,0x10} //'w'
#define AK_E {3,0x04} //'e'
#define AK_R {4,0x80} //'r'
#define AK_T {5,0x02} //'t'
#define AK_Y {5,0x40} //'y'
#define AK_U {5,0x04} //'u'
#define AK_I {3,0x40} //'i'
#define AK_O {4,0x10} //'o'
#define AK_P {4,0x20} //'p'
#define AK_A {2,0x40} //'a'
#define AK_S {5,0x01} //'s'
#define AK_D {3,0x02} //'d'
#define AK_F {3,0x08} //'f'
#define AK_G {3,0x10} //'g'
#define AK_H {3,0x20} //'h'
#define AK_J {3,0x80} //'j'
#define AK_K {4,0x01} //'k'
#define AK_L {4,0x02} //'l'
#define AK_Z {5,0x80} //'z'
#define AK_X {5,0x20} //'x'
#define AK_C {3,0x01} //'c'
#define AK_V {5,0x08} //'v'
#define AK_B {2,0x80} //'b'
#define AK_N {4,0x08} //'n'
#define AK_M {4,0x04} //'m'
#define AK_F1 {6,0x20} // 'F1'
#define AK_F2 {6,0x40} // 'F2'
#define AK_F3 {6,0x80} // 'F3'
#define AK_F4 {7,0x01} // 'F4'
#define AK_F5 {7,0x02} // 'F5'
#define AK_F6 INV_KEY // 'F6'
#define AK_F7 INV_KEY // 'F7'
#define AK_F8 INV_KEY // 'F8'
#define AK_F9 INV_KEY // 'F9'
#define AK_F10 INV_KEY // 'F10'
#define AK_DEL {8,0x08} // 'DEL'
#define AK_ENT {7,0x80} // 'return'
#define AK_COMMA {2,0x04} // ','
#define AK_BS {7,0x20} // 'BackSpace'
#define AK_SPC {8,0x01} // ' '
#define AK_TAB {7,0x08} // 'TAB'
#define AK_UP {8,0x20} // 'Up'
#define AK_DN {8,0x40} // 'Down'
#define AK_LF {8,0x10} // 'Left'
#define AK_RT {8,0x80} // 'Right'
#define AK_ESC {7,0x04} // 'ESC'
#define AK_QUOTE {2,0x01} //{2,0x20} // 'QUOTE'
#define AK_NUMBERSIGN INV_KEY // '&'
#define AK_NPLPAREN INV_KEY // '('
#define AK_NPRPAREN INV_KEY // ')'
#define AK_NPMUL {9,0x01} // '*'
#define AK_NPADD {9,0x02} // '+'
#define AK_NPSUB {1,0x04} // '-'
#define AK_PERIOD {2,0x08} // '.'
#define AK_NPDIV {2,0x10} // '/'
#define AK_SEMICOLON {1,0x80} // ';'
#define AK_LTGT INV_KEY // '>'
#define AK_EQUAL {1,0x08} // '='
#define AK_LBRACKET {1,0x20} // '['
#define AK_BACKSLASH {1,0x10} // ''
#define AK_RBRACKET {1,0x40} // ']'
#define AK_BACKQUOTE {2,0x02} // '`'
#define AK_DOUBLEQUOTE {2,0x02} // '`'
#define AK_COLON INV_KEY // ':'
#define AK_DOLLAR INV_KEY // '$'
#define AK_DIESE INV_KEY // '#'
#define AK_AROBAS INV_KEY // '@'
struct { byte Pos,Mask; } keyboardAsciiConv[] = // QWERTY Keyboard
{
{0,0x01}, //'0'
{0,0x02}, //'1'
{0,0x04}, //'2'
{0,0x08}, //'3'
{0,0x10}, //'4'
{0,0x20}, //'5'
{0,0x40}, //'6'
{0,0x80}, //'7'
{1,0x01}, //'8'
{1,0x02}, //'9'
/* 0x00 */ INV_KEY,
/* 0x01 */ INV_KEY,
/* 0x02 */ INV_KEY,
/* 0x03 */ INV_KEY,
/* 0x04 */ INV_KEY,
/* 0x05 */ INV_KEY,
/* 0x06 */ INV_KEY,
/* 0x07 */ INV_KEY,
/* 0x08 */ INV_KEY,
/* 0x09 */ AK_TAB,
/* 0x0A */ AK_ENT,
/* 0x0B */ INV_KEY,
/* 0x0C */ INV_KEY,
/* 0x0D */ INV_KEY,
/* 0x0E */ INV_KEY,
/* 0x0F */ INV_KEY,
/* 0x10 */ INV_KEY,
/* 0x11 */ INV_KEY,
/* 0x12 */ INV_KEY,
/* 0x13 */ INV_KEY,
/* 0x14 */ INV_KEY,
/* 0x15 */ INV_KEY,
/* 0x16 */ INV_KEY,
/* 0x17 */ INV_KEY,
/* 0x18 */ INV_KEY,
/* 0x19 */ INV_KEY,
/* 0x1A */ INV_KEY,
/* 0x1B */ AK_ESC,
/* 0x1C */ INV_KEY,
/* 0x1D */ INV_KEY,
/* 0x1E */ INV_KEY,
/* 0x1F */ INV_KEY,
/* 0x20 */ AK_SPC,
/* 0x21 */ INV_KEY, // exclamation mark
/* 0x22 */ AK_DOUBLEQUOTE, // double quote
/* 0x23 */ AK_DIESE, // diese
/* 0x24 */ AK_DOLLAR, // dollar
/* 0x25 */ INV_KEY, // procent
/* 0x26 */ AK_NUMBERSIGN, // and
/* 0x27 */ AK_QUOTE,
/* 0x28 */ AK_NPLPAREN,
/* 0x29 */ AK_NPRPAREN,
/* 0x2A */ AK_NPMUL,
/* 0x2B */ AK_NPADD,
/* 0x2C */ AK_COMMA,
/* 0x2D */ AK_NPSUB,
/* 0x2E */ AK_PERIOD,
/* 0x2F */ AK_NPDIV,
/* 0x30 */ AK_0,
/* 0x31 */ AK_1,
/* 0x32 */ AK_2,
/* 0x33 */ AK_3,
/* 0x34 */ AK_4,
/* 0x35 */ AK_5,
/* 0x36 */ AK_6,
/* 0x37 */ AK_7,
/* 0x38 */ AK_8,
/* 0x39 */ AK_9,
/* 0x3A */ AK_COLON, // colon :
/* 0x3B */ AK_SEMICOLON, // semi colon
/* 0x3C */ AK_LTGT, // <
/* 0x3D */ AK_EQUAL, // =
/* 0x3E */ INV_KEY, // >
/* 0x3F */ INV_KEY, // ?
/* 0x40 */ AK_AROBAS, // Arobas
/* 0x41 */ INV_KEY, // capital A
/* 0x42 */ INV_KEY,
/* 0x43 */ INV_KEY,
/* 0x44 */ INV_KEY,
/* 0x45 */ INV_KEY,
/* 0x46 */ INV_KEY,
/* 0x47 */ INV_KEY,
/* 0x48 */ INV_KEY,
/* 0x49 */ INV_KEY,
/* 0x4A */ INV_KEY,
/* 0x4B */ INV_KEY,
/* 0x4C */ INV_KEY,
/* 0x4D */ INV_KEY,
/* 0x4E */ INV_KEY,
/* 0x4F */ INV_KEY,
/* 0x50 */ INV_KEY,
/* 0x51 */ INV_KEY,
/* 0x52 */ INV_KEY,
/* 0x53 */ INV_KEY,
/* 0x54 */ INV_KEY,
/* 0x55 */ INV_KEY,
/* 0x56 */ INV_KEY,
/* 0x57 */ INV_KEY,
/* 0x58 */ INV_KEY,
/* 0x59 */ INV_KEY,
/* 0x5A */ INV_KEY,
/* 0x5B */ AK_LBRACKET, // open crochet
/* 0x5C */ AK_BACKSLASH, // back slash
/* 0x5D */ AK_RBRACKET, // close crochet
/* 0x5E */ INV_KEY, // circonflex
/* 0x5F */ INV_KEY, // underscore
/* 0x60 */ AK_BACKQUOTE,
/* 0x61 */ AK_A,
/* 0x62 */ AK_B,
/* 0x63 */ AK_C,
/* 0x64 */ AK_D,
/* 0x65 */ AK_E,
/* 0x66 */ AK_F,
/* 0x67 */ AK_G,
/* 0x68 */ AK_H,
/* 0x69 */ AK_I,
/* 0x6A */ AK_J,
/* 0x6B */ AK_K,
/* 0x6C */ AK_L,
/* 0x6D */ AK_M,
/* 0x6E */ AK_N,
/* 0x6F */ AK_O,
/* 0x70 */ AK_P,
/* 0x71 */ AK_Q,
/* 0x72 */ AK_R,
/* 0x73 */ AK_S,
/* 0x74 */ AK_T,
/* 0x75 */ AK_U,
/* 0x76 */ AK_V,
/* 0x77 */ AK_W,
/* 0x78 */ AK_X,
/* 0x79 */ AK_Y,
/* 0x7A */ AK_Z,
/* 0x7B */ INV_KEY,
/* 0x7C */ INV_KEY,
/* 0x7D */ INV_KEY,
/* 0x7E */ INV_KEY,
/* 0x7F */ AK_BS,
{4,0x40}, //'q'
{5,0x10}, //'w'
{3,0x04}, //'e'
{4,0x80}, //'r'
{5,0x02}, //'t'
{5,0x40}, //'y'
{5,0x04}, //'u'
{3,0x40}, //'i'
{4,0x10}, //'o'
{4,0x20}, //'p'
{2,0x40}, //'a'
{5,0x01}, //'s'
{3,0x02}, //'d'
{3,0x08}, //'f'
{3,0x10}, //'g'
{3,0x20}, //'h'
{3,0x80}, //'j'
{4,0x01}, //'k'
{4,0x02}, //'l'
{7,0x80}, //'return'
{2,0x04}, //','
{5,0x80}, //'z'
{5,0x20}, //'x'
{3,0x01}, //'c'
{5,0x08}, //'v'
{2,0x80}, //'b'
{4,0x08}, //'n'
{4,0x04}, //'m'
{7,0x20}, // 'BackSpace'
{8,0x01} //' '
};
/* 0x80 */ INV_KEY,
/* 0x81 */ AK_F1,
/* 0x82 */ AK_F2,
/* 0x83 */ AK_F3,
/* 0x84 */ AK_F4,
/* 0x85 */ AK_F5,
/* 0x86 */ AK_F6,
/* 0x87 */ AK_F7,
/* 0x88 */ AK_F8,
/* 0x89 */ AK_F9,
/* 0x8A */ AK_F10,
/* 0x8B */ INV_KEY,
/* 0x8C */ INV_KEY,
/* 0x8D */ INV_KEY,
/* 0x8E */ INV_KEY,
/* 0x8F */ INV_KEY,
/* 0x90 */ INV_KEY,
/* 0x91 */ INV_KEY,
/* 0x92 */ INV_KEY,
/* 0x93 */ INV_KEY,
/* 0x94 */ AK_DEL,
/* 0x95 */ INV_KEY,
/* 0x96 */ AK_RT,
/* 0x97 */ AK_LF,
/* 0x98 */ AK_DN,
/* 0x99 */ AK_UP,
/* 0x9A */ INV_KEY,
/* 0x9B */ INV_KEY,
/* 0x9C */ INV_KEY,
/* 0x9D */ INV_KEY,
/* 0x9E */ INV_KEY,
/* 0x9F */ INV_KEY
};
void msx_Step(void) {
JoyState = 0;
@ -1202,9 +1419,17 @@ void msx_Step(void) {
if ( (k & MASK_JOY2_BTN) || (k & MASK_JOY1_BTN) ) JoyState|=0x10;
if (k & MASK_KEY_USER2) JoyState|=0x20;
if (iusbhk) hk = iusbhk;
if (hk != 0) {
emu_printh(hk);
KeyMap[Keys[hk-1].Pos] &=~ Keys[hk-1].Mask;
//emu_printh(hk);
byte row = keyboardAsciiConv[hk].Pos;
byte col = keyboardAsciiConv[hk].Mask;
if ( (row != 0xff) && (col != 0xff) ) {
KeyMap[row] &=~ col;
}
//KeyMap[Keys[hk-1].Pos] &=~ Keys[hk-1].Mask;
}
else {
memset(KeyMap,0xFF,16);