+static int menu_loop_memcards(int id, int keys)
+{
+ static int sel = 0;
+ char *p;
+ int i;
+
+ memcard1_sel = memcard2_sel = 0;
+ p = strrchr(Config.Mcd1, '/');
+ if (p != NULL)
+ for (i = 0; memcards[i] != NULL; i++)
+ if (strcmp(p + 1, memcards[i]) == 0)
+ { memcard1_sel = i; break; }
+ p = strrchr(Config.Mcd2, '/');
+ if (p != NULL)
+ for (i = 0; memcards[i] != NULL; i++)
+ if (strcmp(p + 1, memcards[i]) == 0)
+ { memcard2_sel = i; break; }
+
+ me_loop_d(e_memcard_options, &sel, handle_memcard_sel, NULL);
+
+ memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2);
+
+ return 0;
+}
+
+// ------------ cheats menu ------------
+
+static void draw_cheatlist(int sel)
+{
+ int max_cnt, start, i, pos, active;
+
+ max_cnt = g_menuscreen_h / me_sfont_h;
+ start = max_cnt / 2 - sel;
+
+ menu_draw_begin(1);
+
+ for (i = 0; i < NumCheats; i++) {
+ pos = start + i;
+ if (pos < 0) continue;
+ if (pos >= max_cnt) break;
+ active = Cheats[i].Enabled;
+ smalltext_out16(14, pos * me_sfont_h,
+ active ? "ON " : "OFF", active ? 0xfff6 : 0xffff);
+ smalltext_out16(14 + me_sfont_w*4, pos * me_sfont_h,
+ Cheats[i].Descr, active ? 0xfff6 : 0xffff);
+ }
+ pos = start + i;
+ if (pos < max_cnt)
+ smalltext_out16(14, pos * me_sfont_h, "done", 0xffff);
+
+ text_out16(5, max_cnt / 2 * me_sfont_h, ">");
+ menu_draw_end();
+}
+
+static void menu_loop_cheats(void)
+{
+ static int menu_sel = 0;
+ int inp;
+
+ for (;;)
+ {
+ draw_cheatlist(menu_sel);
+ inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_L|PBTN_R
+ |PBTN_MOK|PBTN_MBACK, NULL, 33);
+ if (inp & PBTN_UP ) { menu_sel--; if (menu_sel < 0) menu_sel = NumCheats; }
+ if (inp & PBTN_DOWN) { menu_sel++; if (menu_sel > NumCheats) menu_sel = 0; }
+ if (inp &(PBTN_LEFT|PBTN_L)) { menu_sel-=10; if (menu_sel < 0) menu_sel = 0; }
+ if (inp &(PBTN_RIGHT|PBTN_R)) { menu_sel+=10; if (menu_sel > NumCheats) menu_sel = NumCheats; }
+ if (inp & PBTN_MOK) { // action
+ if (menu_sel < NumCheats)
+ Cheats[menu_sel].Enabled = !Cheats[menu_sel].Enabled;
+ else break;
+ }
+ if (inp & PBTN_MBACK)
+ break;
+ }
+}
+
+// --------- main menu help ----------
+
+static void menu_bios_warn(void)
+{
+ int inp;
+ static const char msg[] =
+ "You don't seem to have copied any BIOS\n"
+ "files to\n"
+#ifdef __ARM_ARCH_7A__ // XXX
+ "<SD card>/pandora/appdata/pcsx_rearmed/bios/\n\n"
+#else
+ "pcsx_rearmed/bios/\n\n"
+#endif
+ "While many games work fine with fake\n"
+ "(HLE) BIOS, others (like MGS and FF8)\n"
+ "require BIOS to work.\n"
+ "After copying the file, you'll also need\n"
+ "to select it in the emu's menu:\n"
+ "options->[BIOS/Plugins]\n\n"
+ "The file is usually named SCPH1001.BIN,\n"
+ "but other not compressed files can be\n"
+ "used too.\n\n"
+ "Press %s or %s to continue";
+ char tmp_msg[sizeof(msg) + 64];
+
+ snprintf(tmp_msg, sizeof(tmp_msg), msg,
+ in_get_key_name(-1, -PBTN_MOK), in_get_key_name(-1, -PBTN_MBACK));
+ while (1)
+ {
+ draw_menu_message(tmp_msg, NULL);
+
+ inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, NULL, 70);
+ if (inp & (PBTN_MBACK|PBTN_MOK))
+ return;
+ }
+}
+
+// ------------ main menu ------------
+
+static menu_entry e_menu_main[];
+void OnFile_Exit();
+
+static void draw_frame_main(void)
+{
+ struct tm *tmp;
+ time_t ltime;
+ int capacity;
+ char ltime_s[16];
+ char buff[64];
+ char *out;
+
+ if (CdromId[0] != 0) {
+ snprintf(buff, sizeof(buff), "%.32s/%.9s (running as %s, with %s)",
+ get_cd_label(), CdromId, Config.PsxType ? "PAL" : "NTSC",
+ Config.HLE ? "HLE" : "BIOS");
+ smalltext_out16(4, 1, buff, 0x105f);
+ }
+
+ if (ready_to_go) {
+ capacity = plat_get_bat_capacity();
+ ltime = time(NULL);
+ tmp = localtime(<ime);
+ strftime(ltime_s, sizeof(ltime_s), "%H:%M", tmp);
+ if (capacity >= 0) {
+ snprintf(buff, sizeof(buff), "%s %3d%%", ltime_s, capacity);
+ out = buff;
+ }
+ else
+ out = ltime_s;
+ smalltext_out16(4, 1 + me_sfont_h, out, 0x105f);
+ }
+}
+
+static void draw_frame_credits(void)
+{
+ smalltext_out16(4, 1, "build: " __DATE__ " " __TIME__ " " REV, 0xe7fc);
+}
+
+static const char credits_text[] =
+ "PCSX-ReARMed\n\n"
+ "(C) 1999-2003 PCSX Team\n"
+ "(C) 2005-2009 PCSX-df Team\n"
+ "(C) 2009-2011 PCSX-Reloaded Team\n\n"
+ "ARM recompiler (C) 2009-2011 Ari64\n"
+#ifdef __ARM_NEON__
+ "ARM NEON GPU (c) 2011-2012 Exophase\n"
+#endif
+ "PEOpS GPU and SPU by Pete Bernert\n"
+ " and the P.E.Op.S. team\n"
+ "PCSX4ALL plugin by PCSX4ALL team\n"
+ " Chui, Franxis, Unai\n\n"
+ "integration, optimization and\n"
+ " frontend (C) 2010-2012 notaz\n";
+
+static int reset_game(void)
+{
+ // sanity check
+ if (bios_sel == 0 && !Config.HLE)
+ return -1;
+
+ ClosePlugins();
+ OpenPlugins();
+ SysReset();
+ if (CheckCdrom() != -1) {
+ LoadCdrom();
+ }
+ return 0;
+}
+
+static int reload_plugins(const char *cdimg)
+{
+ pl_vout_buf = NULL;
+
+ ClosePlugins();