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"
21 #define array_size(x) (sizeof(x) / sizeof(x[0]))
45 extern int ready_to_go;
47 static int dummy, state_slot;
48 static char rom_fname_reload[MAXPATHLEN];
49 static char last_selected_fname[MAXPATHLEN];
51 void emu_make_path(char *buff, const char *end, int size)
55 end_len = strlen(end);
56 pos = plat_get_root_dir(buff, size);
57 strncpy(buff + pos, end, size - pos);
59 if (pos + end_len > size - 1)
60 printf("Warning: path truncated: %s\n", buff);
63 static int emu_check_save_file(int slot)
68 static int emu_save_load_game(int load, int sram)
73 static int emu_write_config(int is_game)
78 static void emu_set_defconfig(void)
82 #include "common/menu.c"
84 static void draw_savestate_bg(int slot)
88 // -------------- key config --------------
90 me_bind_action me_ctrl_actions[] =
92 { "UP ", 1 << DKEY_UP},
93 { "DOWN ", 1 << DKEY_DOWN },
94 { "LEFT ", 1 << DKEY_LEFT },
95 { "RIGHT ", 1 << DKEY_RIGHT },
96 { "TRIANGLE", 1 << DKEY_TRIANGLE },
97 { "CIRCLE ", 1 << DKEY_SQUARE },
98 { "CROSS ", 1 << DKEY_CROSS },
99 { "SQUARE ", 1 << DKEY_SQUARE },
100 { "L1 ", 1 << DKEY_L1 },
101 { "R1 ", 1 << DKEY_R1 },
102 { "L2 ", 1 << DKEY_L2 },
103 { "R2 ", 1 << DKEY_R2 },
104 { "START ", 1 << DKEY_START },
105 { "SELECT ", 1 << DKEY_SELECT },
109 me_bind_action emuctrl_actions[] =
111 { "Load State ", PEV_STATE_LOAD },
112 { "Save State ", PEV_STATE_SAVE },
113 { "Prev Save Slot ", PEV_SSLOT_PREV },
114 { "Next Save Slot ", PEV_SSLOT_NEXT },
115 { "Enter Menu ", PEV_MENU },
119 static int key_config_loop_wrap(int id, int keys)
122 case MA_CTRL_PLAYER1:
123 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 0);
125 case MA_CTRL_PLAYER2:
126 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 1);
129 key_config_loop(emuctrl_actions, array_size(emuctrl_actions) - 1, -1);
137 static const char *mgn_dev_name(int id, int *offs)
139 const char *name = NULL;
142 if (id == MA_CTRL_DEV_FIRST)
145 for (; it < IN_MAX_DEVS; it++) {
146 name = in_get_dev_name(it, 1, 1);
155 static const char *mgn_saveloadcfg(int id, int *offs)
160 static int mh_saveloadcfg(int id, int keys)
164 case MA_OPT_SAVECFG_GAME:
165 if (emu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0))
166 me_update_msg("config saved");
168 me_update_msg("failed to write config");
177 static menu_entry e_menu_keyconfig[] =
179 mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap),
180 mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap),
181 mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
182 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg),
183 mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg),
185 mee_label ("Input devices:"),
186 mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
187 mee_label_mk (MA_CTRL_DEV_NEXT, 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),
196 static int menu_loop_keyconfig(int id, int keys)
200 me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go);
201 me_loop(e_menu_keyconfig, &sel, NULL);
205 // ------------ adv options menu ------------
207 static menu_entry e_menu_adv_options[] =
209 mee_onoff ("captain placeholder", 0, dummy, 1),
213 static int menu_loop_adv_options(int id, int keys)
216 me_loop(e_menu_adv_options, &sel, NULL);
220 // ------------ gfx options menu ------------
222 static menu_entry e_menu_gfx_options[] =
227 static int menu_loop_gfx_options(int id, int keys)
231 me_loop(e_menu_gfx_options, &sel, NULL);
236 // ------------ options menu ------------
238 static menu_entry e_menu_options[];
240 static int mh_restore_defaults(int id, int keys)
243 me_update_msg("defaults restored");
247 static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
248 static const char h_confirm_save[] = "Ask for confirmation when overwriting save,\n"
249 "loading state or both";
251 static menu_entry e_menu_options[] =
253 mee_range ("Save slot", 0, state_slot, 0, 9),
254 mee_enum_h ("Confirm savestate", 0, dummy, men_confirm_save, h_confirm_save),
255 mee_range ("", MA_OPT_CPU_CLOCKS, dummy, 20, 5000),
256 mee_handler ("[Display]", menu_loop_gfx_options),
257 mee_handler ("[Advanced]", menu_loop_adv_options),
258 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_saveloadcfg, mgn_saveloadcfg),
259 mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_saveloadcfg, mgn_saveloadcfg),
260 mee_handler ("Restore defaults", mh_restore_defaults),
264 static int menu_loop_options(int id, int keys)
269 i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
270 e_menu_options[i].enabled = e_menu_options[i].name[0] ? 1 : 0;
271 me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go);
273 me_loop(e_menu_options, &sel, NULL);
278 // ------------ debug menu ------------
281 #define COMPILER "gcc " __VERSION__
286 static void draw_frame_debug(void)
288 smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " COMPILER, 0xffff);
291 static void debug_menu_loop(void)
301 inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
302 PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
303 if (inp & PBTN_MBACK)
308 // ------------ main menu ------------
310 const char *plat_get_credits(void)
312 return "(C) 1999-2003 PCSX Team\n"
313 "(C) 2005-2009 PCSX-df Team\n"
314 "(C) 2009-2010 PCSX-Reloaded Team\n\n"
315 "GPU and SPU code by Pete Bernert\n"
316 " and the P.E.Op.S. team\n"
317 "ARM recompiler by Ari64\n\n"
318 "integration, optimization and\n"
319 " frontend by (C) notaz, 2010\n";
322 static char *romsel_run(void)
326 ret = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname));
330 lprintf("selected file: %s\n", ret);
336 if (OpenPlugins() == -1) {
337 me_update_msg("failed to open plugins");
343 if (CheckCdrom() == -1) {
344 // Only check the CD if we are starting the console with a CD
346 me_update_msg("unsupported/invalid CD image");
350 // Read main executable directly from CDRom and start it
351 if (LoadCdrom() == -1) {
353 me_update_msg("failed to load CD image");
361 static int main_menu_handler(int id, int keys)
367 case MA_MAIN_RESUME_GAME:
369 case MA_MAIN_SAVE_STATE:
371 return menu_loop_savestate(0);
373 case MA_MAIN_LOAD_STATE:
375 return menu_loop_savestate(1);
377 case MA_MAIN_RESET_GAME:
379 case MA_MAIN_LOAD_ROM:
380 ret_name = romsel_run();
381 if (ret_name != NULL)
384 case MA_MAIN_CREDITS:
386 in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
391 lprintf("%s: something unknown selected\n", __FUNCTION__);
398 static menu_entry e_menu_main[] =
402 mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),
403 mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),
404 mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),
405 mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),
406 mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler),
407 mee_handler ("Options", menu_loop_options),
408 mee_handler ("Controls", menu_loop_keyconfig),
409 mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),
410 mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler),
418 omap_enable_layer(0);
420 me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go);
421 me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go);
422 me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go);
423 me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go);
425 strcpy(last_selected_fname, "/mnt/ntz/stuff/psx");
426 menu_enter(ready_to_go);
427 in_set_config_int(0, IN_CFG_BLOCKING, 1);
430 me_loop(e_menu_main, &sel, NULL);
431 } while (!ready_to_go);
433 /* wait until menu, ok, back is released */
434 while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
437 in_set_config_int(0, IN_CFG_BLOCKING, 0);
439 memset(g_menuscreen_ptr, 0, g_menuscreen_w * g_menuscreen_h * 2);
441 omap_enable_layer(1);
444 void me_update_msg(const char *msg)
446 strncpy(menu_error_msg, msg, sizeof(menu_error_msg));
447 menu_error_msg[sizeof(menu_error_msg) - 1] = 0;
449 menu_error_time = plat_get_ticks_ms();
450 lprintf("msg: %s\n", menu_error_msg);