-static void draw_frame_debug(void)\r
-{\r
- char layer_str[48] = "layers: ";\r
- if (PicoDrawMask & PDRAW_LAYERB_ON) memcpy(layer_str + 8, "B", 1);\r
- if (PicoDrawMask & PDRAW_LAYERA_ON) memcpy(layer_str + 10, "A", 1);\r
- if (PicoDrawMask & PDRAW_SPRITES_LOW_ON) memcpy(layer_str + 12, "spr_lo", 6);\r
- if (PicoDrawMask & PDRAW_SPRITES_HI_ON) memcpy(layer_str + 19, "spr_hi", 6);\r
-\r
- memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
- emu_forcedFrame(0);\r
- smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__, 0xffff);\r
- smalltext_out16(4, g_screen_height - me_sfont_h, layer_str, 0xffff);\r
-}\r
-\r
-static void debug_menu_loop(void)\r
-{\r
- int inp, mode = 0;\r
- int spr_offs = 0, dumped = 0;\r
- char *tmp;\r
-\r
- while (1)\r
- {\r
- switch (mode)\r
- {\r
- case 0: plat_video_menu_begin();\r
- tmp = PDebugMain();\r
- emu_platformDebugCat(tmp);\r
- draw_text_debug(tmp, 0, 0);\r
- if (dumped) {\r
- smalltext_out16(g_screen_width - 6 * me_sfont_h,\r
- g_screen_height - me_mfont_h, "dumped", 0xffff);\r
- dumped = 0;\r
- }\r
- break;\r
- case 1: draw_frame_debug(); break;\r
- case 2: memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
- emu_forcedFrame(0);\r
- menu_darken_bg(g_screen_ptr, g_screen_width * g_screen_height, 0);\r
- PDebugShowSpriteStats((unsigned short *)g_screen_ptr + (g_screen_height/2 - 240/2)*g_screen_width +\r
- g_screen_width/2 - 320/2, g_screen_width); break;\r
- case 3: memset(g_screen_ptr, 0, g_screen_width * g_screen_height * 2);\r
- PDebugShowPalette(g_screen_ptr, g_screen_width);\r
- PDebugShowSprite((unsigned short *)g_screen_ptr + g_screen_width*120 + g_screen_width/2 + 16,\r
- g_screen_width, spr_offs);\r
- draw_text_debug(PDebugSpriteList(), spr_offs, 6);\r
- break;\r
- }\r
- plat_video_menu_end();\r
-\r
- inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |\r
- PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);\r
- if (inp & PBTN_MBACK) return;\r
- if (inp & PBTN_L) { mode--; if (mode < 0) mode = 3; }\r
- if (inp & PBTN_R) { mode++; if (mode > 3) mode = 0; }\r
- switch (mode)\r
- {\r
- case 0:\r
- if (inp & PBTN_MOK)\r
- SekStepM68k();\r
- if (inp & PBTN_MA3) {\r
- while (inp & PBTN_MA3)\r
- inp = in_menu_wait_any(-1);\r
- mplayer_loop();\r
- }\r
- if ((inp & (PBTN_MA2|PBTN_LEFT)) == (PBTN_MA2|PBTN_LEFT)) {\r
- mkdir("dumps", 0777);\r
- PDebugDumpMem();\r
- while (inp & PBTN_MA2) inp = in_menu_wait_any(-1);\r
- dumped = 1;\r
- }\r
- break;\r
- case 1:\r
- if (inp & PBTN_LEFT) PicoDrawMask ^= PDRAW_LAYERB_ON;\r
- if (inp & PBTN_RIGHT) PicoDrawMask ^= PDRAW_LAYERA_ON;\r
- if (inp & PBTN_DOWN) PicoDrawMask ^= PDRAW_SPRITES_LOW_ON;\r
- if (inp & PBTN_UP) PicoDrawMask ^= PDRAW_SPRITES_HI_ON;\r
- if (inp & PBTN_MOK) {\r
- PsndOut = NULL; // just in case\r
- PicoSkipFrame = 1;\r
- PicoFrame();\r
- PicoSkipFrame = 0;\r
- while (inp & PBTN_MOK) inp = in_menu_wait_any(-1);\r
- }\r
- break;\r
- case 3:\r
- if (inp & PBTN_DOWN) spr_offs++;\r
- if (inp & PBTN_UP) spr_offs--;\r
- if (spr_offs < 0) spr_offs = 0;\r
- break;\r
- }\r
- }\r
-}\r
-\r
-// ------------ main menu ------------\r
-\r
-static char *romsel_run(void)\r
-{\r
- char *ret, *sel_name;\r
-\r
- sel_name = malloc(sizeof(rom_fname_loaded));\r
- if (sel_name == NULL)\r
- return NULL;\r
- strcpy(sel_name, rom_fname_loaded);\r
-\r
- ret = menu_loop_romsel(sel_name, sizeof(rom_fname_loaded));\r
- free(sel_name);\r
- return ret;\r
-}\r
-\r
-static int main_menu_handler(menu_id id, int keys)\r
-{\r
- char *ret_name;\r
-\r
- switch (id)\r
- {\r
- case MA_MAIN_RESUME_GAME:\r
- if (rom_loaded)\r
- return 1;\r
- break;\r
- case MA_MAIN_SAVE_STATE:\r
- if (rom_loaded)\r
- return menu_loop_savestate(0);\r
- break;\r
- case MA_MAIN_LOAD_STATE:\r
- if (rom_loaded)\r
- return menu_loop_savestate(1);\r
- break;\r
- case MA_MAIN_RESET_GAME:\r
- if (rom_loaded) {\r
- emu_ResetGame();\r
- return 1;\r
- }\r
- break;\r
- case MA_MAIN_LOAD_ROM:\r
- ret_name = romsel_run();\r
- if (ret_name != NULL) {\r
- lprintf("selected file: %s\n", ret_name);\r
- engineState = PGS_ReloadRom;\r
- return 1;\r
- }\r
- break;\r
- case MA_MAIN_CREDITS:\r
- draw_menu_credits();\r
- in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);\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
- menu_loop_patches();\r
- PicoPatchApply();\r
- me_update_msg("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
-static menu_entry e_menu_main[] =\r
-{\r
- mee_label ("PicoDrive " VERSION),\r
- mee_label (""),\r
- mee_label (""),\r
- mee_label (""),\r
- mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),\r
- mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),\r
- mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),\r
- mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),\r
- mee_handler_id("Load new ROM/ISO", MA_MAIN_LOAD_ROM, main_menu_handler),\r
- mee_handler_id("Change options", MA_MAIN_OPTIONS, menu_loop_options),\r
- mee_handler_id("Configure controls", MA_MAIN_OPTIONS, menu_loop_keyconfig),\r
- mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),\r
- mee_handler_id("Patches / GameGenie",MA_MAIN_PATCHES, main_menu_handler),\r
- mee_handler_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_menu_main, MA_MAIN_RESUME_GAME, rom_loaded);\r
- me_enable(e_menu_main, MA_MAIN_SAVE_STATE, rom_loaded);\r
- me_enable(e_menu_main, MA_MAIN_LOAD_STATE, rom_loaded);\r
- me_enable(e_menu_main, MA_MAIN_RESET_GAME, rom_loaded);\r
- me_enable(e_menu_main, MA_MAIN_PATCHES, PicoPatches != NULL);\r
-\r
- plat_video_menu_enter(rom_loaded);\r
- in_set_blocking(1);\r
- me_loop(e_menu_main, &sel);\r
-\r
- if (rom_loaded) {\r
- if (engineState == PGS_Menu)\r
- engineState = PGS_Running;\r
- /* wait until menu, ok, back is released */\r
- while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK));\r
- }\r
-\r
- in_set_blocking(0);\r
-}\r
-\r
-// --------- CD tray close menu ----------\r
-\r
-static int mh_tray_load_cd(menu_id id, int keys)\r
-{\r
- cd_img_type cd_type;\r
- char *ret_name;\r
- int ret = -1;\r
-\r
- ret_name = romsel_run();\r
- if (ret_name == NULL)\r
- return 0;\r
-\r
- cd_type = emu_cdCheck(NULL, ret_name);\r
- if (cd_type != CIT_NOT_CD)\r
- ret = Insert_CD(ret_name, cd_type);\r
- if (ret != 0) {\r
- me_update_msg("Load failed, invalid CD image?");\r
- return 0;\r
- }\r
-\r
- engineState = PGS_RestartRun;\r
- return 1;\r
-}\r
-\r
-static int mh_tray_nothing(menu_id id, int keys)\r
-{\r
- return 1;\r
-}\r
-\r
-static menu_entry e_menu_tray[] =\r
-{\r
- mee_label ("The unit is about to"),\r
- mee_label ("close the CD tray."),\r
- mee_label (""),\r
- mee_label (""),\r
- mee_handler("Load CD image", mh_tray_load_cd),\r
- mee_handler("Insert nothing", mh_tray_nothing),\r
-};\r
-\r
-int menu_loop_tray(void)\r
-{\r
- int ret = 1, sel = 0;\r
-\r
- plat_video_menu_enter(rom_loaded);\r
-\r
- in_set_blocking(1);\r
- me_loop(e_menu_tray, &sel);\r
-\r
- if (engineState != PGS_RestartRun) {\r
- engineState = PGS_RestartRun;\r
- ret = 0; /* no CD inserted */\r
- }\r
-\r
- while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK));\r
- in_set_blocking(0);\r
-\r
- return ret;\r
-}\r
-\r
-#endif // !UIQ3\r
-\r
-void me_update_msg(const char *msg)\r
-{\r
- strncpy(menu_error_msg, msg, sizeof(menu_error_msg));\r
- menu_error_msg[sizeof(menu_error_msg) - 1] = 0;\r
-\r
- menu_error_time = plat_get_ticks_ms();\r
- lprintf("msg: %s\n", menu_error_msg);\r
-}\r
-\r
-// ------------ util ------------\r
-\r
-/* wiz for now, probably extend later */\r
-void menu_plat_setup(int is_wiz)\r
-{\r
- int i;\r
-\r
- if (!is_wiz)\r
- return;\r
-\r
- me_enable(e_menu_adv_options, MA_OPT_ARM940_SOUND, 0);\r
- me_enable(e_menu_gfx_options, MA_OPT2_GAMMA, 0);\r
- me_enable(e_menu_gfx_options, MA_OPT2_A_SN_GAMMA, 0);\r
-\r
- i = me_id2offset(e_menu_gfx_options, MA_OPT_SCALING);\r
- e_menu_gfx_options[i].max = 1; /* only off and sw */\r
-}\r
-\r
-/* TODO: rename */\r
-void menu_darken_bg(void *dst, int pixels, int darker)\r
-{\r
- unsigned int *screen = dst;\r
- pixels /= 2;\r
- if (darker)\r
- {\r
- while (pixels--)\r
- {\r
- unsigned int p = *screen;\r
- *screen++ = ((p&0xf79ef79e)>>1) - ((p&0xc618c618)>>3);\r
- }\r
- }\r
- else\r
- {\r
- while (pixels--)\r
- {\r
- unsigned int p = *screen;\r
- *screen++ = (p&0xf79ef79e)>>1;\r
- }\r
- }\r
-}\r
-\r
-/* hidden options for config engine only */\r
-static menu_entry e_menu_hidden[] =\r
-{\r
- mee_onoff("Accurate sprites", MA_OPT_ACC_SPRITES, PicoOpt, 0x080),\r
- mee_end,\r
-};\r
-\r
-static menu_entry *e_menu_table[] =\r
-{\r
- e_menu_options,\r
- e_menu_gfx_options,\r
- e_menu_adv_options,\r
- e_menu_cd_options,\r
- e_menu_keyconfig,\r
- e_menu_hidden,\r
-};\r
-\r
-static menu_entry *me_list_table = NULL;\r
-static menu_entry *me_list_i = NULL;\r
-\r
-menu_entry *me_list_get_first(void)\r
-{\r
- me_list_table = me_list_i = e_menu_table[0];\r
- return me_list_i;\r
-}\r
-\r
-menu_entry *me_list_get_next(void)\r
-{\r
- int i;\r
-\r
- me_list_i++;\r
- if (me_list_i->name != NULL)\r
- return me_list_i;\r
-\r
- for (i = 0; i < array_size(e_menu_table); i++)\r
- if (me_list_table == e_menu_table[i])\r
- break;\r
-\r
- if (i + 1 < array_size(e_menu_table))\r
- me_list_table = me_list_i = e_menu_table[i + 1];\r
- else\r
- me_list_table = me_list_i = NULL;\r
-\r
- return me_list_i;\r
-}\r
-\r