+ if (acts & 0x4000) {\r
+ turbo_cnt[2] += inc;\r
+ if (turbo_cnt[2] >= 60)\r
+ turbo_pad ^= 0x40, turbo_cnt[2] = 0;\r
+ }\r
+ *pad |= turbo_pad & (acts >> 8);\r
+}\r
+\r
+static void run_events_ui(unsigned int which)\r
+{\r
+ if (which & (PEV_STATE_LOAD|PEV_STATE_SAVE))\r
+ {\r
+ int do_it = 1;\r
+ if ( emu_check_save_file(state_slot) &&\r
+ (((which & PEV_STATE_LOAD) && (currentConfig.EmuOpt & EOPT_CONFIRM_LOAD)) ||\r
+ ((which & PEV_STATE_SAVE) && (currentConfig.EmuOpt & EOPT_CONFIRM_SAVE))) )\r
+ {\r
+ const char *nm;\r
+ char tmp[64];\r
+ int keys, len;\r
+\r
+ strcpy(tmp, (which & PEV_STATE_LOAD) ? "LOAD STATE?" : "OVERWRITE SAVE?");\r
+ len = strlen(tmp);\r
+ nm = in_get_key_name(-1, -PBTN_MA3);\r
+ snprintf(tmp + len, sizeof(tmp) - len, "(%s=yes, ", nm);\r
+ len = strlen(tmp);\r
+ nm = in_get_key_name(-1, -PBTN_MBACK);\r
+ snprintf(tmp + len, sizeof(tmp) - len, "%s=no)", nm);\r
+\r
+ plat_status_msg_busy_first(tmp);\r
+\r
+ in_set_blocking(1);\r
+ while (in_menu_wait_any(50) & (PBTN_MA3|PBTN_MBACK))\r
+ ;\r
+ while ( !((keys = in_menu_wait_any(50)) & (PBTN_MA3|PBTN_MBACK)) )\r
+ ;\r
+ if (keys & PBTN_MBACK)\r
+ do_it = 0;\r
+ while (in_menu_wait_any(50) & (PBTN_MA3|PBTN_MBACK))\r
+ ;\r
+ in_set_blocking(0);\r
+ }\r
+ if (do_it) {\r
+ plat_status_msg_busy_first((which & PEV_STATE_LOAD) ? "LOADING GAME" : "SAVING GAME");\r
+ PicoStateProgressCB = plat_status_msg_busy_next;\r
+ emu_save_load_game((which & PEV_STATE_LOAD) ? 1 : 0, 0);\r
+ PicoStateProgressCB = NULL;\r
+ }\r
+ }\r
+ if (which & PEV_SWITCH_RND)\r
+ {\r
+ plat_video_toggle_renderer();\r
+ }\r
+ if (which & (PEV_SSLOT_PREV|PEV_SSLOT_NEXT))\r
+ {\r
+ if (which & PEV_SSLOT_PREV) {\r
+ state_slot -= 1;\r
+ if (state_slot < 0)\r
+ state_slot = 9;\r
+ } else {\r
+ state_slot += 1;\r
+ if (state_slot > 9)\r
+ state_slot = 0;\r
+ }\r
+\r
+ plat_status_msg("SAVE SLOT %i [%s]", state_slot,\r
+ emu_check_save_file(state_slot) ? "USED" : "FREE");\r
+ }\r
+ if (which & PEV_MENU)\r
+ engineState = PGS_Menu;\r
+}\r
+\r
+void emu_update_input(void)\r
+{\r
+ unsigned int allActions[2] = { 0, 0 }, events;\r
+ static unsigned int prevEvents = 0;\r
+\r
+ /* FIXME: player2 */\r
+ allActions[0] = in_update();\r
+\r
+ PicoPad[0] = allActions[0] & 0xfff;\r
+ PicoPad[1] = allActions[1] & 0xfff;\r
+\r
+ if (allActions[0] & 0x7000) do_turbo(&PicoPad[0], allActions[0]);\r
+ if (allActions[1] & 0x7000) do_turbo(&PicoPad[1], allActions[1]);\r
+\r
+ events = (allActions[0] | allActions[1]) & PEV_MASK;\r
+\r
+ // volume is treated in special way and triggered every frame\r
+ if (events & (PEV_VOL_DOWN|PEV_VOL_UP))\r
+ plat_update_volume(1, events & PEV_VOL_UP);\r
+\r
+ if ((events ^ prevEvents) & PEV_FF) {\r
+ emu_set_fastforward(events & PEV_FF);\r
+ plat_update_volume(0, 0);\r
+ reset_timing = 1;\r
+ }\r
+\r
+ events &= ~prevEvents;\r
+\r
+ if (PicoAHW == PAHW_PICO)\r
+ run_events_pico(events);\r
+ if (events)\r
+ run_events_ui(events);\r
+ if (movie_data)\r
+ update_movie();\r
+\r
+ prevEvents = (allActions[0] | allActions[1]) & PEV_MASK;\r