2 * (C) GraÅžvydas "notaz" Ignotas, 2010
4 * This work is licensed under the terms of any of these licenses
6 * - GNU GPL, version 2 or later.
7 * - GNU LGPL, version 2.1 or later.
8 * See the COPYING file in the top-level directory.
15 #include "plugin_lib.h"
17 #include "common/plat.h"
18 #include "../libpcsxcore/misc.h"
19 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
22 #define array_size(x) (sizeof(x) / sizeof(x[0]))
46 extern int ready_to_go;
48 static int dummy, state_slot;
49 static char rom_fname_reload[MAXPATHLEN];
50 static char last_selected_fname[MAXPATHLEN];
52 void emu_make_path(char *buff, const char *end, int size)
56 end_len = strlen(end);
57 pos = plat_get_root_dir(buff, size);
58 strncpy(buff + pos, end, size - pos);
60 if (pos + end_len > size - 1)
61 printf("Warning: path truncated: %s\n", buff);
64 static int emu_check_save_file(int slot)
69 static int emu_save_load_game(int load, int sram)
74 static int emu_write_config(int is_game)
79 static void emu_set_defconfig(void)
83 #include "common/menu.c"
85 static void draw_savestate_bg(int slot)
89 // -------------- key config --------------
91 me_bind_action me_ctrl_actions[] =
93 { "UP ", 1 << DKEY_UP},
94 { "DOWN ", 1 << DKEY_DOWN },
95 { "LEFT ", 1 << DKEY_LEFT },
96 { "RIGHT ", 1 << DKEY_RIGHT },
97 { "TRIANGLE", 1 << DKEY_TRIANGLE },
98 { "CIRCLE ", 1 << DKEY_SQUARE },
99 { "CROSS ", 1 << DKEY_CROSS },
100 { "SQUARE ", 1 << DKEY_SQUARE },
101 { "L1 ", 1 << DKEY_L1 },
102 { "R1 ", 1 << DKEY_R1 },
103 { "L2 ", 1 << DKEY_L2 },
104 { "R2 ", 1 << DKEY_R2 },
105 { "START ", 1 << DKEY_START },
106 { "SELECT ", 1 << DKEY_SELECT },
110 me_bind_action emuctrl_actions[] =
112 { "Load State ", PEV_STATE_LOAD },
113 { "Save State ", PEV_STATE_SAVE },
114 { "Prev Save Slot ", PEV_SSLOT_PREV },
115 { "Next Save Slot ", PEV_SSLOT_NEXT },
116 { "Enter Menu ", PEV_MENU },
120 static int key_config_loop_wrap(int id, int keys)
123 case MA_CTRL_PLAYER1:
124 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 0);
126 case MA_CTRL_PLAYER2:
127 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 1);
130 key_config_loop(emuctrl_actions, array_size(emuctrl_actions) - 1, -1);
138 static const char *mgn_dev_name(int id, int *offs)
140 const char *name = NULL;
143 if (id == MA_CTRL_DEV_FIRST)
146 for (; it < IN_MAX_DEVS; it++) {
147 name = in_get_dev_name(it, 1, 1);
156 static const char *mgn_saveloadcfg(int id, int *offs)
161 static int mh_saveloadcfg(int id, int keys)
165 case MA_OPT_SAVECFG_GAME:
166 if (emu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0))
167 me_update_msg("config saved");
169 me_update_msg("failed to write config");
178 static menu_entry e_menu_keyconfig[] =
180 mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap),
181 mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap),
182 mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
183 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg),
184 mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg),
186 mee_label ("Input devices:"),
187 mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
188 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
189 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
190 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
191 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
192 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
193 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
197 static int menu_loop_keyconfig(int id, int keys)
201 me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go);
202 me_loop(e_menu_keyconfig, &sel, NULL);
206 // ------------ adv options menu ------------
208 static menu_entry e_menu_adv_options[] =
210 mee_onoff ("captain placeholder", 0, dummy, 1),
214 static int menu_loop_adv_options(int id, int keys)
217 me_loop(e_menu_adv_options, &sel, NULL);
221 // ------------ gfx options menu ------------
223 static menu_entry e_menu_gfx_options[] =
228 static int menu_loop_gfx_options(int id, int keys)
232 me_loop(e_menu_gfx_options, &sel, NULL);
237 // ------------ options menu ------------
239 static menu_entry e_menu_options[];
241 static int mh_restore_defaults(int id, int keys)
244 me_update_msg("defaults restored");
248 static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
249 static const char h_confirm_save[] = "Ask for confirmation when overwriting save,\n"
250 "loading state or both";
252 static menu_entry e_menu_options[] =
254 mee_range ("Save slot", 0, state_slot, 0, 9),
255 mee_enum_h ("Confirm savestate", 0, dummy, men_confirm_save, h_confirm_save),
256 mee_range ("", MA_OPT_CPU_CLOCKS, dummy, 20, 5000),
257 mee_handler ("[Display]", menu_loop_gfx_options),
258 mee_handler ("[Advanced]", menu_loop_adv_options),
259 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg),
260 mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg),
261 mee_handler ("Restore defaults", mh_restore_defaults),
265 static int menu_loop_options(int id, int keys)
270 i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
271 e_menu_options[i].enabled = e_menu_options[i].name[0] ? 1 : 0;
272 me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go);
274 me_loop(e_menu_options, &sel, NULL);
279 // ------------ debug menu ------------
282 #define COMPILER "gcc " __VERSION__
287 static void draw_frame_debug(void)
289 smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " COMPILER, 0xffff);
292 static void debug_menu_loop(void)
302 inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
303 PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
304 if (inp & PBTN_MBACK)
309 // ------------ main menu ------------
311 const char *plat_get_credits(void)
313 return "(C) 1999-2003 PCSX Team\n"
314 "(C) 2005-2009 PCSX-df Team\n"
315 "(C) 2009-2010 PCSX-Reloaded Team\n\n"
316 "GPU and SPU code by Pete Bernert\n"
317 " and the P.E.Op.S. team\n"
318 "ARM recompiler by Ari64\n\n"
319 "integration, optimization and\n"
320 " frontend by (C) notaz, 2010\n";
323 static char *romsel_run(void)
327 ret = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname));
331 lprintf("selected file: %s\n", ret);
337 if (OpenPlugins() == -1) {
338 me_update_msg("failed to open plugins");
344 if (CheckCdrom() == -1) {
345 // Only check the CD if we are starting the console with a CD
347 me_update_msg("unsupported/invalid CD image");
351 // Read main executable directly from CDRom and start it
352 if (LoadCdrom() == -1) {
354 me_update_msg("failed to load CD image");
362 static int main_menu_handler(int id, int keys)
368 case MA_MAIN_RESUME_GAME:
370 case MA_MAIN_SAVE_STATE:
372 return menu_loop_savestate(0);
374 case MA_MAIN_LOAD_STATE:
376 return menu_loop_savestate(1);
378 case MA_MAIN_RESET_GAME:
380 case MA_MAIN_LOAD_ROM:
381 ret_name = romsel_run();
382 if (ret_name != NULL)
385 case MA_MAIN_CREDITS:
387 in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
392 lprintf("%s: something unknown selected\n", __FUNCTION__);
399 static menu_entry e_menu_main[] =
403 mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),
404 mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),
405 mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),
406 mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),
407 mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler),
408 mee_handler ("Options", menu_loop_options),
409 mee_handler ("Controls", menu_loop_keyconfig),
410 mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),
411 mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler),
419 omap_enable_layer(0);
421 me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go);
422 me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go);
423 me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go);
424 me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go);
426 strcpy(last_selected_fname, "/mnt/ntz/stuff/psx");
427 menu_enter(ready_to_go);
428 in_set_config_int(0, IN_CFG_BLOCKING, 1);
431 me_loop(e_menu_main, &sel, NULL);
432 } while (!ready_to_go);
434 /* wait until menu, ok, back is released */
435 while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
438 in_set_config_int(0, IN_CFG_BLOCKING, 0);
440 memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
442 omap_enable_layer(1);
446 void me_update_msg(const char *msg)
448 strncpy(menu_error_msg, msg, sizeof(menu_error_msg));
449 menu_error_msg[sizeof(menu_error_msg) - 1] = 0;
451 menu_error_time = plat_get_ticks_ms();
452 lprintf("msg: %s\n", menu_error_msg);