+static void me_loop(menu_entry *menu, int *menu_sel)\r
+{\r
+ int ret, inp, sel = *menu_sel, menu_sel_max;\r
+\r
+ menu_sel_max = me_count(menu) - 1;\r
+ if (menu_sel_max < 1) {\r
+ lprintf("no enabled menu entries\n");\r
+ return;\r
+ }\r
+\r
+ while (!menu[sel].enabled && sel < menu_sel_max)\r
+ sel++;\r
+\r
+ /* make sure action buttons are not pressed on entering menu */\r
+ me_draw2(menu, sel);\r
+ while (in_menu_wait_any(50) & (PBTN_MOK|PBTN_MBACK|PBTN_MENU));\r
+\r
+ for (;;)\r
+ {\r
+ me_draw2(menu, sel);\r
+ inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_MOK|PBTN_MBACK|PBTN_MENU|PBTN_L|PBTN_R);\r
+ if (inp & PBTN_UP ) {\r
+ do {\r
+ sel--;\r
+ if (sel < 0)\r
+ sel = menu_sel_max;\r
+ }\r
+ while (!menu[sel].enabled);\r
+ }\r
+ if (inp & PBTN_DOWN) {\r
+ do {\r
+ sel++;\r
+ if (sel > menu_sel_max)\r
+ sel = 0;\r
+ }\r
+ while (!menu[sel].enabled);\r
+ }\r
+// if ((inp & (PBTN_L|PBTN_R)) == (PBTN_L|PBTN_R)) debug_menu_loop(); // TODO\r
+ if (inp & (PBTN_MENU|PBTN_MBACK))\r
+ break;\r
+\r
+ if (inp & PBTN_MOK)\r
+ {\r
+ if (menu[sel].submenu_handler != NULL) {\r
+ ret = menu[sel].submenu_handler(menu[sel].id);\r
+ if (ret) break;\r
+ }\r
+ }\r
+// menuErrorMsg[0] = 0; // TODO: clear error msg\r
+ }\r
+ *menu_sel = sel;\r
+}\r
+\r
+/* ***************************************** */\r
+\r
+/* TODO s */\r
+int menu_loop_tray(void) { return 0; }\r
+void menu_romload_prepare(const char *rom_name) {}\r
+void menu_romload_end(void) {}\r
+me_bind_action emuctrl_actions[1];\r
+menu_entry opt_entries[1];\r
+menu_entry opt2_entries[1];\r
+menu_entry cdopt_entries[1];\r
+menu_entry ctrlopt_entries[1];\r
+const int opt_entry_count = 0;\r
+const int opt2_entry_count = 0;\r
+const int cdopt_entry_count = 0;\r
+const int ctrlopt_entry_count = 0;\r
+\r
+extern int engineState;\r
+\r
+int savestate_menu_loop(int a) { return 1; }\r
+int menu_loop_options() { return 1; }\r
+void kc_sel_loop() {}\r
+void draw_menu_credits() {}\r
+void patches_menu_loop() {}\r
+\r
+// ------------ main menu ------------\r
+\r
+static int main_menu_handler(menu_id id)\r
+{\r
+ int ret;\r
+\r
+ switch (id)\r
+ {\r
+ case MA_MAIN_RESUME_GAME:\r
+ if (rom_loaded) {\r
+ while (in_menu_wait_any(50) & PBTN_MOK);\r
+ engineState = PGS_Running;\r
+ return 1;\r
+ }\r
+ break;\r
+ case MA_MAIN_SAVE_STATE:\r
+ if (rom_loaded) {\r
+ if (savestate_menu_loop(0))\r
+ break;\r
+ engineState = PGS_Running;\r
+ return 1;\r
+ }\r
+ break;\r
+ case MA_MAIN_LOAD_STATE:\r
+ if (rom_loaded) {\r
+ if (savestate_menu_loop(1))\r
+ break;\r
+ while (in_menu_wait_any(50) & PBTN_MOK);\r
+ engineState = PGS_Running;\r
+ return 1;\r
+ }\r
+ break;\r
+ case MA_MAIN_RESET_GAME:\r
+ if (rom_loaded) {\r
+ emu_ResetGame();\r
+ while (in_menu_wait_any(50) & PBTN_MOK);\r
+ engineState = PGS_Running;\r
+ return 1;\r
+ }\r
+ break;\r
+ case MA_MAIN_LOAD_ROM:\r
+ {\r
+/* char curr_path[PATH_MAX], *selfname;\r
+ FILE *tstf;\r
+ if ( (tstf = fopen(loadedRomFName, "rb")) )\r
+ {\r
+ fclose(tstf);\r
+ strcpy(curr_path, loadedRomFName);\r
+ }\r
+ else\r
+ getcwd(curr_path, PATH_MAX);\r
+ selfname = romsel_loop(curr_path);\r
+ if (selfname) {\r
+ printf("selected file: %s\n", selfname);\r
+ engineState = PGS_ReloadRom;\r
+ return;\r
+ }*/\r
+ break;\r
+ }\r
+ case MA_MAIN_OPTIONS:\r
+ ret = menu_loop_options();\r
+ if (ret == 1) break; // status update\r
+ if (engineState == PGS_ReloadRom)\r
+ return 1; // BIOS test\r
+ break;\r
+ case MA_MAIN_CONTROLS:\r
+ kc_sel_loop();\r
+ break;\r
+ case MA_MAIN_CREDITS:\r
+ draw_menu_credits();\r
+ usleep(500*1000); /* FIXME */\r
+ in_menu_wait(PBTN_MOK|PBTN_MBACK);\r
+ break;\r
+ case MA_MAIN_EXIT:\r
+ engineState = PGS_Quit;\r
+ return 1;\r
+ case MA_MAIN_PATCHES:\r
+ if (rom_loaded && PicoPatches) {\r
+ patches_menu_loop();\r
+ PicoPatchApply();\r
+ strcpy(menuErrorMsg, "Patches applied");\r
+ }\r
+ break;\r
+ default:\r
+ lprintf("%s: something unknown selected\n", __FUNCTION__);\r
+ break;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+menu_entry e_main_menu[] =\r
+{\r
+ mee_submenu_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),\r
+ mee_submenu_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),\r
+ mee_submenu_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),\r
+ mee_submenu_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),\r
+ mee_submenu_id("Load new ROM/ISO", MA_MAIN_LOAD_ROM, main_menu_handler),\r
+ mee_submenu_id("Change options", MA_MAIN_OPTIONS, main_menu_handler),\r
+ mee_submenu_id("Credits", MA_MAIN_CREDITS, main_menu_handler),\r
+ mee_submenu_id("Patches / GameGenie",MA_MAIN_PATCHES, main_menu_handler),\r
+ mee_submenu_id("Exit", MA_MAIN_EXIT, main_menu_handler),\r
+ mee_end,\r
+};\r
+\r
+void menu_loop(void)\r
+{\r
+ static int sel = 0;\r
+\r
+ me_enable(e_main_menu, MA_MAIN_RESUME_GAME, rom_loaded);\r
+ me_enable(e_main_menu, MA_MAIN_SAVE_STATE, rom_loaded);\r
+ me_enable(e_main_menu, MA_MAIN_LOAD_STATE, rom_loaded);\r
+ me_enable(e_main_menu, MA_MAIN_RESET_GAME, rom_loaded);\r
+ me_enable(e_main_menu, MA_MAIN_PATCHES, PicoPatches != NULL);\r
+\r
+ plat_video_menu_enter(rom_loaded);\r
+ in_set_blocking(1);\r
+ me_loop(e_main_menu, &sel);\r
+ in_set_blocking(0);\r
+\r
+ if (rom_loaded) {\r
+ while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MBACK)); // wait until select is released\r
+ engineState = PGS_Running;\r
+ }\r
+\r
+}\r
+\r