From 6a5ab5380a3d4d0915563a48513a604c5bc15a28 Mon Sep 17 00:00:00 2001 From: zoltanvb Date: Fri, 29 Mar 2024 16:33:01 +0100 Subject: [PATCH] Analog button and keyboard tester. Added analog button indication for those buttons that may have use for it - primarily L2/R2, but support was added for all buttons where at least one controller is known to support it. Added also core option to hide mismatching inputs where analog value is not sent (like keyboard hotkeys assigned to retropad buttons). Analog button inputs are not set up for remote transmission, only for local test. Analog axes have now also dynamic coloring. Added a keyboard tester screen which includes a standard 102-key PC keyboard + extra blocks for all RETROK_ values present in the code. Screen adapted from DOSBox-Pure onscreen keyboard with permission. Keyboard button A+B switches between the two screens. Keyboard inputs are not set up for remote transmission, only for local test. Core option added to select start screen. Other small improvements: core reset will take new option values, input driver applies received values more carefully. --- .../libretro-net-retropad/net_retropad_core.c | 403 ++++++++++++++---- cores/libretro-net-retropad/remotepad.h | 339 ++++++++++++++- input/input_driver.c | 14 +- 3 files changed, 640 insertions(+), 116 deletions(-) diff --git a/cores/libretro-net-retropad/net_retropad_core.c b/cores/libretro-net-retropad/net_retropad_core.c index d6816218f44..1103df832e7 100644 --- a/cores/libretro-net-retropad/net_retropad_core.c +++ b/cores/libretro-net-retropad/net_retropad_core.c @@ -8,7 +8,7 @@ * - Allow changing IP address and port in runtime * - Input recording / Combos * - Enable test input loading from menu - * - Visualization of keyboard and aux inputs (gyro, accelero, light) + * - Visualization of aux inputs (gyro, accelero, light) */ #include @@ -50,13 +50,16 @@ #define DESC_OFFSET(desc, port, index, id) ( \ port * ((desc)->index_max - (desc)->index_min + 1) * ((desc)->id_max - (desc)->id_min + 1) + \ - index * ((desc)->id_max - (desc)->id_min + 1) + \ + (index - (desc)->index_min) * ((desc)->id_max - (desc)->id_min + 1) + \ id \ ) #define MAX_TEST_STEPS 200 #define INITIAL_FRAMES 60*5 #define ONE_TEST_STEP_FRAMES 60*5 +#define KEYBOARD_OFFSET 1000 +#define NETRETROPAD_SCREEN_PAD 0 +#define NETRETROPAD_SCREEN_KEYBOARD 1 struct descriptor { int device; @@ -77,6 +80,9 @@ struct remote_joypad_message { uint16_t state; }; +static bool keyboard_state[RETROK_LAST]; +static bool keyboard_state_validated[RETROK_LAST]; + static int s; static int port; static char server[64]; @@ -114,11 +120,24 @@ static struct descriptor analog = { .id_max = RETRO_DEVICE_ID_ANALOG_Y }; +static struct descriptor analog_button = { + .device = RETRO_DEVICE_ANALOG, + .port_min = 0, + .port_max = 0, + .index_min = RETRO_DEVICE_INDEX_ANALOG_BUTTON, + .index_max = RETRO_DEVICE_INDEX_ANALOG_BUTTON, + .id_min = RETRO_DEVICE_ID_JOYPAD_B, + .id_max = RETRO_DEVICE_ID_JOYPAD_R3 +}; + static struct descriptor *descriptors[] = { &joypad, - &analog + &analog, + &analog_button }; +static uint16_t analog_item_colors[32]; + static uint16_t combo_def[] = { 1 << RETRO_DEVICE_ID_JOYPAD_UP | 1 << RETRO_DEVICE_ID_JOYPAD_LEFT, /* D-pad diagonals */ @@ -137,6 +156,8 @@ static uint16_t combo_def[] = 1 << RETRO_DEVICE_ID_JOYPAD_L2 | 1 << RETRO_DEVICE_ID_JOYPAD_R2 }; +static unsigned current_screen = NETRETROPAD_SCREEN_PAD; + typedef struct { unsigned expected_button; @@ -153,7 +174,7 @@ static unsigned last_test_step = MAX_TEST_STEPS + 1; static uint32_t input_state_validated = 0; static uint32_t combo_state_validated = 0; static bool dump_state_blocked = false; - +static bool hide_analog_mismatch = true; /************************************/ /* JSON Helpers for test input file */ /************************************/ @@ -338,33 +359,64 @@ static bool input_test_file_read(const char* file_path) /* Test input file handling end */ /********************************/ -void NETRETROPAD_CORE_PREFIX(retro_init)(void) +static void draw_background(void) { - unsigned i; - - dump_state_blocked = false; - frame_buf = (uint16_t*)calloc(320 * 240, sizeof(uint16_t)); - if (frame_buf) { unsigned rle, runs, count; + /* Body is 255 * 142 within the 320 * 240 frame */ uint16_t *pixel = frame_buf + 49 * 320 + 32; - for (rle = 0; rle < sizeof(body); ) - { - uint16_t color = 0; - - for (runs = body[rle++]; runs > 0; runs--) + if (current_screen == NETRETROPAD_SCREEN_PAD) + for (rle = 0; rle < sizeof(body); ) { - for (count = body[rle++]; count > 0; count--) - *pixel++ = color; + uint16_t color = 0; - color = 0x4208 - color; + for (runs = body[rle++]; runs > 0; runs--) + { + for (count = body[rle++]; count > 0; count--) + *pixel++ = color; + + color = 0x4208 - color; + } + + pixel += 65; } + else if (current_screen == NETRETROPAD_SCREEN_KEYBOARD) + for (rle = 0; rle < sizeof(keyboard_body); ) + { + uint16_t color = 0; - pixel += 65; - } + for (runs = keyboard_body[rle++]; runs > 0; runs--) + { + for (count = keyboard_body[rle++]; count > 0; count--) + *pixel++ = color; + + color = 0x4208 - color; + } + + pixel += 65; + } } +} + +static void flip_screen(void) +{ + if (current_screen == NETRETROPAD_SCREEN_PAD) + current_screen = NETRETROPAD_SCREEN_KEYBOARD; + else if (current_screen == NETRETROPAD_SCREEN_KEYBOARD) + current_screen = NETRETROPAD_SCREEN_PAD; + draw_background(); +} + +void NETRETROPAD_CORE_PREFIX(retro_init)(void) +{ + unsigned i; + + dump_state_blocked = false; + frame_buf = (uint16_t*)calloc(320 * 240, sizeof(uint16_t)); + + draw_background(); /* Allocate descriptor values */ for (i = 0; i < ARRAY_SIZE(descriptors); i++) @@ -430,6 +482,39 @@ void NETRETROPAD_CORE_PREFIX(retro_get_system_av_info)( info->geometry.aspect_ratio = 4.0 / 3.0; } +static void NETRETROPAD_CORE_PREFIX(update_keyboard_cb)(bool down, unsigned keycode, + uint32_t character, uint16_t key_modifiers) +{ + struct retro_message message; + char buf[255]; + + if (keycode < RETROK_LAST) + { + keyboard_state[keycode] = down ? true : false; + if (down && ((keycode == RETROK_a && keyboard_state[RETROK_b]) || (keycode == RETROK_b && keyboard_state[RETROK_a]))) + flip_screen(); + /* Message for the keypresses not shown as actual keys, just placeholder blocks */ + if ((keycode == 0) || + (keycode == 12) || + (keycode >= 33 && keycode < 39) || + (keycode >= 40 && keycode < 44) || + (keycode == 58) || + (keycode == 60) || + (keycode >= 62 && keycode < 65) || + (keycode >= 94 && keycode < 96) || + (keycode >= 123 && keycode < 127) || + (keycode == 272) || + (keycode >= 294 && keycode < 297) || + (keycode >= 309 && keycode < 323)) + { + snprintf(buf, sizeof(buf), "Key pressed: %d",keycode); + message.msg = buf; + message.frames = 60; + NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_SET_MESSAGE, &message); + } + } +} + static void retropad_update_input(void) { unsigned i; @@ -477,7 +562,11 @@ static void retropad_update_input(void) /* Update state */ desc->value[offset] = state; - /* Attempt to send updated state */ + /* Do not send analog button state - RA side is not prepared to receive it */ + if (i>1) + continue; + + /* Otherwise, attempt to send updated state */ msg.port = port; msg.device = desc->device; msg.index = index; @@ -492,6 +581,35 @@ static void retropad_update_input(void) } } +static void open_UDP_socket() +{ + socket_target_t in_target; + + if (s && s != SOCKET_ERROR) + close(s); + + s = socket_create( + "retropad", + SOCKET_DOMAIN_INET, + SOCKET_TYPE_DATAGRAM, + SOCKET_PROTOCOL_UDP); + + if (s == SOCKET_ERROR) + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "socket failed"); + + /* setup address structure */ + memset((char *) &si_other, 0, sizeof(si_other)); + + in_target.port = port; + in_target.server = server; + in_target.domain = SOCKET_DOMAIN_INET; + + socket_set_target(&si_other, &in_target); + + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "Server IP Address: %s\n" , server); + +} + void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) { static const struct retro_variable vars[] = { @@ -500,10 +618,13 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) { "net_retropad_ip_octet2", "IP address part 2; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, { "net_retropad_ip_octet3", "IP address part 3; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, { "net_retropad_ip_octet4", "IP address part 4; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, - + { "net_retropad_screen", "Start screen; Retropad|Keyboard tester" }, + { "net_retropad_hide_analog_mismatch", "Hide mismatching analog button inputs; True|False" }, { NULL, NULL }, }; enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; + struct retro_keyboard_callback kcb = { NETRETROPAD_CORE_PREFIX(update_keyboard_cb) }; + cb(RETRO_ENVIRONMENT_SET_VARIABLES, (void*)vars); NETRETROPAD_CORE_PREFIX(environ_cb) = cb; @@ -514,25 +635,42 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) if (cb(RETRO_ENVIRONMENT_GET_LOG_INTERFACE, &logger)) NETRETROPAD_CORE_PREFIX(log_cb) = logger.log; + + NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK, &kcb); + } static void netretropad_check_variables(void) { - struct retro_variable var, var2, var3, var4, port_var; - var.key = "net_retropad_ip_octet1"; - var2.key = "net_retropad_ip_octet2"; - var3.key = "net_retropad_ip_octet3"; - var4.key = "net_retropad_ip_octet4"; - port_var.key = "net_retropad_port"; + struct retro_variable var, var2, var3, var4, port_var, screen_var, hide_a_var; + var.key = "net_retropad_ip_octet1"; + var2.key = "net_retropad_ip_octet2"; + var3.key = "net_retropad_ip_octet3"; + var4.key = "net_retropad_ip_octet4"; + port_var.key = "net_retropad_port"; + screen_var.key = "net_retropad_screen"; + hide_a_var.key = "net_retropad_hide_analog_mismatch"; NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var2); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var3); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &var4); NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &port_var); + NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &screen_var); + NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_VARIABLE, &hide_a_var); snprintf(server, sizeof(server), "%s.%s.%s.%s", var.value, var2.value, var3.value, var4.value); port = atoi(port_var.value); + + if (screen_var.value && + ((current_screen == NETRETROPAD_SCREEN_PAD && strstr(screen_var.value,"Keyboard")) || + (current_screen == NETRETROPAD_SCREEN_KEYBOARD && strstr(screen_var.value,"Retropad")))) + flip_screen(); + if (hide_a_var.value && strstr(hide_a_var.value,"True")) + hide_analog_mismatch = true; + else + hide_analog_mismatch = false; + } void NETRETROPAD_CORE_PREFIX(retro_set_audio_sample)(retro_audio_sample_t cb) @@ -562,7 +700,10 @@ void NETRETROPAD_CORE_PREFIX(retro_set_video_refresh)(retro_video_refresh_t cb) } void NETRETROPAD_CORE_PREFIX(retro_reset)(void) -{} +{ + netretropad_check_variables(); + open_UDP_socket(); +} void NETRETROPAD_CORE_PREFIX(retro_run)(void) { @@ -582,31 +723,60 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) int offset = DESC_OFFSET(&joypad, 0, 0, i); if (joypad.value[offset]) input_state |= 1 << i; + + /* Construct a red gradient representation for analog buttons */ + offset = DESC_OFFSET(&analog_button, 0, RETRO_DEVICE_INDEX_ANALOG_BUTTON, i); + analog_item_colors[i] = (uint16_t)((int16_t)analog_button.value[offset]/1638) << 11; } for (i = analog.id_min; i <= analog.id_max; i++) { /* bitmap: x-- x- x+ x++ y-- y- y+ y++*/ - /* default analog deadzone: 0.0 - increased for convenience, default analog threshold: 0.5 */ + /* default analog deadzone: 0.0 - increased for convenience to 0.1, default analog threshold: 0.5 */ + /* Red gradient also calculated */ int offset = DESC_OFFSET(&analog, 0, RETRO_DEVICE_INDEX_ANALOG_LEFT, i); - if ( (int16_t)analog.value[offset] < -32766/2) + if ( (int16_t)analog.value[offset] < -32768/2) + { input_state |= 1 << (16 + i*8 + 0); + analog_item_colors[ 16 + i*8 + 0] = (uint16_t)((-1*((int16_t)analog.value[offset])-32768/2) /528) << 11; + } else if ((int16_t)analog.value[offset] < -3276) + { input_state |= 1 << (16 + i*8 + 1); + analog_item_colors[ 16 + i*8 + 1] = (uint16_t)((-1*((int16_t)analog.value[offset]) ) /528) << 11; + } else if ((int16_t)analog.value[offset] > 32768/2) + { input_state |= 1 << (16 + i*8 + 3); + analog_item_colors[ 16 + i*8 + 3] = (uint16_t)(( ((int16_t)analog.value[offset])-32768/2) /528) << 11; + } else if ((int16_t)analog.value[offset] > 3276) + { input_state |= 1 << (16 + i*8 + 2); + analog_item_colors[ 16 + i*8 + 2] = (uint16_t)(( ((int16_t)analog.value[offset]) ) /528) << 11; + } offset = DESC_OFFSET(&analog, 0, RETRO_DEVICE_INDEX_ANALOG_RIGHT, i); - if ( (int16_t)analog.value[offset] < -32766/2) + if ( (int16_t)analog.value[offset] < -32768/2) + { input_state |= 1 << (16 + i*8 + 4); + analog_item_colors[ 16 + i*8 + 4] = (uint16_t)((-1*((int16_t)analog.value[offset])-32768/2) /528) << 11; + } else if ((int16_t)analog.value[offset] < -3276) + { input_state |= 1 << (16 + i*8 + 5); + analog_item_colors[ 16 + i*8 + 5] = (uint16_t)((-1*((int16_t)analog.value[offset]) ) /528) << 11; + } else if ((int16_t)analog.value[offset] > 32768/2) + { input_state |= 1 << (16 + i*8 + 7); + analog_item_colors[ 16 + i*8 + 7] = (uint16_t)(( ((int16_t)analog.value[offset])-32768/2) /528) << 11; + } else if ((int16_t)analog.value[offset] > 3276) + { input_state |= 1 << (16 + i*8 + 6); + analog_item_colors[ 16 + i*8 + 6] = (uint16_t)(( ((int16_t)analog.value[offset]) ) /528) << 11; + } } /* Input test section start. */ @@ -619,7 +789,7 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) } /* Print a log for A+B combination, but only once while those are pressed */ - if (input_state == ((1 << RETRO_DEVICE_ID_JOYPAD_A | 1 << RETRO_DEVICE_ID_JOYPAD_B) & 0x0000ffff)) + if (input_state & ((1 << RETRO_DEVICE_ID_JOYPAD_A | 1 << RETRO_DEVICE_ID_JOYPAD_B) & 0x0000ffff)) { if (!dump_state_blocked) { @@ -647,6 +817,9 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "[Remote RetroPad]: Proceeding to test step %d at frame %d, next: %d\n", current_test_step,current_frame,next_teststep_frame+INITIAL_FRAMES); + if((input_test_steps[current_test_step].expected_button < KEYBOARD_OFFSET && current_screen == NETRETROPAD_SCREEN_KEYBOARD) || + (input_test_steps[current_test_step].expected_button >= KEYBOARD_OFFSET && current_screen == NETRETROPAD_SCREEN_PAD)) + flip_screen(); } else { @@ -671,8 +844,20 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) if (current_test_step < last_test_step) { - expected_input = 1 << input_test_steps[current_test_step].expected_button; - if(input_state & expected_input) + bool test_success = false; + if (input_test_steps[current_test_step].expected_button < KEYBOARD_OFFSET) + { + expected_input = 1 << input_test_steps[current_test_step].expected_button; + if(input_state & expected_input) + test_success = true; + } + else + { + expected_input = input_test_steps[current_test_step].expected_button - KEYBOARD_OFFSET; + if (expected_input < RETROK_LAST && keyboard_state[expected_input]) + test_success = true; + } + if (test_success) { NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "[Remote RetroPad]: Test step %d successful at frame %d\n", @@ -683,82 +868,124 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) } } /* Input test section end. */ - - for (rle = 0; rle < sizeof(retropad_buttons); ) + if (current_screen == NETRETROPAD_SCREEN_PAD) { - unsigned runs; - char paint = 0; - - for (runs = retropad_buttons[rle++]; runs > 0; runs--) + for (rle = 0; rle < sizeof(retropad_buttons); ) { - unsigned button = paint ? 1 << retropad_buttons[rle++] : 0; + unsigned runs; + char paint = 0; - if (paint) + for (runs = retropad_buttons[rle++]; runs > 0; runs--) { - unsigned count; - uint16_t color; - - /* Red for active inputs */ - if (input_state & button) + if (paint) { - color = 0xA000; - input_state_validated |= button; + unsigned button = 0; + unsigned button_analog = 0; + unsigned count; + uint16_t color; + + /* 0 - 15: buttons, 16 - 31: analog x/y */ + /* 32 - 47: analog input for same buttons */ + if (retropad_buttons[rle] < 32) + button = 1 << retropad_buttons[rle]; + else + button_analog = 1 << (retropad_buttons[rle] - 32); + + /* Red for active inputs */ + if (input_state & button) + { + if(retropad_buttons[rle]<16) + color = 0xA000; + else + /* Gradient for analog axes */ + color = analog_item_colors[retropad_buttons[rle]]; + input_state_validated |= button; + } + /* Red gradient for active analog button inputs, from 0 to 0xa000 */ + else if (button_analog && analog_item_colors[retropad_buttons[rle] - 32]) + { + color = analog_item_colors[retropad_buttons[rle] - 32]; + } + else if (button_analog && hide_analog_mismatch && input_state & button_analog) + color = 0xA000; + else + { + /* Light blue for expected input */ + if (expected_input & button || expected_input & button_analog) + color = 0x7fff; + /* Light green for already validated input */ + else if (input_state_validated & button || input_state_validated & button_analog) + color = 0xbff7; + /* White as default */ + else + color = 0xffff; + } + + rle++; + for (count = retropad_buttons[rle++]; count > 0; count--) + *pixel++ = color; } else + pixel += retropad_buttons[rle++]; + + paint = !paint; + } + + pixel += 65; + } + } + else if (current_screen == NETRETROPAD_SCREEN_KEYBOARD) + { + for (rle = 0; rle < ARRAY_SIZE(keyboard_buttons); ) + { + unsigned runs; + char paint = 0; + + for (runs = keyboard_buttons[rle++]; runs > 0; runs--) + { + if (paint) { - /* Light blue for expected input */ - if (expected_input & button) - color = 0x7fff; - /* Light green for already validated input */ - else if (input_state_validated & button ) - color = 0xbff7; - /* White as default */ + unsigned count; + uint16_t color; + + /* Same color scheme as for retropad buttons */ + if (keyboard_state[keyboard_buttons[rle]]) + { + color = 0xA000; + keyboard_state_validated[keyboard_buttons[rle]] = true; + } else - color = 0xffff; + { + if (expected_input > 0 && expected_input == keyboard_buttons[rle]) + color = 0x7fff; + else if (keyboard_state_validated[keyboard_buttons[rle]]) + color = 0xbff7; + else + color = 0xffff; + } + rle++; + + for (count = keyboard_buttons[rle++]; count > 0; count--) + *pixel++ = color; } + else + pixel += keyboard_buttons[rle++]; - for (count = retropad_buttons[rle++]; count > 0; count--) - *pixel++ = color; + paint = !paint; } - else - pixel += retropad_buttons[rle++]; - paint = !paint; + pixel += 65; } - - pixel += 65; } NETRETROPAD_CORE_PREFIX(video_cb)(frame_buf, 320, 240, 640); - retro_sleep(4); } bool NETRETROPAD_CORE_PREFIX(retro_load_game)(const struct retro_game_info *info) { - socket_target_t in_target; - netretropad_check_variables(); - - s = socket_create( - "retropad", - SOCKET_DOMAIN_INET, - SOCKET_TYPE_DATAGRAM, - SOCKET_PROTOCOL_UDP); - - if (s == SOCKET_ERROR) - NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "socket failed"); - - /* setup address structure */ - memset((char *) &si_other, 0, sizeof(si_other)); - - in_target.port = port; - in_target.server = server; - in_target.domain = SOCKET_DOMAIN_INET; - - socket_set_target(&si_other, &in_target); - - NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "Server IP Address: %s\n" , server); + open_UDP_socket(); /* If a .ratst file is given (only possible via command line), * initialize test sequence. */ diff --git a/cores/libretro-net-retropad/remotepad.h b/cores/libretro-net-retropad/remotepad.h index 8a058d7ac50..ea443f20a11 100644 --- a/cores/libretro-net-retropad/remotepad.h +++ b/cores/libretro-net-retropad/remotepad.h @@ -1,6 +1,8 @@ #ifndef REMOTEPAD_H #define REMOTEPAD_H +/* Run-length-encoded format, serialized. */ +/* Number of segments - length of individual segments (segment are alternating black and background color, always starting with black) */ static uint8_t body[] = { /* 0 */ 3, 38, 13, 204, @@ -156,8 +158,8 @@ static uint8_t retropad_buttons[] = /* 0 */ 5, 38, 12, 13, 154, 13, 13, 37, /* 1 */ 5, 35, 12, 21, 144, 13, 21, 34, /* 2 */ 5, 33, 12, 26, 138, 13, 26, 32, - /* 3 */ 5, 32, 12, 28, 136, 13, 28, 31, - /* 4 */ 5, 32, 12, 29, 134, 13, 30, 30, + /* 3 */ 13, 32, 12, 7, 0, 44, 15, 0, 12, 6, 136, 13, 8, 0, 45, 14, 0, 13, 6, 31, + /* 4 */ 13, 32, 12, 7, 0, 44, 15, 0, 12, 7, 134, 13, 9, 0, 45, 14, 0, 13, 7, 30, /* 5 */ 5, 31, 12, 31, 133, 13, 30, 30, /* 6 */ 5, 31, 12, 31, 133, 13, 30, 30, /* 7 */ 9, 31, 12, 2, 23, 12, 6, 133, 13, 5, 24, 13, 1, 30, @@ -168,9 +170,9 @@ static uint8_t retropad_buttons[] = /* 12 */ 5, 39, 10, 13, 152, 11, 14, 37, /* 13 */ 5, 34, 10, 24, 141, 11, 24, 32, /* 14 */ 5, 31, 10, 29, 136, 11, 29, 30, - /* 15 */ 5, 30, 10, 31, 134, 11, 32, 28, - /* 16 */ 5, 29, 10, 33, 133, 11, 32, 28, - /* 17 */ 5, 29, 10, 33, 133, 11, 32, 28, + /* 15 */ 13, 30, 10, 9, 0, 42, 15, 0, 10, 7, 134, 11, 9, 0, 43, 14, 0, 11, 9, 28, + /* 16 */ 13, 29, 10, 10, 0, 42, 15, 0, 10, 8, 133, 11, 9, 0, 43, 14, 0, 11, 9, 28, + /* 17 */ 13, 29, 10, 10, 0, 42, 15, 0, 10, 8, 133, 11, 9, 0, 43, 14, 0, 11, 9, 28, /* 18 */ 5, 29, 10, 33, 133, 11, 32, 28, /* 19 */ 5, 29, 10, 33, 133, 11, 32, 28, /* 20 */ 5, 29, 10, 33, 133, 11, 32, 28, @@ -215,12 +217,12 @@ static uint8_t retropad_buttons[] = /* 59 */ 3, 204, 9, 13, 38, /* 60 */ 3, 203, 9, 15, 37, /* 61 */ 3, 202, 9, 16, 37, - /* 62 */ 3, 202, 9, 17, 36, - /* 63 */ 5, 39, 4, 13, 149, 9, 18, 36, - /* 64 */ 5, 39, 4, 13, 149, 9, 18, 36, - /* 65 */ 5, 39, 4, 13, 149, 9, 18, 36, - /* 66 */ 5, 39, 4, 13, 149, 9, 18, 36, - /* 67 */ 5, 39, 4, 13, 150, 9, 17, 36, + /* 62 */ 7, 202, 9, 6, 0, 41, 5, 0, 9, 6, 36, + /* 63 */ 9, 39, 4, 13, 149, 9, 7, 0, 41, 5, 0, 9, 6, 36, + /* 64 */ 9, 39, 4, 13, 149, 9, 7, 0, 41, 5, 0, 9, 7, 35, + /* 65 */ 9, 39, 4, 13, 149, 9, 7, 0, 41, 5, 0, 9, 7, 35, + /* 66 */ 9, 39, 4, 13, 149, 9, 7, 0, 41, 5, 0, 9, 7, 35, + /* 67 */ 9, 39, 4, 13, 150, 9, 6, 0, 41, 5, 0, 9, 6, 36, /* 68 */ 5, 39, 4, 13, 150, 9, 17, 36, /* 69 */ 5, 39, 4, 13, 151, 9, 15, 37, /* 70 */ 5, 39, 4, 13, 151, 9, 14, 38, @@ -233,12 +235,12 @@ static uint8_t retropad_buttons[] = /* 77 */ 9, 24, 6, 12, 19, 7, 12, 115, 1, 12, 33, 8, 12, 16, /* 78 */ 13, 24, 6, 13, 17, 7, 13, 30, 2, 14, 35, 3, 13, 22, 1, 14, 30, 8, 15, 15, /* 79 */ 13, 24, 6, 14, 15, 7, 14, 30, 2, 14, 34, 3, 14, 21, 1, 16, 29, 8, 16, 14, - /* 80 */ 13, 24, 6, 15, 13, 7, 15, 30, 2, 14, 34, 3, 14, 21, 1, 17, 27, 8, 17, 14, - /* 81 */ 13, 24, 6, 16, 11, 7, 16, 30, 2, 14, 34, 3, 14, 20, 1, 18, 27, 8, 18, 13, - /* 82 */ 13, 24, 6, 16, 12, 7, 15, 30, 2, 14, 34, 3, 14, 20, 1, 18, 27, 8, 18, 13, - /* 83 */ 13, 24, 6, 15, 14, 7, 14, 30, 2, 14, 34, 3, 14, 20, 1, 18, 26, 8, 19, 13, - /* 84 */ 13, 24, 6, 14, 16, 7, 13, 30, 2, 14, 34, 3, 14, 20, 1, 18, 27, 8, 18, 13, - /* 85 */ 9, 24, 6, 13, 18, 7, 12, 112, 1, 18, 27, 8, 17, 14, + /* 80 */ 21, 24, 6, 15, 13, 7, 15, 30, 2, 14, 34, 3, 14, 21, 1, 6, 0, 33, 5, 0, 1, 6, 27, 8, 7, 0, 40, 5, 0, 8, 5, 14, + /* 81 */ 21, 24, 6, 16, 11, 7, 16, 30, 2, 14, 34, 3, 14, 20, 1, 7, 0, 33, 5, 0, 1, 6, 27, 8, 7, 0, 40, 5, 0, 8, 6, 13, + /* 82 */ 21, 24, 6, 16, 12, 7, 15, 30, 2, 14, 34, 3, 14, 20, 1, 7, 0, 33, 5, 0, 1, 7, 26, 8, 7, 0, 40, 5, 0, 8, 6, 13, + /* 83 */ 21, 24, 6, 15, 14, 7, 14, 30, 2, 14, 34, 3, 14, 20, 1, 7, 0, 33, 5, 0, 1, 7, 25, 8, 8, 0, 40, 5, 0, 8, 6, 13, + /* 84 */ 21, 24, 6, 14, 16, 7, 13, 30, 2, 14, 34, 3, 14, 20, 1, 7, 0, 33, 5, 0, 1, 7, 26, 8, 7, 0, 40, 5, 0, 8, 6, 13, + /* 85 */ 17, 24, 6, 13, 18, 7, 12, 112, 1, 7, 0, 33, 5, 0, 1, 6, 27, 8, 7, 0, 40, 5, 0, 8, 5, 14, /* 86 */ 9, 24, 6, 12, 20, 7, 11, 113, 1, 17, 27, 8, 17, 14, /* 87 */ 11, 24, 6, 11, 10, 5, 1, 11, 7, 10, 113, 1, 16, 29, 8, 16, 14, /* 88 */ 7, 44, 5, 3, 134, 1, 14, 31, 8, 14, 15, @@ -251,12 +253,12 @@ static uint8_t retropad_buttons[] = /* 95 */ 5, 39, 5, 13, 152, 0, 13, 38, /* 96 */ 5, 39, 5, 13, 151, 0, 15, 37, /* 97 */ 5, 39, 5, 13, 150, 0, 17, 36, - /* 98 */ 5, 39, 5, 13, 150, 0, 17, 36, - /* 99 */ 5, 39, 5, 13, 149, 0, 18, 36, - /* 100 */ 5, 39, 5, 13, 149, 0, 18, 36, - /* 101 */ 3, 201, 0, 18, 36, - /* 102 */ 3, 201, 0, 18, 36, - /* 103 */ 3, 202, 0, 17, 36, + /* 98 */ 9, 39, 5, 13, 150, 0, 6, 0, 32, 6, 0, 0, 5, 36, + /* 99 */ 9, 39, 5, 13, 149, 0, 7, 0, 32, 6, 0, 0, 6, 35, + /* 100 */ 9, 39, 5, 13, 149, 0, 7, 0, 32, 6, 0, 0, 6, 35, + /* 101 */ 7, 201, 0, 7, 0, 32, 6, 0, 0, 6, 35, + /* 102 */ 7, 201, 0, 7, 0, 32, 6, 0, 0, 6, 35, + /* 103 */ 7, 202, 0, 6, 0, 32, 6, 0, 0, 5, 36, /* 104 */ 7, 84, 24, 5, 78, 28, 5, 30, 0, 17, 36, /* 105 */ 7, 82, 24, 9, 74, 28, 9, 29, 0, 15, 37, /* 106 */ 7, 82, 24, 9, 74, 28, 9, 30, 0, 13, 38, @@ -299,4 +301,295 @@ static uint8_t retropad_buttons[] = /* sizeof( buttons ) = 1238 */ +static uint8_t keyboard_body[] = +{ + /* 0 */ 1, 255, + /* 1 */ 1, 255, + /* 2 */ 1, 255, + /* 3 */ 2, 0, 255, + /* 4 */ 2, 0, 255, + /* 5 */ 2, 0, 255, + /* 6 */ 2, 0, 255, + /* 7 */ 2, 0, 255, + /* 8 */ 2, 0, 255, + /* 9 */ 2, 0, 255, + /* 10 */ 2, 0, 255, + /* 11 */ 2, 0, 255, + /* 12 */ 2, 0, 255, + /* 13 */ 2, 0, 255, + /* 14 */ 2, 0, 255, + /* 15 */ 2, 0, 255, + /* 16 */ 2, 0, 255, + /* 17 */ 2, 0, 255, + /* 18 */ 2, 0, 255, + /* 19 */ 2, 0, 255, + /* 20 */ 2, 0, 255, + /* 21 */ 2, 0, 255, + /* 22 */ 2, 0, 255, + /* 23 */ 2, 0, 255, + /* 24 */ 2, 0, 255, + /* 25 */ 2, 0, 255, + /* 26 */ 2, 0, 255, + /* 27 */ 2, 0, 255, + /* 28 */ 2, 0, 255, + /* 29 */ 2, 0, 255, + /* 30 */ 2, 0, 255, + /* 31 */ 2, 0, 255, + /* 32 */ 2, 0, 255, + /* 33 */ 2, 0, 255, + /* 34 */ 2, 0, 255, + /* 35 */ 2, 0, 255, + /* 36 */ 2, 0, 255, + /* 37 */ 2, 0, 255, + /* 38 */ 2, 0, 255, + /* 39 */ 2, 0, 255, + /* 40 */ 2, 0, 255, + /* 41 */ 2, 0, 255, + /* 42 */ 2, 0, 255, + /* 43 */ 2, 0, 255, + /* 44 */ 2, 0, 255, + /* 45 */ 2, 0, 255, + /* 46 */ 2, 0, 255, + /* 47 */ 2, 0, 255, + /* 48 */ 2, 0, 255, + /* 49 */ 2, 0, 255, + /* 50 */ 2, 0, 255, + /* 51 */ 2, 0, 255, + /* 52 */ 2, 0, 255, + /* 53 */ 2, 0, 255, + /* 54 */ 2, 0, 255, + /* 55 */ 2, 0, 255, + /* 56 */ 2, 0, 255, + /* 57 */ 2, 0, 255, + /* 58 */ 2, 0, 255, + /* 59 */ 2, 0, 255, + /* 60 */ 2, 0, 255, + /* 61 */ 2, 0, 255, + /* 62 */ 2, 0, 255, + /* 63 */ 2, 0, 255, + /* 64 */ 2, 0, 255, + /* 65 */ 2, 0, 255, + /* 66 */ 2, 0, 255, + /* 67 */ 2, 0, 255, + /* 68 */ 2, 0, 255, + /* 69 */ 2, 0, 255, + /* 70 */ 2, 0, 255, + /* 71 */ 2, 0, 255, + /* 72 */ 2, 0, 255, + /* 73 */ 2, 0, 255, + /* 74 */ 2, 0, 255, + /* 75 */ 2, 0, 255, + /* 76 */ 2, 0, 255, + /* 77 */ 2, 0, 255, + /* 78 */ 2, 0, 255, + /* 79 */ 2, 0, 255, + /* 80 */ 2, 0, 255, + /* 81 */ 2, 0, 255, + /* 82 */ 2, 0, 255, + /* 83 */ 2, 0, 255, + /* 84 */ 2, 0, 255, + /* 85 */ 2, 0, 255, + /* 86 */ 2, 0, 255, + /* 87 */ 2, 0, 255, + /* 88 */ 2, 0, 255, + /* 89 */ 2, 0, 255, + /* 90 */ 2, 0, 255, + /* 91 */ 2, 0, 255, + /* 92 */ 2, 0, 255, + /* 93 */ 2, 0, 255, + /* 94 */ 2, 0, 255, + /* 95 */ 2, 0, 255, + /* 96 */ 2, 0, 255, + /* 97 */ 2, 0, 255, + /* 98 */ 2, 0, 255, + /* 99 */ 2, 0, 255, + /* 100 */ 2, 0, 255, + /* 101 */ 2, 0, 255, + /* 102 */ 2, 0, 255, + /* 103 */ 2, 0, 255, + /* 104 */ 2, 0, 255, + /* 105 */ 2, 0, 255, + /* 106 */ 2, 0, 255, + /* 107 */ 2, 0, 255, + /* 108 */ 2, 0, 255, + /* 109 */ 2, 0, 255, + /* 110 */ 2, 0, 255, + /* 111 */ 2, 0, 255, + /* 112 */ 2, 0, 255, + /* 113 */ 2, 0, 255, + /* 114 */ 2, 0, 255, + /* 115 */ 2, 0, 255, + /* 116 */ 2, 0, 255, + /* 117 */ 2, 0, 255, + /* 118 */ 2, 0, 255, + /* 119 */ 2, 0, 255, + /* 120 */ 2, 0, 255, + /* 121 */ 2, 0, 255, + /* 122 */ 2, 0, 255, + /* 123 */ 2, 0, 255, + /* 124 */ 2, 0, 255, + /* 125 */ 2, 0, 255, + /* 126 */ 2, 0, 255, + /* 127 */ 2, 0, 255, + /* 128 */ 2, 0, 255, + /* 129 */ 2, 0, 255, + /* 130 */ 2, 0, 255, + /* 131 */ 2, 0, 255, + /* 132 */ 2, 0, 255, + /* 133 */ 2, 0, 255, + /* 134 */ 2, 0, 255, + /* 135 */ 2, 0, 255, + /* 136 */ 2, 0, 255, + /* 137 */ 1, 255, + /* 138 */ 1, 255, + /* 139 */ 1, 255, + /* 140 */ 1, 255, + /* 141 */ 1, 255, +}; + +static uint16_t keyboard_buttons[] = +{ + /* 0 */ 1, 255, + /* 1 */ 1, 255, + /* 2 */ 1, 255, + /* 3 */ 1, 255, + /* 4 */ 69, 1, 27, 3, 22, 282, 4, 1, 282, 1, 5, 283, 3, 1, 283, 3, 5, 284, 3, 1, 284, 3, 5, 285, 3, 1, 285, 1, 2, 285, 1, 13, 286, 3, 1, 286, 4, 4, 287, 3, 2, 287, 3, 4, 288, 3, 1, 288, 4, 4, 289, 3, 2, 289, 2, 14, 290, 4, 1, 290, 3, 4, 291, 2, 1, 291, 1, 1, 291, 3, 4, 292, 4, 1, 292, 1, 1, 292, 1, 4, 293, 2, 1, 293, 1, 1, 293, 3, 5, 316, 4, 1, 316, 3, 4, 302, 3, 1, 302, 1, 7, 19, 3, 40, + /* 5 */ 69, 1, 27, 3, 22, 282, 4, 1, 282, 1, 5, 283, 3, 1, 283, 3, 5, 284, 3, 1, 284, 3, 5, 285, 3, 1, 285, 1, 2, 285, 1, 13, 286, 3, 1, 286, 4, 4, 287, 3, 2, 287, 3, 4, 288, 3, 1, 288, 4, 4, 289, 3, 2, 289, 2, 14, 290, 4, 1, 290, 3, 4, 291, 2, 1, 291, 1, 1, 291, 3, 4, 292, 4, 1, 292, 1, 1, 292, 1, 4, 293, 2, 1, 293, 1, 1, 293, 3, 5, 316, 4, 1, 316, 3, 4, 302, 3, 1, 302, 1, 7, 19, 3, 40, + /* 6 */ 85, 1, 27, 1, 1, 27, 3, 1, 27, 2, 17, 282, 1, 4, 282, 1, 5, 283, 1, 6, 283, 1, 4, 284, 1, 6, 284, 1, 4, 285, 1, 3, 285, 1, 2, 285, 1, 13, 286, 1, 3, 286, 1, 7, 287, 1, 3, 287, 1, 7, 288, 1, 6, 288, 1, 4, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 4, 290, 1, 1, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 3, 293, 1, 5, 316, 1, 2, 316, 1, 1, 316, 1, 6, 302, 1, 3, 302, 1, 7, 19, 1, 1, 19, 1, 1, 19, 3, 36, + /* 7 */ 85, 1, 27, 1, 1, 27, 3, 1, 27, 2, 17, 282, 1, 4, 282, 1, 5, 283, 1, 6, 283, 1, 4, 284, 1, 6, 284, 1, 4, 285, 1, 3, 285, 1, 2, 285, 1, 13, 286, 1, 3, 286, 1, 7, 287, 1, 3, 287, 1, 7, 288, 1, 6, 288, 1, 4, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 4, 290, 1, 1, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 3, 293, 1, 5, 316, 1, 2, 316, 1, 1, 316, 1, 6, 302, 1, 3, 302, 1, 7, 19, 1, 1, 19, 1, 1, 19, 3, 36, + /* 8 */ 79, 1, 27, 2, 1, 27, 1, 2, 27, 1, 18, 282, 4, 1, 282, 1, 5, 283, 3, 3, 283, 1, 5, 284, 3, 1, 284, 3, 5, 285, 3, 1, 285, 4, 13, 286, 3, 1, 286, 3, 5, 287, 3, 1, 287, 3, 5, 288, 3, 4, 288, 1, 4, 289, 3, 2, 289, 2, 14, 290, 4, 1, 290, 3, 4, 291, 2, 1, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 4, 1, 292, 1, 1, 292, 1, 4, 293, 2, 1, 293, 1, 3, 293, 1, 5, 316, 1, 2, 316, 1, 1, 316, 3, 4, 302, 3, 1, 302, 1, 7, 19, 1, 1, 19, 1, 4, 19, 1, 35, + /* 9 */ 79, 1, 27, 2, 1, 27, 1, 2, 27, 1, 18, 282, 4, 1, 282, 1, 5, 283, 3, 3, 283, 1, 5, 284, 3, 1, 284, 3, 5, 285, 3, 1, 285, 4, 13, 286, 3, 1, 286, 3, 5, 287, 3, 1, 287, 3, 5, 288, 3, 4, 288, 1, 4, 289, 3, 2, 289, 2, 14, 290, 4, 1, 290, 3, 4, 291, 2, 1, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 4, 1, 292, 1, 1, 292, 1, 4, 293, 2, 1, 293, 1, 3, 293, 1, 5, 316, 1, 2, 316, 1, 1, 316, 3, 4, 302, 3, 1, 302, 1, 7, 19, 1, 1, 19, 1, 4, 19, 1, 35, + /* 10 */ 79, 1, 27, 1, 2, 27, 2, 1, 27, 1, 18, 282, 1, 4, 282, 1, 5, 283, 1, 4, 283, 1, 6, 284, 1, 6, 284, 1, 4, 285, 1, 6, 285, 1, 13, 286, 1, 6, 286, 1, 4, 287, 1, 3, 287, 1, 2, 287, 1, 4, 288, 1, 5, 288, 1, 5, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 6, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 2, 293, 1, 6, 316, 4, 3, 316, 1, 6, 302, 1, 1, 302, 1, 7, 19, 3, 1, 19, 4, 35, + /* 11 */ 79, 1, 27, 1, 2, 27, 2, 1, 27, 1, 18, 282, 1, 4, 282, 1, 5, 283, 1, 4, 283, 1, 6, 284, 1, 6, 284, 1, 4, 285, 1, 6, 285, 1, 13, 286, 1, 6, 286, 1, 4, 287, 1, 3, 287, 1, 2, 287, 1, 4, 288, 1, 5, 288, 1, 5, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 6, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 2, 293, 1, 6, 316, 4, 3, 316, 1, 6, 302, 1, 1, 302, 1, 7, 19, 3, 1, 19, 4, 35, + /* 12 */ 81, 1, 27, 1, 3, 27, 1, 1, 27, 1, 18, 282, 1, 4, 282, 1, 5, 283, 1, 3, 283, 1, 7, 284, 1, 6, 284, 1, 4, 285, 1, 6, 285, 1, 13, 286, 1, 6, 286, 1, 4, 287, 1, 3, 287, 1, 2, 287, 1, 4, 288, 1, 4, 288, 1, 6, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 6, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 1, 293, 1, 7, 316, 1, 6, 316, 1, 6, 302, 1, 1, 302, 1, 7, 19, 1, 3, 19, 1, 2, 19, 1, 35, + /* 13 */ 81, 1, 27, 1, 3, 27, 1, 1, 27, 1, 18, 282, 1, 4, 282, 1, 5, 283, 1, 3, 283, 1, 7, 284, 1, 6, 284, 1, 4, 285, 1, 6, 285, 1, 13, 286, 1, 6, 286, 1, 4, 287, 1, 3, 287, 1, 2, 287, 1, 4, 288, 1, 4, 288, 1, 6, 289, 1, 3, 289, 1, 2, 289, 1, 13, 290, 1, 6, 290, 1, 4, 291, 1, 2, 291, 1, 1, 291, 1, 1, 291, 1, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 1, 293, 1, 7, 316, 1, 6, 316, 1, 6, 302, 1, 1, 302, 1, 7, 19, 1, 3, 19, 1, 2, 19, 1, 35, + /* 14 */ 73, 1, 27, 2, 1, 27, 2, 1, 27, 2, 17, 282, 1, 4, 282, 1, 5, 283, 1, 3, 283, 4, 4, 284, 1, 3, 284, 3, 5, 285, 1, 6, 285, 1, 13, 286, 1, 3, 286, 3, 5, 287, 1, 4, 287, 2, 5, 288, 1, 3, 288, 1, 7, 289, 1, 4, 289, 2, 14, 290, 1, 4, 290, 3, 4, 291, 1, 2, 291, 1, 1, 291, 3, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 1, 293, 3, 5, 316, 1, 4, 316, 3, 4, 302, 3, 1, 302, 4, 4, 19, 1, 3, 19, 4, 35, + /* 15 */ 73, 1, 27, 2, 1, 27, 2, 1, 27, 2, 17, 282, 1, 4, 282, 1, 5, 283, 1, 3, 283, 4, 4, 284, 1, 3, 284, 3, 5, 285, 1, 6, 285, 1, 13, 286, 1, 3, 286, 3, 5, 287, 1, 4, 287, 2, 5, 288, 1, 3, 288, 1, 7, 289, 1, 4, 289, 2, 14, 290, 1, 4, 290, 3, 4, 291, 1, 2, 291, 1, 1, 291, 3, 4, 292, 1, 4, 292, 1, 1, 292, 1, 4, 293, 1, 2, 293, 1, 1, 293, 3, 5, 316, 1, 4, 316, 3, 4, 302, 3, 1, 302, 4, 4, 19, 1, 3, 19, 4, 35, + /* 16 */ 1, 255, + /* 17 */ 1, 255, + /* 18 */ 1, 255, + /* 19 */ 1, 255, + /* 20 */ 1, 255, + /* 21 */ 1, 255, + /* 22 */ 1, 255, + /* 23 */ 1, 255, + /* 24 */ 1, 255, + /* 25 */ 1, 255, + /* 26 */ 1, 255, + /* 27 */ 1, 255, + /* 28 */ 1, 255, + /* 29 */ 1, 255, + /* 30 */ 49, 16, 49, 1, 10, 50, 3, 10, 51, 3, 8, 52, 1, 2, 52, 1, 8, 53, 4, 9, 54, 3, 8, 55, 4, 9, 56, 2, 9, 57, 4, 7, 48, 4, 31, 8, 3, 14, 8, 4, 10, 277, 1, 11, 278, 1, 2, 278, 1, 8, 280, 3, 1, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 7, 267, 1, 5, 268, 1, 11, + /* 31 */ 49, 16, 49, 1, 10, 50, 3, 10, 51, 3, 8, 52, 1, 2, 52, 1, 8, 53, 4, 9, 54, 3, 8, 55, 4, 9, 56, 2, 9, 57, 4, 7, 48, 4, 31, 8, 3, 14, 8, 4, 10, 277, 1, 11, 278, 1, 2, 278, 1, 8, 280, 3, 1, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 7, 267, 1, 5, 268, 1, 11, + /* 32 */ 83, 3, 96, 2, 2, 96, 1, 8, 49, 1, 13, 50, 1, 12, 51, 1, 7, 52, 1, 2, 52, 1, 8, 53, 1, 11, 54, 1, 14, 55, 1, 8, 56, 1, 2, 56, 1, 8, 57, 1, 2, 57, 1, 7, 48, 1, 2, 48, 1, 22, 61, 3, 6, 8, 1, 2, 8, 1, 1, 8, 2, 3, 8, 2, 1, 8, 1, 3, 8, 1, 4, 8, 4, 5, 277, 1, 1, 277, 2, 2, 277, 2, 4, 278, 1, 2, 278, 1, 2, 278, 1, 5, 280, 1, 1, 280, 1, 1, 280, 1, 2, 280, 1, 4, 300, 2, 1, 300, 1, 1, 300, 1, 7, 267, 1, 3, 268, 1, 1, 268, 1, 1, 268, 1, 9, + /* 33 */ 83, 3, 96, 2, 2, 96, 1, 8, 49, 1, 13, 50, 1, 12, 51, 1, 7, 52, 1, 2, 52, 1, 8, 53, 1, 11, 54, 1, 14, 55, 1, 8, 56, 1, 2, 56, 1, 8, 57, 1, 2, 57, 1, 7, 48, 1, 2, 48, 1, 22, 61, 3, 6, 8, 1, 2, 8, 1, 1, 8, 2, 3, 8, 2, 1, 8, 1, 3, 8, 1, 4, 8, 4, 5, 277, 1, 1, 277, 2, 2, 277, 2, 4, 278, 1, 2, 278, 1, 2, 278, 1, 5, 280, 1, 1, 280, 1, 1, 280, 1, 2, 280, 1, 4, 300, 2, 1, 300, 1, 1, 300, 1, 7, 267, 1, 3, 268, 1, 1, 268, 1, 1, 268, 1, 9, + /* 34 */ 77, 2, 96, 1, 2, 96, 2, 9, 49, 1, 12, 50, 1, 10, 51, 3, 8, 52, 4, 8, 53, 3, 9, 54, 3, 12, 55, 1, 9, 56, 2, 9, 57, 4, 7, 48, 1, 2, 48, 1, 9, 45, 3, 19, 8, 3, 4, 8, 1, 1, 8, 1, 3, 8, 1, 3, 8, 4, 1, 8, 1, 2, 8, 1, 5, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 1, 5, 278, 4, 1, 278, 1, 1, 278, 1, 4, 280, 1, 1, 280, 1, 1, 280, 1, 2, 280, 1, 4, 300, 1, 1, 300, 2, 1, 300, 1, 6, 267, 1, 5, 268, 3, 4, 269, 3, 3, + /* 35 */ 77, 2, 96, 1, 2, 96, 2, 9, 49, 1, 12, 50, 1, 10, 51, 3, 8, 52, 4, 8, 53, 3, 9, 54, 3, 12, 55, 1, 9, 56, 2, 9, 57, 4, 7, 48, 1, 2, 48, 1, 9, 45, 3, 19, 8, 3, 4, 8, 1, 1, 8, 1, 3, 8, 1, 3, 8, 4, 1, 8, 1, 2, 8, 1, 5, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 1, 5, 278, 4, 1, 278, 1, 1, 278, 1, 4, 280, 1, 1, 280, 1, 1, 280, 1, 2, 280, 1, 4, 300, 1, 1, 300, 2, 1, 300, 1, 6, 267, 1, 5, 268, 3, 4, 269, 3, 3, + /* 36 */ 79, 16, 49, 1, 11, 50, 1, 14, 51, 1, 10, 52, 1, 11, 53, 1, 8, 54, 1, 2, 54, 1, 10, 55, 1, 9, 56, 1, 2, 56, 1, 11, 57, 1, 7, 48, 1, 2, 48, 1, 22, 61, 3, 6, 8, 1, 2, 8, 1, 1, 8, 3, 1, 8, 1, 3, 8, 1, 1, 8, 1, 4, 8, 1, 1, 8, 4, 5, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 2, 4, 278, 1, 2, 278, 1, 1, 278, 1, 1, 278, 1, 4, 280, 3, 1, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 6, 267, 1, 5, 268, 1, 1, 268, 1, 10, + /* 37 */ 79, 16, 49, 1, 11, 50, 1, 14, 51, 1, 10, 52, 1, 11, 53, 1, 8, 54, 1, 2, 54, 1, 10, 55, 1, 9, 56, 1, 2, 56, 1, 11, 57, 1, 7, 48, 1, 2, 48, 1, 22, 61, 3, 6, 8, 1, 2, 8, 1, 1, 8, 3, 1, 8, 1, 3, 8, 1, 1, 8, 1, 4, 8, 1, 1, 8, 4, 5, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 2, 4, 278, 1, 2, 278, 1, 1, 278, 1, 1, 278, 1, 4, 280, 3, 1, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 6, 267, 1, 5, 268, 1, 1, 268, 1, 10, + /* 38 */ 77, 16, 49, 1, 10, 50, 1, 15, 51, 1, 10, 52, 1, 11, 53, 1, 8, 54, 1, 2, 54, 1, 9, 55, 1, 10, 56, 1, 2, 56, 1, 11, 57, 1, 7, 48, 1, 2, 48, 1, 31, 8, 1, 2, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 3, 8, 2, 5, 8, 1, 1, 8, 1, 8, 277, 1, 1, 277, 1, 1, 277, 1, 2, 277, 1, 4, 278, 1, 2, 278, 1, 1, 278, 1, 1, 278, 1, 4, 280, 1, 3, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 5, 267, 1, 5, 268, 1, 3, 268, 1, 9, + /* 39 */ 77, 16, 49, 1, 10, 50, 1, 15, 51, 1, 10, 52, 1, 11, 53, 1, 8, 54, 1, 2, 54, 1, 9, 55, 1, 10, 56, 1, 2, 56, 1, 11, 57, 1, 7, 48, 1, 2, 48, 1, 31, 8, 1, 2, 8, 1, 1, 8, 1, 1, 8, 1, 1, 8, 1, 3, 8, 2, 5, 8, 1, 1, 8, 1, 8, 277, 1, 1, 277, 1, 1, 277, 1, 2, 277, 1, 4, 278, 1, 2, 278, 1, 1, 278, 1, 1, 278, 1, 4, 280, 1, 3, 280, 1, 2, 280, 1, 4, 300, 1, 2, 300, 1, 1, 300, 1, 5, 267, 1, 5, 268, 1, 3, 268, 1, 9, + /* 40 */ 61, 16, 49, 1, 10, 50, 4, 9, 51, 3, 11, 52, 1, 8, 53, 3, 10, 54, 2, 9, 55, 1, 12, 56, 2, 9, 57, 4, 7, 48, 4, 31, 8, 3, 2, 8, 3, 2, 8, 2, 1, 8, 1, 1, 8, 1, 1, 8, 4, 1, 8, 1, 8, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 2, 4, 278, 1, 2, 278, 1, 2, 278, 1, 5, 280, 1, 4, 280, 2, 5, 300, 1, 2, 300, 1, 1, 300, 3, 3, 267, 1, 19, + /* 41 */ 61, 16, 49, 1, 10, 50, 4, 9, 51, 3, 11, 52, 1, 8, 53, 3, 10, 54, 2, 9, 55, 1, 12, 56, 2, 9, 57, 4, 7, 48, 4, 31, 8, 3, 2, 8, 3, 2, 8, 2, 1, 8, 1, 1, 8, 1, 1, 8, 4, 1, 8, 1, 8, 277, 1, 1, 277, 1, 1, 277, 1, 1, 277, 2, 4, 278, 1, 2, 278, 1, 2, 278, 1, 5, 280, 1, 4, 280, 2, 5, 300, 1, 2, 300, 1, 1, 300, 3, 3, 267, 1, 19, + /* 42 */ 1, 255, + /* 43 */ 1, 255, + /* 44 */ 1, 255, + /* 45 */ 1, 255, + /* 46 */ 1, 255, + /* 47 */ 1, 255, + /* 48 */ 1, 255, + /* 49 */ 1, 255, + /* 50 */ 53, 1, 9, 3, 2, 9, 2, 2, 9, 3, 8, 113, 3, 8, 119, 1, 3, 119, 1, 5, 101, 4, 10, 114, 3, 9, 116, 5, 7, 121, 1, 3, 121, 1, 7, 117, 1, 2, 117, 1, 10, 105, 1, 10, 111, 2, 9, 112, 4, 8, 91, 3, 10, 93, 3, 32, 127, 2, 5, 127, 1, 4, 279, 3, 9, 281, 3, 1, 281, 3, 7, 263, 4, 5, 264, 2, 4, 265, 4, 10, + /* 51 */ 53, 1, 9, 3, 2, 9, 2, 2, 9, 3, 8, 113, 3, 8, 119, 1, 3, 119, 1, 5, 101, 4, 10, 114, 3, 9, 116, 5, 7, 121, 1, 3, 121, 1, 7, 117, 1, 2, 117, 1, 10, 105, 1, 10, 111, 2, 9, 112, 4, 8, 91, 3, 10, 93, 3, 32, 127, 2, 5, 127, 1, 4, 279, 3, 9, 281, 3, 1, 281, 3, 7, 263, 4, 5, 264, 2, 4, 265, 4, 10, + /* 52 */ 79, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 1, 2, 9, 1, 6, 113, 1, 3, 113, 1, 7, 119, 1, 3, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 9, 121, 1, 3, 121, 1, 7, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 2, 112, 1, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 2, 1, 127, 1, 4, 279, 1, 3, 279, 3, 5, 281, 1, 1, 281, 1, 1, 281, 1, 2, 281, 1, 9, 263, 1, 4, 264, 1, 2, 264, 1, 3, 265, 1, 2, 265, 1, 10, + /* 53 */ 79, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 1, 2, 9, 1, 6, 113, 1, 3, 113, 1, 7, 119, 1, 3, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 9, 121, 1, 3, 121, 1, 7, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 2, 112, 1, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 2, 1, 127, 1, 4, 279, 1, 3, 279, 3, 5, 281, 1, 1, 281, 1, 1, 281, 1, 2, 281, 1, 9, 263, 1, 4, 264, 1, 2, 264, 1, 3, 265, 1, 2, 265, 1, 10, + /* 54 */ 73, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 3, 7, 113, 1, 3, 113, 1, 7, 119, 1, 3, 119, 1, 5, 101, 4, 10, 114, 3, 11, 116, 1, 10, 121, 1, 1, 121, 1, 8, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 2, 112, 1, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 1, 2, 127, 1, 4, 279, 3, 1, 279, 1, 2, 279, 1, 4, 281, 1, 1, 281, 1, 1, 281, 1, 2, 281, 1, 9, 263, 1, 5, 264, 2, 4, 265, 4, 10, + /* 55 */ 73, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 3, 7, 113, 1, 3, 113, 1, 7, 119, 1, 3, 119, 1, 5, 101, 4, 10, 114, 3, 11, 116, 1, 10, 121, 1, 1, 121, 1, 8, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 2, 112, 1, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 1, 2, 127, 1, 4, 279, 3, 1, 279, 1, 2, 279, 1, 4, 281, 1, 1, 281, 1, 1, 281, 1, 2, 281, 1, 9, 263, 1, 5, 264, 2, 4, 265, 4, 10, + /* 56 */ 75, 2, 9, 1, 2, 9, 4, 1, 9, 1, 2, 9, 1, 6, 113, 1, 1, 113, 1, 1, 113, 1, 7, 119, 1, 1, 119, 1, 1, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 9, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 4, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 2, 1, 127, 1, 4, 279, 1, 3, 279, 1, 2, 279, 1, 4, 281, 3, 1, 281, 1, 2, 281, 1, 8, 263, 1, 5, 264, 1, 2, 264, 1, 6, 265, 1, 10, + /* 57 */ 75, 2, 9, 1, 2, 9, 4, 1, 9, 1, 2, 9, 1, 6, 113, 1, 1, 113, 1, 1, 113, 1, 7, 119, 1, 1, 119, 1, 1, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 9, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 4, 8, 91, 1, 14, 93, 1, 32, 127, 1, 1, 127, 1, 1, 127, 2, 1, 127, 1, 4, 279, 1, 3, 279, 1, 2, 279, 1, 4, 281, 3, 1, 281, 1, 2, 281, 1, 8, 263, 1, 5, 264, 1, 2, 264, 1, 6, 265, 1, 10, + /* 58 */ 79, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 1, 2, 9, 1, 6, 113, 1, 2, 113, 1, 8, 119, 1, 1, 119, 1, 1, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 9, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 11, 91, 1, 14, 93, 1, 11, 13, 3, 7, 13, 1, 10, 127, 1, 1, 127, 1, 1, 127, 1, 2, 127, 1, 4, 279, 1, 3, 279, 1, 2, 279, 1, 4, 281, 1, 3, 281, 1, 2, 281, 1, 7, 263, 1, 6, 264, 1, 2, 264, 1, 6, 265, 1, 10, + /* 59 */ 79, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 1, 2, 9, 1, 6, 113, 1, 2, 113, 1, 8, 119, 1, 1, 119, 1, 1, 119, 1, 5, 101, 1, 13, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 9, 117, 1, 2, 117, 1, 10, 105, 1, 9, 111, 1, 2, 111, 1, 8, 112, 1, 11, 91, 1, 14, 93, 1, 11, 13, 3, 7, 13, 1, 10, 127, 1, 1, 127, 1, 1, 127, 1, 2, 127, 1, 4, 279, 1, 3, 279, 1, 2, 279, 1, 4, 281, 1, 3, 281, 1, 2, 281, 1, 7, 263, 1, 6, 264, 1, 2, 264, 1, 6, 265, 1, 10, + /* 60 */ 69, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 3, 8, 113, 2, 1, 113, 1, 8, 119, 1, 1, 119, 1, 6, 101, 4, 10, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 10, 117, 2, 11, 105, 1, 10, 111, 2, 9, 112, 1, 11, 91, 3, 10, 93, 3, 11, 13, 1, 3, 13, 3, 3, 13, 1, 3, 13, 2, 5, 127, 2, 2, 127, 2, 1, 127, 1, 4, 279, 3, 1, 279, 1, 2, 279, 1, 4, 281, 1, 3, 281, 3, 7, 263, 1, 8, 264, 2, 4, 265, 4, 10, + /* 61 */ 69, 2, 9, 1, 2, 9, 1, 2, 9, 1, 1, 9, 3, 8, 113, 2, 1, 113, 1, 8, 119, 1, 1, 119, 1, 6, 101, 4, 10, 114, 1, 2, 114, 1, 10, 116, 1, 11, 121, 1, 10, 117, 2, 11, 105, 1, 10, 111, 2, 9, 112, 1, 11, 91, 3, 10, 93, 3, 11, 13, 1, 3, 13, 3, 3, 13, 1, 3, 13, 2, 5, 127, 2, 2, 127, 2, 1, 127, 1, 4, 279, 3, 1, 279, 1, 2, 279, 1, 4, 281, 1, 3, 281, 3, 7, 263, 1, 8, 264, 2, 4, 265, 4, 10, + /* 62 */ 13, 167, 13, 3, 1, 13, 1, 2, 13, 1, 1, 13, 3, 2, 13, 1, 68, 270, 1, 4, + /* 63 */ 13, 167, 13, 3, 1, 13, 1, 2, 13, 1, 1, 13, 3, 2, 13, 1, 68, 270, 1, 4, + /* 64 */ 13, 167, 13, 1, 3, 13, 1, 2, 13, 1, 2, 13, 1, 3, 13, 1, 67, 270, 3, 3, + /* 65 */ 13, 167, 13, 1, 3, 13, 1, 2, 13, 1, 2, 13, 1, 3, 13, 1, 67, 270, 3, 3, + /* 66 */ 13, 167, 13, 1, 3, 13, 1, 2, 13, 1, 2, 13, 1, 3, 13, 1, 68, 270, 1, 4, + /* 67 */ 13, 167, 13, 1, 3, 13, 1, 2, 13, 1, 2, 13, 1, 3, 13, 1, 68, 270, 1, 4, + /* 68 */ 11, 167, 13, 3, 1, 13, 1, 2, 13, 1, 3, 13, 2, 1, 13, 1, 73, + /* 69 */ 11, 167, 13, 3, 1, 13, 1, 2, 13, 1, 3, 13, 2, 1, 13, 1, 73, + /* 70 */ 37, 2, 301, 2, 21, 97, 2, 10, 115, 4, 7, 100, 3, 10, 102, 4, 9, 103, 3, 8, 104, 1, 2, 104, 1, 8, 106, 4, 6, 107, 1, 2, 107, 1, 9, 108, 1, 25, 39, 1, 10, 92, 1, 68, 260, 1, 2, 260, 1, 5, 261, 4, 3, 262, 3, 10, + /* 71 */ 37, 2, 301, 2, 21, 97, 2, 10, 115, 4, 7, 100, 3, 10, 102, 4, 9, 103, 3, 8, 104, 1, 2, 104, 1, 8, 106, 4, 6, 107, 1, 2, 107, 1, 9, 108, 1, 25, 39, 1, 10, 92, 1, 68, 260, 1, 2, 260, 1, 5, 261, 4, 3, 262, 3, 10, + /* 72 */ 49, 1, 301, 1, 2, 301, 1, 1, 301, 3, 2, 301, 4, 1, 301, 3, 5, 97, 1, 2, 97, 1, 9, 115, 1, 10, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 11, 104, 1, 2, 104, 1, 11, 106, 1, 6, 107, 1, 1, 107, 1, 10, 108, 1, 25, 39, 1, 10, 92, 1, 68, 260, 1, 2, 260, 1, 5, 261, 1, 5, 262, 1, 13, + /* 73 */ 49, 1, 301, 1, 2, 301, 1, 1, 301, 3, 2, 301, 4, 1, 301, 3, 5, 97, 1, 2, 97, 1, 9, 115, 1, 10, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 11, 104, 1, 2, 104, 1, 11, 106, 1, 6, 107, 1, 1, 107, 1, 10, 108, 1, 25, 39, 1, 10, 92, 1, 68, 260, 1, 2, 260, 1, 5, 261, 1, 5, 262, 1, 13, + /* 74 */ 45, 1, 301, 1, 7, 301, 1, 1, 301, 1, 2, 301, 1, 1, 301, 1, 7, 97, 1, 2, 97, 1, 9, 115, 4, 7, 100, 1, 2, 100, 1, 9, 102, 4, 8, 103, 1, 1, 103, 2, 8, 104, 4, 11, 106, 1, 6, 107, 2, 11, 108, 1, 12, 59, 1, 24, 92, 1, 67, 260, 4, 5, 261, 3, 3, 262, 3, 11, + /* 75 */ 45, 1, 301, 1, 7, 301, 1, 1, 301, 1, 2, 301, 1, 1, 301, 1, 7, 97, 1, 2, 97, 1, 9, 115, 4, 7, 100, 1, 2, 100, 1, 9, 102, 4, 8, 103, 1, 1, 103, 2, 8, 104, 4, 11, 106, 1, 6, 107, 2, 11, 108, 1, 12, 59, 1, 24, 92, 1, 67, 260, 4, 5, 261, 3, 3, 262, 3, 11, + /* 76 */ 45, 1, 301, 1, 4, 301, 4, 1, 301, 4, 1, 301, 3, 5, 97, 4, 12, 115, 1, 7, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 2, 103, 1, 8, 104, 1, 2, 104, 1, 11, 106, 1, 6, 107, 1, 1, 107, 1, 10, 108, 1, 37, 92, 1, 70, 260, 1, 8, 261, 1, 2, 262, 1, 2, 262, 1, 10, + /* 77 */ 45, 1, 301, 1, 4, 301, 4, 1, 301, 4, 1, 301, 3, 5, 97, 4, 12, 115, 1, 7, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 2, 103, 1, 8, 104, 1, 2, 104, 1, 11, 106, 1, 6, 107, 1, 1, 107, 1, 10, 108, 1, 37, 92, 1, 70, 260, 1, 8, 261, 1, 2, 262, 1, 2, 262, 1, 10, + /* 78 */ 55, 1, 301, 1, 2, 301, 1, 1, 301, 1, 2, 301, 1, 1, 301, 1, 6, 301, 1, 5, 97, 1, 2, 97, 1, 12, 115, 1, 7, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 2, 103, 1, 8, 104, 1, 2, 104, 1, 8, 106, 1, 2, 106, 1, 6, 107, 1, 2, 107, 1, 9, 108, 1, 12, 59, 1, 25, 92, 1, 69, 260, 1, 8, 261, 1, 2, 262, 1, 2, 262, 1, 10, + /* 79 */ 55, 1, 301, 1, 2, 301, 1, 1, 301, 1, 2, 301, 1, 1, 301, 1, 6, 301, 1, 5, 97, 1, 2, 97, 1, 12, 115, 1, 7, 100, 1, 2, 100, 1, 9, 102, 1, 11, 103, 1, 2, 103, 1, 8, 104, 1, 2, 104, 1, 8, 106, 1, 2, 106, 1, 6, 107, 1, 2, 107, 1, 9, 108, 1, 12, 59, 1, 25, 92, 1, 69, 260, 1, 8, 261, 1, 2, 262, 1, 2, 262, 1, 10, + /* 80 */ 43, 2, 301, 2, 2, 301, 4, 1, 301, 1, 4, 301, 3, 5, 97, 1, 2, 97, 1, 9, 115, 4, 7, 100, 3, 10, 102, 1, 12, 103, 2, 9, 104, 1, 2, 104, 1, 9, 106, 2, 7, 107, 1, 2, 107, 1, 9, 108, 4, 9, 59, 1, 25, 92, 1, 69, 260, 1, 5, 261, 3, 4, 262, 2, 11, + /* 81 */ 43, 2, 301, 2, 2, 301, 4, 1, 301, 1, 4, 301, 3, 5, 97, 1, 2, 97, 1, 9, 115, 4, 7, 100, 3, 10, 102, 1, 12, 103, 2, 9, 104, 1, 2, 104, 1, 9, 106, 2, 7, 107, 1, 2, 107, 1, 9, 108, 4, 9, 59, 1, 25, 92, 1, 69, 260, 1, 5, 261, 3, 4, 262, 2, 11, + /* 82 */ 1, 255, + /* 83 */ 1, 255, + /* 84 */ 1, 255, + /* 85 */ 1, 255, + /* 86 */ 1, 255, + /* 87 */ 1, 255, + /* 88 */ 1, 255, + /* 89 */ 1, 255, + /* 90 */ 53, 1, 304, 3, 8, 304, 1, 1, 304, 1, 8, 323, 1, 10, 122, 4, 7, 120, 1, 3, 120, 1, 9, 99, 2, 8, 118, 1, 3, 118, 1, 8, 98, 3, 9, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 34, 47, 1, 11, 303, 4, 1, 303, 1, 4, 303, 1, 2, 303, 3, 1, 303, 1, 28, 273, 2, 22, 257, 1, 6, 258, 3, 4, 259, 3, 4, 271, 6, 1, + /* 91 */ 53, 1, 304, 3, 8, 304, 1, 1, 304, 1, 8, 323, 1, 10, 122, 4, 7, 120, 1, 3, 120, 1, 9, 99, 2, 8, 118, 1, 3, 118, 1, 8, 98, 3, 9, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 34, 47, 1, 11, 303, 4, 1, 303, 1, 4, 303, 1, 2, 303, 3, 1, 303, 1, 28, 273, 2, 22, 257, 1, 6, 258, 3, 4, 259, 3, 4, 271, 6, 1, + /* 92 */ 63, 1, 304, 1, 3, 304, 1, 3, 304, 1, 1, 304, 1, 2, 304, 1, 7, 323, 1, 14, 122, 1, 7, 120, 1, 3, 120, 1, 8, 99, 1, 2, 99, 1, 7, 118, 1, 3, 118, 1, 8, 98, 1, 2, 98, 1, 8, 110, 2, 1, 110, 1, 8, 109, 2, 1, 109, 2, 34, 47, 1, 11, 303, 1, 4, 303, 1, 6, 303, 1, 4, 303, 1, 27, 273, 4, 21, 257, 1, 9, 258, 1, 6, 259, 1, 3, 271, 1, 2, 271, 1, 1, 271, 1, 1, + /* 93 */ 63, 1, 304, 1, 3, 304, 1, 3, 304, 1, 1, 304, 1, 2, 304, 1, 7, 323, 1, 14, 122, 1, 7, 120, 1, 3, 120, 1, 8, 99, 1, 2, 99, 1, 7, 118, 1, 3, 118, 1, 8, 98, 1, 2, 98, 1, 8, 110, 2, 1, 110, 1, 8, 109, 2, 1, 109, 2, 34, 47, 1, 11, 303, 1, 4, 303, 1, 6, 303, 1, 4, 303, 1, 27, 273, 4, 21, 257, 1, 9, 258, 1, 6, 259, 1, 3, 271, 1, 2, 271, 1, 1, 271, 1, 1, + /* 94 */ 61, 1, 304, 3, 1, 304, 1, 5, 304, 2, 1, 304, 2, 5, 323, 1, 14, 122, 1, 9, 120, 1, 1, 120, 1, 9, 99, 1, 10, 118, 1, 3, 118, 1, 8, 98, 3, 9, 110, 1, 1, 110, 2, 8, 109, 1, 1, 109, 1, 1, 109, 1, 33, 47, 1, 12, 303, 4, 1, 303, 4, 1, 303, 1, 1, 303, 3, 1, 303, 3, 25, 273, 6, 20, 257, 1, 8, 258, 1, 4, 259, 3, 4, 271, 1, 2, 271, 1, 1, 271, 1, 1, + /* 95 */ 61, 1, 304, 3, 1, 304, 1, 5, 304, 2, 1, 304, 2, 5, 323, 1, 14, 122, 1, 9, 120, 1, 1, 120, 1, 9, 99, 1, 10, 118, 1, 3, 118, 1, 8, 98, 3, 9, 110, 1, 1, 110, 2, 8, 109, 1, 1, 109, 1, 1, 109, 1, 33, 47, 1, 12, 303, 4, 1, 303, 4, 1, 303, 1, 1, 303, 3, 1, 303, 3, 25, 273, 6, 20, 257, 1, 8, 258, 1, 4, 259, 3, 4, 271, 1, 2, 271, 1, 1, 271, 1, 1, + /* 96 */ 57, 3, 304, 1, 1, 304, 3, 1, 304, 1, 1, 304, 1, 2, 304, 1, 7, 323, 1, 12, 122, 1, 11, 120, 1, 10, 99, 1, 10, 118, 1, 3, 118, 1, 8, 98, 1, 2, 98, 1, 8, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 33, 47, 1, 15, 303, 1, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 4, 303, 1, 28, 273, 2, 22, 257, 1, 7, 258, 1, 8, 259, 1, 10, + /* 97 */ 57, 3, 304, 1, 1, 304, 3, 1, 304, 1, 1, 304, 1, 2, 304, 1, 7, 323, 1, 12, 122, 1, 11, 120, 1, 10, 99, 1, 10, 118, 1, 3, 118, 1, 8, 98, 1, 2, 98, 1, 8, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 33, 47, 1, 15, 303, 1, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 4, 303, 1, 28, 273, 2, 22, 257, 1, 7, 258, 1, 8, 259, 1, 10, + /* 98 */ 69, 3, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 2, 304, 1, 8, 323, 1, 10, 122, 1, 11, 120, 1, 1, 120, 1, 9, 99, 1, 2, 99, 1, 8, 118, 1, 1, 118, 1, 9, 98, 1, 2, 98, 1, 8, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 8, 44, 1, 11, 46, 1, 11, 47, 1, 16, 303, 1, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 4, 303, 1, 28, 273, 2, 22, 257, 1, 6, 258, 1, 9, 259, 1, 3, 271, 5, 2, + /* 99 */ 69, 3, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 2, 304, 1, 8, 323, 1, 10, 122, 1, 11, 120, 1, 1, 120, 1, 9, 99, 1, 2, 99, 1, 8, 118, 1, 1, 118, 1, 9, 98, 1, 2, 98, 1, 8, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 8, 44, 1, 11, 46, 1, 11, 47, 1, 16, 303, 1, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 4, 303, 1, 28, 273, 2, 22, 257, 1, 6, 258, 1, 9, 259, 1, 3, 271, 5, 2, + /* 100 */ 59, 1, 304, 3, 1, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 3, 304, 1, 18, 122, 4, 7, 120, 1, 3, 120, 1, 9, 99, 2, 10, 118, 1, 10, 98, 3, 9, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 8, 44, 1, 23, 47, 1, 13, 303, 4, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 5, 303, 2, 26, 273, 2, 22, 257, 1, 6, 258, 4, 3, 259, 3, 8, 271, 1, 2, + /* 101 */ 59, 1, 304, 3, 1, 304, 1, 1, 304, 1, 1, 304, 1, 1, 304, 1, 3, 304, 1, 18, 122, 4, 7, 120, 1, 3, 120, 1, 9, 99, 2, 10, 118, 1, 10, 98, 3, 9, 110, 1, 2, 110, 1, 8, 109, 1, 3, 109, 1, 8, 44, 1, 23, 47, 1, 13, 303, 4, 1, 303, 1, 2, 303, 1, 1, 303, 1, 1, 303, 1, 5, 303, 2, 26, 273, 2, 22, 257, 1, 6, 258, 4, 3, 259, 3, 8, 271, 1, 2, + /* 102 */ 3, 252, 271, 1, 2, + /* 103 */ 3, 252, 271, 1, 2, + /* 104 */ 3, 248, 271, 4, 3, + /* 105 */ 3, 248, 271, 4, 3, + /* 106 */ 1, 255, + /* 107 */ 1, 255, + /* 108 */ 3, 251, 271, 1, 3, + /* 109 */ 3, 251, 271, 1, 3, + /* 110 */ 37, 2, 306, 2, 2, 306, 1, 7, 306, 1, 19, 308, 2, 2, 308, 1, 2, 308, 1, 8, 32, 85, 7, 307, 2, 2, 307, 1, 2, 307, 1, 20, 305, 2, 2, 305, 1, 7, 305, 1, 8, 276, 1, 11, 274, 2, 11, 275, 1, 13, 256, 4, 15, 271, 5, 1, + /* 111 */ 39, 2, 306, 2, 2, 306, 1, 7, 306, 1, 19, 308, 2, 2, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 7, 307, 2, 2, 307, 1, 2, 307, 1, 20, 305, 2, 2, 305, 1, 7, 305, 1, 8, 276, 1, 11, 274, 2, 11, 275, 1, 13, 256, 4, 15, 271, 5, 1, + /* 112 */ 51, 1, 306, 1, 4, 306, 1, 4, 306, 2, 1, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 4, 305, 2, 1, 305, 1, 7, 276, 2, 11, 274, 2, 11, 275, 2, 12, 256, 1, 2, 256, 1, 14, 271, 1, 2, 271, 1, 3, + /* 113 */ 51, 1, 306, 1, 4, 306, 1, 4, 306, 2, 1, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 4, 305, 2, 1, 305, 1, 7, 276, 2, 11, 274, 2, 11, 275, 2, 12, 256, 1, 2, 256, 1, 14, 271, 1, 2, 271, 1, 3, + /* 114 */ 49, 1, 306, 1, 3, 306, 3, 2, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 1, 308, 3, 7, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 1, 307, 3, 18, 305, 1, 3, 305, 3, 2, 305, 1, 3, 305, 1, 6, 276, 6, 8, 274, 2, 8, 275, 6, 11, 256, 1, 2, 256, 1, 14, 271, 1, 6, + /* 115 */ 49, 1, 306, 1, 3, 306, 3, 2, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 1, 308, 3, 7, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 1, 307, 3, 18, 305, 1, 3, 305, 3, 2, 305, 1, 3, 305, 1, 6, 276, 6, 8, 274, 2, 8, 275, 6, 11, 256, 1, 2, 256, 1, 14, 271, 1, 6, + /* 116 */ 43, 1, 306, 1, 4, 306, 1, 3, 306, 1, 3, 306, 1, 18, 308, 4, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 4, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 3, 305, 1, 3, 305, 1, 6, 276, 6, 6, 274, 6, 6, 275, 6, 11, 256, 1, 2, 256, 1, 21, + /* 117 */ 43, 1, 306, 1, 4, 306, 1, 3, 306, 1, 3, 306, 1, 18, 308, 4, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 4, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 3, 305, 1, 3, 305, 1, 6, 276, 6, 6, 274, 6, 6, 275, 6, 11, 256, 1, 2, 256, 1, 21, + /* 118 */ 49, 1, 306, 1, 4, 306, 1, 3, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 3, 305, 1, 3, 305, 1, 7, 276, 2, 10, 274, 4, 10, 275, 2, 12, 256, 1, 2, 256, 1, 14, 271, 5, 2, + /* 119 */ 49, 1, 306, 1, 4, 306, 1, 3, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 2, 308, 1, 8, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 2, 307, 1, 19, 305, 1, 4, 305, 1, 3, 305, 1, 3, 305, 1, 7, 276, 2, 10, 274, 4, 10, 275, 2, 12, 256, 1, 2, 256, 1, 14, 271, 5, 2, + /* 120 */ 49, 2, 306, 2, 3, 306, 2, 1, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 3, 308, 2, 6, 32, 2, 81, 32, 2, 6, 307, 1, 2, 307, 1, 1, 307, 1, 3, 307, 2, 18, 305, 2, 3, 305, 2, 1, 305, 1, 3, 305, 1, 8, 276, 1, 11, 274, 2, 11, 275, 1, 13, 256, 4, 8, 266, 1, 9, 271, 1, 2, + /* 121 */ 47, 2, 306, 2, 3, 306, 2, 1, 306, 1, 3, 306, 1, 18, 308, 1, 2, 308, 1, 1, 308, 1, 3, 308, 2, 6, 32, 85, 6, 307, 1, 2, 307, 1, 1, 307, 1, 3, 307, 2, 18, 305, 2, 3, 305, 2, 1, 305, 1, 3, 305, 1, 8, 276, 1, 11, 274, 2, 11, 275, 1, 13, 256, 4, 8, 266, 1, 9, 271, 1, 2, + /* 122 */ 1, 255, + /* 123 */ 1, 255, + /* 124 */ 1, 255, + /* 125 */ 1, 255, + /* 126 */ 1, 255, + /* 127 */ 1, 255, + /* 128 */ 1, 255, + /* 129 */ 1, 255, + /* 130 */ 41, 1, 12, 10, 2, 33, 10, 2, 34, 10, 2, 35, 10, 2, 36, 10, 2, 38, 10, 2, 40, 10, 2, 41, 10, 2, 42, 10, 2, 43, 10, 2, 58, 10, 2, 60, 10, 2, 62, 10, 2, 63, 10, 2, 64, 10, 2, 94, 10, 2, 95, 10, 2, 123, 10, 2, 124, 10, 2, 125, 10, 16, + /* 131 */ 41, 1, 12, 10, 2, 33, 10, 2, 34, 10, 2, 35, 10, 2, 36, 10, 2, 38, 10, 2, 40, 10, 2, 41, 10, 2, 42, 10, 2, 43, 10, 2, 58, 10, 2, 60, 10, 2, 62, 10, 2, 63, 10, 2, 64, 10, 2, 94, 10, 2, 95, 10, 2, 123, 10, 2, 124, 10, 2, 125, 10, 16, + /* 132 */ 1, 255, + /* 133 */ 1, 255, + /* 134 */ 41, 1, 126, 10, 2, 272, 10, 2, 294, 10, 2, 295, 10, 2, 296, 10, 2, 309, 10, 2, 310, 10, 2, 311, 10, 2, 312, 10, 2, 313, 10, 2, 315, 10, 2, 316, 10, 2, 317, 10, 2, 318, 10, 2, 319, 10, 2, 320, 10, 2, 321, 10, 2, 322, 10, 2, 314, 10, 2, 0, 10, 16, + /* 135 */ 41, 1, 126, 10, 2, 272, 10, 2, 294, 10, 2, 295, 10, 2, 296, 10, 2, 309, 10, 2, 310, 10, 2, 311, 10, 2, 312, 10, 2, 313, 10, 2, 315, 10, 2, 316, 10, 2, 317, 10, 2, 318, 10, 2, 319, 10, 2, 320, 10, 2, 321, 10, 2, 322, 10, 2, 314, 10, 2, 0, 10, 16, + /* 136 */ 1, 255, + /* 137 */ 1, 255, + /* 138 */ 1, 255, + /* 139 */ 1, 255, + /* 140 */ 1, 255, + /* 141 */ 1, 255, +}; #endif /* REMOTEPAD_H */ diff --git a/input/input_driver.c b/input/input_driver.c index dc524d3037e..e0de49ea5f8 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -1336,12 +1336,16 @@ static void input_remote_parse_packet( switch (msg->device) { case RETRO_DEVICE_JOYPAD: - input_state->buttons[user] &= ~(1 << msg->id); - if (msg->state) - input_state->buttons[user] |= 1 << msg->id; + if (msg->id < 16) + { + input_state->buttons[user] &= ~(1 << msg->id); + if (msg->state) + input_state->buttons[user] |= 1 << msg->id; + } break; case RETRO_DEVICE_ANALOG: - input_state->analog[msg->index * 2 + msg->id][user] = msg->state; + if (msg->id<2 && msg->index<2) + input_state->analog[msg->index * 2 + msg->id][user] = msg->state; break; } } @@ -1606,7 +1610,7 @@ static int16_t input_state_device( if (id == RETRO_DEVICE_ID_ANALOG_Y) base += 1; #ifdef HAVE_NETWORKGAMEPAD - if ( input_st->remote + if ( input_st->remote && idx < RETRO_DEVICE_INDEX_ANALOG_BUTTON && input_state && input_state->analog[base][port]) res = input_state->analog[base][port]; else