diff --git a/MCUME_teensy41/teensymsx/emucfg.h b/MCUME_teensy41/teensymsx/emucfg.h index 04a0eed..d514b51 100644 --- a/MCUME_teensy41/teensymsx/emucfg.h +++ b/MCUME_teensy41/teensymsx/emucfg.h @@ -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, diff --git a/MCUME_teensy41/teensymsx/wrapemu.cpp b/MCUME_teensy41/teensymsx/wrapemu.cpp index 8ced9b5..6652c9d 100644 --- a/MCUME_teensy41/teensymsx/wrapemu.cpp +++ b/MCUME_teensy41/teensymsx/wrapemu.cpp @@ -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);