2 * (C) GraÅžvydas "notaz" Ignotas, 2010-2011
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.
21 #include "plugin_lib.h"
25 #include "arm_utils.h"
26 #include "common/plat.h"
27 #include "common/input.h"
28 #include "linux/in_evdev.h"
29 #include "../libpcsxcore/misc.h"
30 #include "../libpcsxcore/cdrom.h"
31 #include "../libpcsxcore/psemu_plugin_defs.h"
32 #include "../libpcsxcore/new_dynarec/new_dynarec.h"
33 #include "../plugins/dfinput/pad.h"
37 #define array_size(x) (sizeof(x) / sizeof(x[0]))
71 static int last_psx_w, last_psx_h, last_psx_bpp;
72 static int scaling, filter, cpu_clock, cpu_clock_st;
73 static char rom_fname_reload[MAXPATHLEN];
74 static char last_selected_fname[MAXPATHLEN];
75 static int warned_about_bios, region, in_type_sel;
79 extern int iUseReverb;
80 extern int iUseInterpolation;
82 extern int iSPUIRQWait;
85 static const char *bioses[24];
86 static const char *gpu_plugins[16];
87 static const char *spu_plugins[16];
88 static int bios_sel, gpu_plugsel, spu_plugsel;
91 static int min(int x, int y) { return x < y ? x : y; }
92 static int max(int x, int y) { return x > y ? x : y; }
94 void emu_make_path(char *buff, const char *end, int size)
98 end_len = strlen(end);
99 pos = plat_get_root_dir(buff, size);
100 strncpy(buff + pos, end, size - pos);
102 if (pos + end_len > size - 1)
103 printf("Warning: path truncated: %s\n", buff);
106 static int emu_check_save_file(int slot)
108 int ret = emu_check_state(slot);
109 return ret == 0 ? 1 : 0;
112 static int emu_save_load_game(int load, int unused)
117 ret = emu_load_state(state_slot);
119 // reflect hle/bios mode from savestate
122 else if (bios_sel == 0 && bioses[1] != NULL)
123 // XXX: maybe find the right bios instead
127 ret = emu_save_state(state_slot);
132 // propagate menu settings to the emu vars
133 static void menu_sync_config(void)
135 static int allow_abs_only_old;
140 Config.PsxType = region - 1;
142 in_type = in_type_sel ? PSE_PAD_TYPE_ANALOGPAD : PSE_PAD_TYPE_STANDARD;
143 if (in_evdev_allow_abs_only != allow_abs_only_old) {
144 pandora_rescan_inputs();
145 allow_abs_only_old = in_evdev_allow_abs_only;
148 pl_frame_interval = Config.PsxType ? 20000 : 16667;
149 // used by P.E.Op.S. frameskip code
150 pl_rearmed_cbs.gpu_peops.fFrameRateHz = Config.PsxType ? 50.0f : 59.94f;
151 pl_rearmed_cbs.gpu_peops.dwFrameRateTicks =
152 (100000*100 / (unsigned long)(pl_rearmed_cbs.gpu_peops.fFrameRateHz*100));
155 static void menu_set_defconfig(void)
162 in_evdev_allow_abs_only = 0;
163 Config.Xa = Config.Cdda = Config.Sio =
164 Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
166 pl_rearmed_cbs.frameskip = 0;
167 pl_rearmed_cbs.gpu_peops.iUseDither = 0;
168 pl_rearmed_cbs.gpu_peops.dwActFixes = 1<<7;
171 iUseInterpolation = 1;
179 #define CE_CONFIG_STR(val) \
180 { #val, 0, Config.val }
182 #define CE_CONFIG_VAL(val) \
183 { #val, sizeof(Config.val), &Config.val }
185 #define CE_STR(val) \
188 #define CE_INTVAL(val) \
189 { #val, sizeof(val), &val }
191 #define CE_INTVAL_P(val) \
192 { #val, sizeof(pl_rearmed_cbs.val), &pl_rearmed_cbs.val }
194 // 'versioned' var, used when defaults change
195 #define CE_INTVAL_V(val, ver) \
196 { #val #ver, sizeof(val), &val }
198 static const struct {
206 // CE_CONFIG_STR(Cdr),
211 CE_CONFIG_VAL(Debug),
212 CE_CONFIG_VAL(PsxOut),
213 CE_CONFIG_VAL(SpuIrq),
214 CE_CONFIG_VAL(RCntFix),
215 CE_CONFIG_VAL(VSyncWA),
219 CE_INTVAL(g_layer_x),
220 CE_INTVAL(g_layer_y),
221 CE_INTVAL(g_layer_w),
222 CE_INTVAL(g_layer_h),
224 CE_INTVAL(state_slot),
225 CE_INTVAL(cpu_clock),
227 CE_INTVAL(in_type_sel),
228 CE_INTVAL_P(frameskip),
229 CE_INTVAL_P(gpu_peops.iUseDither),
230 CE_INTVAL_P(gpu_peops.dwActFixes),
231 CE_INTVAL(iUseReverb),
233 CE_INTVAL_V(iUseInterpolation, 2),
234 CE_INTVAL_V(iSPUIRQWait, 2),
235 CE_INTVAL(iUseTimer),
236 CE_INTVAL(warned_about_bios),
237 CE_INTVAL(in_evdev_allow_abs_only),
240 static char *get_cd_label(void)
242 static char trimlabel[33];
245 strncpy(trimlabel, CdromLabel, 32);
247 for (j = 31; j >= 0; j--)
248 if (trimlabel[j] == ' ')
254 static void make_cfg_fname(char *buf, size_t size, int is_game)
257 snprintf(buf, size, "." PCSX_DOT_DIR "cfg/%.32s-%.9s.cfg", get_cd_label(), CdromId);
259 snprintf(buf, size, "." PCSX_DOT_DIR "%s", cfgfile_basename);
262 static void keys_write_all(FILE *f);
264 static int menu_write_config(int is_game)
266 char cfgfile[MAXPATHLEN];
270 make_cfg_fname(cfgfile, sizeof(cfgfile), is_game);
271 f = fopen(cfgfile, "w");
273 printf("menu_write_config: failed to open: %s\n", cfgfile);
277 for (i = 0; i < ARRAY_SIZE(config_data); i++) {
278 fprintf(f, "%s = ", config_data[i].name);
279 switch (config_data[i].len) {
281 fprintf(f, "%s\n", (char *)config_data[i].val);
284 fprintf(f, "%x\n", *(u8 *)config_data[i].val);
287 fprintf(f, "%x\n", *(u16 *)config_data[i].val);
290 fprintf(f, "%x\n", *(u32 *)config_data[i].val);
293 printf("menu_write_config: unhandled len %d for %s\n",
294 config_data[i].len, config_data[i].name);
300 fprintf(f, "lastcdimg = %s\n", last_selected_fname);
308 static void parse_str_val(char *cval, const char *src)
311 strncpy(cval, src, MAXPATHLEN);
312 cval[MAXPATHLEN - 1] = 0;
313 tmp = strchr(cval, '\n');
315 tmp = strchr(cval, '\r');
320 static void keys_load_all(const char *cfg);
322 static int menu_load_config(int is_game)
324 char cfgfile[MAXPATHLEN];
330 make_cfg_fname(cfgfile, sizeof(cfgfile), is_game);
331 f = fopen(cfgfile, "r");
333 printf("menu_load_config: failed to open: %s\n", cfgfile);
337 fseek(f, 0, SEEK_END);
340 printf("bad size %ld: %s\n", size, cfgfile);
344 cfg = malloc(size + 1);
348 fseek(f, 0, SEEK_SET);
349 if (fread(cfg, 1, size, f) != size) {
350 printf("failed to read: %s\n", cfgfile);
355 for (i = 0; i < ARRAY_SIZE(config_data); i++) {
359 tmp = strstr(cfg, config_data[i].name);
362 tmp += strlen(config_data[i].name);
363 if (strncmp(tmp, " = ", 3) != 0)
367 if (config_data[i].len == 0) {
368 parse_str_val(config_data[i].val, tmp);
373 val = strtoul(tmp, &tmp2, 16);
374 if (tmp2 == NULL || tmp == tmp2)
375 continue; // parse failed
377 switch (config_data[i].len) {
379 *(u8 *)config_data[i].val = val;
382 *(u16 *)config_data[i].val = val;
385 *(u32 *)config_data[i].val = val;
388 printf("menu_load_config: unhandled len %d for %s\n",
389 config_data[i].len, config_data[i].name);
395 char *tmp = strstr(cfg, "lastcdimg = ");
398 parse_str_val(last_selected_fname, tmp);
405 for (i = bios_sel = 0; bioses[i] != NULL; i++)
406 if (strcmp(Config.Bios, bioses[i]) == 0)
407 { bios_sel = i; break; }
409 for (i = gpu_plugsel = 0; gpu_plugins[i] != NULL; i++)
410 if (strcmp(Config.Gpu, gpu_plugins[i]) == 0)
411 { gpu_plugsel = i; break; }
413 for (i = spu_plugsel = 0; spu_plugins[i] != NULL; i++)
414 if (strcmp(Config.Spu, spu_plugins[i]) == 0)
415 { spu_plugsel = i; break; }
426 // rrrr rggg gggb bbbb
427 static unsigned short fname2color(const char *fname)
429 static const char *cdimg_exts[] = { ".bin", ".img", ".iso", ".cue", ".z", ".bz", ".znx", ".pbp" };
430 static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub", ".table", ".index", ".sbi" };
431 const char *ext = strrchr(fname, '.');
436 for (i = 0; i < array_size(cdimg_exts); i++)
437 if (strcasecmp(ext, cdimg_exts[i]) == 0)
439 for (i = 0; i < array_size(other_exts); i++)
440 if (strcasecmp(ext, other_exts[i]) == 0)
445 static void draw_savestate_bg(int slot);
447 #define MENU_ALIGN_LEFT
448 #define menu_init menu_init_common
449 #include "common/menu.c"
452 // a bit of black magic here
453 static void draw_savestate_bg(int slot)
455 static const int psx_widths[8] = { 256, 368, 320, 384, 512, 512, 640, 640 };
457 char fname[MAXPATHLEN];
464 ret = get_state_filename(fname, sizeof(fname), slot);
468 f = gzopen(fname, "rb");
472 if (gzseek(f, 0x29933d, SEEK_SET) != 0x29933d) {
473 fprintf(stderr, "gzseek failed\n");
478 gpu = malloc(sizeof(*gpu));
484 ret = gzread(f, gpu, sizeof(*gpu));
486 if (ret != sizeof(*gpu)) {
487 fprintf(stderr, "gzread failed\n");
491 memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2);
493 if ((gpu->ulStatus & 0x800000) || (gpu->ulStatus & 0x200000))
494 goto out; // disabled || 24bpp (NYET)
496 x = gpu->ulControl[5] & 0x3ff;
497 y = (gpu->ulControl[5] >> 10) & 0x1ff;
498 s = (u16 *)gpu->psxVRam + y * 1024 + (x & ~3);
499 w = psx_widths[(gpu->ulStatus >> 16) & 7];
500 tmp = gpu->ulControl[7];
501 h = ((tmp >> 10) & 0x3ff) - (tmp & 0x3ff);
502 if (gpu->ulStatus & 0x80000) // doubleheight
505 x = max(0, g_menuscreen_w - w) & ~3;
506 y = max(0, g_menuscreen_h / 2 - h / 2);
507 w = min(g_menuscreen_w, w);
508 h = min(g_menuscreen_h, h);
509 d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x;
511 for (; h > 0; h--, d += g_menuscreen_w, s += 1024)
512 bgr555_to_rgb565(d, s, w * 2);
518 // ---------- pandora specific -----------
520 static const char pnd_script_base[] = "sudo -n /usr/pandora/scripts";
521 static char **pnd_filter_list;
523 static int get_cpu_clock(void)
527 f = fopen("/proc/pandora/cpu_mhz_max", "r");
529 fscanf(f, "%d", &ret);
535 static void apply_cpu_clock(void)
539 if (cpu_clock != 0 && cpu_clock != get_cpu_clock()) {
540 snprintf(buf, sizeof(buf), "unset DISPLAY; echo y | %s/op_cpuspeed.sh %d",
541 pnd_script_base, cpu_clock);
546 static void apply_filter(int which)
552 if (pnd_filter_list == NULL || which == old)
555 for (i = 0; i < which; i++)
556 if (pnd_filter_list[i] == NULL)
559 if (pnd_filter_list[i] == NULL)
562 snprintf(buf, sizeof(buf), "%s/op_videofir.sh %s", pnd_script_base, pnd_filter_list[i]);
567 static void apply_lcdrate(int pal)
575 snprintf(buf, sizeof(buf), "%s/op_lcdrate.sh %d",
576 pnd_script_base, pal ? 50 : 60);
581 static menu_entry e_menu_gfx_options[];
583 static void pnd_menu_init(void)
591 cpu_clock_st = cpu_clock = get_cpu_clock();
593 dir = opendir("/etc/pandora/conf/dss_fir");
595 perror("filter opendir");
608 if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
617 mfilters = calloc(count + 1, sizeof(mfilters[0]));
618 if (mfilters == NULL)
622 for (i = 0; (ent = readdir(dir)); ) {
625 if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
628 len = strlen(ent->d_name);
630 // skip pre-HF5 extra files
631 if (len >= 3 && strcmp(ent->d_name + len - 3, "_v3") == 0)
633 if (len >= 3 && strcmp(ent->d_name + len - 3, "_v5") == 0)
636 // have to cut "_up_h" for pre-HF5
637 if (len > 5 && strcmp(ent->d_name + len - 5, "_up_h") == 0)
640 if (len > sizeof(buff) - 1)
643 strncpy(buff, ent->d_name, len);
645 mfilters[i] = strdup(buff);
646 if (mfilters[i] != NULL)
651 i = me_id2offset(e_menu_gfx_options, MA_OPT_FILTERING);
652 e_menu_gfx_options[i].data = (void *)mfilters;
653 pnd_filter_list = mfilters;
656 void menu_finish(void)
658 cpu_clock = cpu_clock_st;
662 // -------------- key config --------------
664 me_bind_action me_ctrl_actions[] =
666 { "UP ", 1 << DKEY_UP},
667 { "DOWN ", 1 << DKEY_DOWN },
668 { "LEFT ", 1 << DKEY_LEFT },
669 { "RIGHT ", 1 << DKEY_RIGHT },
670 { "TRIANGLE", 1 << DKEY_TRIANGLE },
671 { "CIRCLE ", 1 << DKEY_CIRCLE },
672 { "CROSS ", 1 << DKEY_CROSS },
673 { "SQUARE ", 1 << DKEY_SQUARE },
674 { "L1 ", 1 << DKEY_L1 },
675 { "R1 ", 1 << DKEY_R1 },
676 { "L2 ", 1 << DKEY_L2 },
677 { "R2 ", 1 << DKEY_R2 },
678 { "L3 ", 1 << DKEY_L3 },
679 { "R3 ", 1 << DKEY_R3 },
680 { "START ", 1 << DKEY_START },
681 { "SELECT ", 1 << DKEY_SELECT },
685 me_bind_action emuctrl_actions[] =
687 { "Save State ", 1 << SACTION_SAVE_STATE },
688 { "Load State ", 1 << SACTION_LOAD_STATE },
689 { "Prev Save Slot ", 1 << SACTION_PREV_SSLOT },
690 { "Next Save Slot ", 1 << SACTION_NEXT_SSLOT },
691 { "Toggle Frameskip ", 1 << SACTION_TOGGLE_FSKIP },
692 { "Take Screenshot ", 1 << SACTION_SCREENSHOT },
693 { "Enter Menu ", 1 << SACTION_ENTER_MENU },
697 static char *mystrip(char *str)
702 for (i = 0; i < len; i++)
703 if (str[i] != ' ') break;
704 if (i > 0) memmove(str, str + i, len - i + 1);
707 for (i = len - 1; i >= 0; i--)
708 if (str[i] != ' ') break;
714 static void get_line(char *d, size_t size, const char *s)
719 for (pe = s; *pe != '\r' && *pe != '\n' && *pe != 0; pe++)
730 static void keys_write_all(FILE *f)
734 for (d = 0; d < IN_MAX_DEVS; d++)
736 const int *binds = in_get_dev_binds(d);
737 const char *name = in_get_dev_name(d, 0, 0);
740 if (binds == NULL || name == NULL)
743 fprintf(f, "binddev = %s\n", name);
744 in_get_config(d, IN_CFG_BIND_COUNT, &count);
746 for (k = 0; k < count; k++)
751 act[0] = act[31] = 0;
752 name = in_get_key_name(d, k);
754 kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_PLAYER12)];
755 for (i = 0; kbinds && i < ARRAY_SIZE(me_ctrl_actions) - 1; i++) {
756 mask = me_ctrl_actions[i].mask;
758 strncpy(act, me_ctrl_actions[i].name, 31);
759 fprintf(f, "bind %s = player1 %s\n", name, mystrip(act));
762 mask = me_ctrl_actions[i].mask << 16;
764 strncpy(act, me_ctrl_actions[i].name, 31);
765 fprintf(f, "bind %s = player2 %s\n", name, mystrip(act));
770 kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_EMU)];
771 for (i = 0; kbinds && i < ARRAY_SIZE(emuctrl_actions) - 1; i++) {
772 mask = emuctrl_actions[i].mask;
774 strncpy(act, emuctrl_actions[i].name, 31);
775 fprintf(f, "bind %s = %s\n", name, mystrip(act));
783 static int parse_bind_val(const char *val, int *type)
787 *type = IN_BINDTYPE_NONE;
791 if (strncasecmp(val, "player", 6) == 0)
793 int player, shift = 0;
794 player = atoi(val + 6) - 1;
796 if ((unsigned int)player > 1)
801 *type = IN_BINDTYPE_PLAYER12;
802 for (i = 0; me_ctrl_actions[i].name != NULL; i++) {
803 if (strncasecmp(me_ctrl_actions[i].name, val + 8, strlen(val + 8)) == 0)
804 return me_ctrl_actions[i].mask << shift;
807 for (i = 0; emuctrl_actions[i].name != NULL; i++) {
808 if (strncasecmp(emuctrl_actions[i].name, val, strlen(val)) == 0) {
809 *type = IN_BINDTYPE_EMU;
810 return emuctrl_actions[i].mask;
817 static void keys_load_all(const char *cfg)
819 char dev[256], key[128], *act;
825 while (p != NULL && (p = strstr(p, "binddev = ")) != NULL) {
828 get_line(dev, sizeof(dev), p);
829 dev_id = in_config_parse_dev(dev);
831 printf("input: can't handle dev: %s\n", dev);
835 in_unbind_all(dev_id, -1, -1);
836 while ((p = strstr(p, "bind"))) {
837 if (strncmp(p, "binddev = ", 10) == 0)
842 printf("input: parse error: %16s..\n", p);
846 get_line(key, sizeof(key), p);
847 act = strchr(key, '=');
849 printf("parse failed: %16s..\n", p);
857 bind = parse_bind_val(act, &bindtype);
858 if (bind != -1 && bind != 0) {
859 //printf("bind #%d '%s' %08x (%s)\n", dev_id, key, bind, act);
860 in_config_bind_key(dev_id, key, bind, bindtype);
863 lprintf("config: unhandled action \"%s\"\n", act);
869 static int key_config_loop_wrap(int id, int keys)
872 case MA_CTRL_PLAYER1:
873 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 0);
875 case MA_CTRL_PLAYER2:
876 key_config_loop(me_ctrl_actions, array_size(me_ctrl_actions) - 1, 1);
879 key_config_loop(emuctrl_actions, array_size(emuctrl_actions) - 1, -1);
887 static const char *mgn_dev_name(int id, int *offs)
889 const char *name = NULL;
892 if (id == MA_CTRL_DEV_FIRST)
895 for (; it < IN_MAX_DEVS; it++) {
896 name = in_get_dev_name(it, 1, 1);
905 static const char *mgn_saveloadcfg(int id, int *offs)
910 static int mh_savecfg(int id, int keys)
912 if (menu_write_config(id == MA_OPT_SAVECFG_GAME ? 1 : 0) == 0)
913 me_update_msg("config saved");
915 me_update_msg("failed to write config");
920 static int mh_input_rescan(int id, int keys)
922 //menu_sync_config();
923 pandora_rescan_inputs();
924 me_update_msg("rescan complete.");
929 static const char *men_in_type_sel[] = { "Standard (SCPH-1080)", "Analog (SCPH-1150)", NULL };
930 static const char h_nub_btns[] = "Experimental, keep this OFF if unsure. Select rescan after change.";
932 static menu_entry e_menu_keyconfig[] =
934 mee_handler_id("Player 1", MA_CTRL_PLAYER1, key_config_loop_wrap),
935 mee_handler_id("Player 2", MA_CTRL_PLAYER2, key_config_loop_wrap),
936 mee_handler_id("Emulator controls", MA_CTRL_EMU, key_config_loop_wrap),
938 mee_enum ("Controller", 0, in_type_sel, men_in_type_sel),
939 mee_onoff_h ("Nubs as buttons", 0, in_evdev_allow_abs_only, 1, h_nub_btns),
940 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
941 mee_cust_nosave("Save cfg for loaded game", MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
942 mee_handler ("Rescan devices", mh_input_rescan),
944 mee_label ("Input devices:"),
945 mee_label_mk (MA_CTRL_DEV_FIRST, mgn_dev_name),
946 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
947 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
948 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
949 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
950 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
951 mee_label_mk (MA_CTRL_DEV_NEXT, mgn_dev_name),
955 static int menu_loop_keyconfig(int id, int keys)
959 // me_enable(e_menu_keyconfig, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
960 me_loop(e_menu_keyconfig, &sel, NULL);
964 // ------------ gfx options menu ------------
966 static const char *men_scaler[] = { "1x1", "scaled 4:3", "fullscreen", "custom", NULL };
967 static const char h_cscaler[] = "Displays the scaler layer, you can resize it\n"
968 "using d-pad or move it using R+d-pad";
969 static const char *men_dummy[] = { NULL };
971 static int menu_loop_cscaler(int id, int keys)
975 scaling = SCALE_CUSTOM;
977 omap_enable_layer(1);
982 memset(g_menuscreen_ptr, 4, g_menuscreen_w * g_menuscreen_h * 2);
983 text_out16(2, 2, "%d,%d", g_layer_x, g_layer_y);
984 text_out16(2, 480 - 18, "%dx%d | d-pad: resize, R+d-pad: move", g_layer_w, g_layer_h);
987 inp = in_menu_wait(PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT|PBTN_R|PBTN_MOK|PBTN_MBACK, 40);
988 if (inp & PBTN_UP) g_layer_y--;
989 if (inp & PBTN_DOWN) g_layer_y++;
990 if (inp & PBTN_LEFT) g_layer_x--;
991 if (inp & PBTN_RIGHT) g_layer_x++;
992 if (!(inp & PBTN_R)) {
993 if (inp & PBTN_UP) g_layer_h += 2;
994 if (inp & PBTN_DOWN) g_layer_h -= 2;
995 if (inp & PBTN_LEFT) g_layer_w += 2;
996 if (inp & PBTN_RIGHT) g_layer_w -= 2;
998 if (inp & (PBTN_MOK|PBTN_MBACK))
1001 if (inp & (PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT)) {
1002 if (g_layer_x < 0) g_layer_x = 0;
1003 if (g_layer_x > 640) g_layer_x = 640;
1004 if (g_layer_y < 0) g_layer_y = 0;
1005 if (g_layer_y > 420) g_layer_y = 420;
1006 if (g_layer_w < 160) g_layer_w = 160;
1007 if (g_layer_h < 60) g_layer_h = 60;
1008 if (g_layer_x + g_layer_w > 800)
1009 g_layer_w = 800 - g_layer_x;
1010 if (g_layer_y + g_layer_h > 480)
1011 g_layer_h = 480 - g_layer_y;
1012 omap_enable_layer(1);
1016 omap_enable_layer(0);
1021 static menu_entry e_menu_gfx_options[] =
1023 mee_enum ("Scaler", 0, scaling, men_scaler),
1024 mee_enum ("Filter", MA_OPT_FILTERING, filter, men_dummy),
1025 // mee_onoff ("Vsync", 0, vsync, 1),
1026 mee_cust_h ("Setup custom scaler", 0, menu_loop_cscaler, NULL, h_cscaler),
1030 static int menu_loop_gfx_options(int id, int keys)
1034 me_loop(e_menu_gfx_options, &sel, NULL);
1039 // ------------ bios/plugins ------------
1041 static const char *men_gpu_dithering[] = { "None", "Game dependant", "Always", NULL };
1042 static const char h_gpu_0[] = "Needed for Chrono Cross";
1043 static const char h_gpu_1[] = "Capcom fighting games";
1044 static const char h_gpu_2[] = "Black screens in Lunar";
1045 static const char h_gpu_3[] = "Compatibility mode";
1046 static const char h_gpu_6[] = "Pandemonium 2";
1047 static const char h_gpu_7[] = "Skip every second frame";
1048 static const char h_gpu_8[] = "Needed by Dark Forces";
1049 static const char h_gpu_9[] = "better g-colors, worse textures";
1050 static const char h_gpu_10[] = "Toggle busy flags after drawing";
1052 static menu_entry e_menu_plugin_gpu[] =
1054 mee_enum ("Dithering", 0, pl_rearmed_cbs.gpu_peops.iUseDither, men_gpu_dithering),
1055 mee_onoff_h ("Odd/even bit hack", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<0, h_gpu_0),
1056 mee_onoff_h ("Expand screen width", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<1, h_gpu_1),
1057 mee_onoff_h ("Ignore brightness color", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<2, h_gpu_2),
1058 mee_onoff_h ("Disable coordinate check", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<3, h_gpu_3),
1059 mee_onoff_h ("Lazy screen update", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<6, h_gpu_6),
1060 mee_onoff_h ("Old frame skipping", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<7, h_gpu_7),
1061 mee_onoff_h ("Repeated flat tex triangles ",0,pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<8, h_gpu_8),
1062 mee_onoff_h ("Draw quads with triangles", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<9, h_gpu_9),
1063 mee_onoff_h ("Fake 'gpu busy' states", 0, pl_rearmed_cbs.gpu_peops.dwActFixes, 1<<10, h_gpu_10),
1067 static int menu_loop_plugin_gpu(int id, int keys)
1070 me_loop(e_menu_plugin_gpu, &sel, NULL);
1074 static const char *men_spu_reverb[] = { "Off", "Fake", "On", NULL };
1075 static const char *men_spu_interp[] = { "None", "Simple", "Gaussian", "Cubic", NULL };
1076 static const char h_spu_irq_wait[] = "Wait for CPU (recommended set to ON)";
1077 static const char h_spu_thread[] = "Run sound emulation in main thread (recommended)";
1079 static menu_entry e_menu_plugin_spu[] =
1081 mee_enum ("Reverb", 0, iUseReverb, men_spu_reverb),
1082 mee_enum ("Interpolation", 0, iUseInterpolation, men_spu_interp),
1083 mee_onoff ("Adjust XA pitch", 0, iXAPitch, 1),
1084 mee_onoff_h ("SPU IRQ Wait", 0, iSPUIRQWait, 1, h_spu_irq_wait),
1085 mee_onoff_h ("Sound in main thread", 0, iUseTimer, 2, h_spu_thread),
1089 static int menu_loop_plugin_spu(int id, int keys)
1092 me_loop(e_menu_plugin_spu, &sel, NULL);
1096 static const char h_bios[] = "HLE is simulated BIOS. BIOS selection is saved in savestates\n"
1097 "and can't be changed there. Must save config and reload\n"
1098 "the game for change to take effect";
1099 static const char h_plugin_xpu[] = "Must save config and reload the game\n"
1100 "for plugin change to take effect";
1101 static const char h_gpu[] = "Configure P.E.Op.S. SoftGL Driver V1.17";
1102 static const char h_spu[] = "Configure built-in P.E.Op.S. Sound Driver V1.7";
1104 static menu_entry e_menu_plugin_options[] =
1106 mee_enum_h ("BIOS", 0, bios_sel, bioses, h_bios),
1107 mee_enum_h ("GPU plugin", 0, gpu_plugsel, gpu_plugins, h_plugin_xpu),
1108 mee_enum_h ("SPU plugin", 0, spu_plugsel, spu_plugins, h_plugin_xpu),
1109 mee_handler_h ("Configure gpu_peops plugin", menu_loop_plugin_gpu, h_gpu),
1110 mee_handler_h ("Configure built-in SPU plugin", menu_loop_plugin_spu, h_spu),
1114 static menu_entry e_menu_main[];
1116 static int menu_loop_plugin_options(int id, int keys)
1119 me_loop(e_menu_plugin_options, &sel, NULL);
1121 // sync BIOS/plugins
1122 snprintf(Config.Bios, sizeof(Config.Bios), "%s", bioses[bios_sel]);
1123 snprintf(Config.Gpu, sizeof(Config.Gpu), "%s", gpu_plugins[gpu_plugsel]);
1124 snprintf(Config.Spu, sizeof(Config.Spu), "%s", spu_plugins[spu_plugsel]);
1125 me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0);
1130 // ------------ adv options menu ------------
1132 static const char h_cfg_cpul[] = "Shows CPU usage in %";
1133 static const char h_cfg_fl[] = "Frame Limiter keeps the game from running too fast";
1134 static const char h_cfg_xa[] = "Disables XA sound, which can sometimes improve performance";
1135 static const char h_cfg_cdda[] = "Disable CD Audio for a performance boost\n"
1136 "(proper .cue/.bin dump is needed otherwise)";
1137 static const char h_cfg_sio[] = "This should be enabled for certain memcards/gamepads";
1138 static const char h_cfg_spuirq[] = "Compatibility tweak; should probably be left off";
1139 static const char h_cfg_rcnt1[] = "Parasite Eve 2, Vandal Hearts 1/2 Fix";
1140 static const char h_cfg_rcnt2[] = "InuYasha Sengoku Battle Fix";
1141 static const char h_cfg_nodrc[] = "Disable dynamic recompiler and use interpreter\n"
1142 "Might be useful to overcome some dynarec bugs";
1144 static menu_entry e_menu_adv_options[] =
1146 mee_onoff_h ("Show CPU load", 0, g_opts, OPT_SHOWCPU, h_cfg_cpul),
1147 mee_onoff_h ("Disable Frame Limiter", 0, g_opts, OPT_NO_FRAMELIM, h_cfg_fl),
1148 mee_onoff_h ("Disable XA Decoding", 0, Config.Xa, 1, h_cfg_xa),
1149 mee_onoff_h ("Disable CD Audio", 0, Config.Cdda, 1, h_cfg_cdda),
1150 mee_onoff_h ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio),
1151 mee_onoff_h ("SPU IRQ Always Enabled", 0, Config.SpuIrq, 1, h_cfg_spuirq),
1152 mee_onoff_h ("Rootcounter hack", 0, Config.RCntFix, 1, h_cfg_rcnt1),
1153 mee_onoff_h ("Rootcounter hack 2", 0, Config.VSyncWA, 1, h_cfg_rcnt2),
1154 mee_onoff_h ("Disable dynarec (slow!)",0, Config.Cpu, 1, h_cfg_nodrc),
1158 static int menu_loop_adv_options(int id, int keys)
1161 me_loop(e_menu_adv_options, &sel, NULL);
1165 // ------------ options menu ------------
1167 static int mh_restore_defaults(int id, int keys)
1169 menu_set_defconfig();
1170 me_update_msg("defaults restored");
1174 static const char *men_region[] = { "Auto", "NTSC", "PAL", NULL };
1176 static const char *men_confirm_save[] = { "OFF", "writes", "loads", "both", NULL };
1177 static const char h_confirm_save[] = "Ask for confirmation when overwriting save,\n"
1178 "loading state or both";
1180 static const char h_restore_def[] = "Switches back to default / recommended\n"
1182 static const char h_frameskip[] = "Warning: frameskip sometimes causes glitches\n";
1184 static menu_entry e_menu_options[] =
1186 // mee_range ("Save slot", 0, state_slot, 0, 9),
1187 // mee_enum_h ("Confirm savestate", 0, dummy, men_confirm_save, h_confirm_save),
1188 mee_onoff_h ("Frameskip", 0, pl_rearmed_cbs.frameskip, 1, h_frameskip),
1189 mee_onoff ("Show FPS", 0, g_opts, OPT_SHOWFPS),
1190 mee_enum ("Region", 0, region, men_region),
1191 mee_range ("CPU clock", MA_OPT_CPU_CLOCKS, cpu_clock, 20, 5000),
1192 mee_handler ("[Display]", menu_loop_gfx_options),
1193 mee_handler ("[BIOS/Plugins]", menu_loop_plugin_options),
1194 mee_handler ("[Advanced]", menu_loop_adv_options),
1195 mee_cust_nosave("Save global config", MA_OPT_SAVECFG, mh_savecfg, mgn_saveloadcfg),
1196 mee_cust_nosave("Save cfg for loaded game",MA_OPT_SAVECFG_GAME, mh_savecfg, mgn_saveloadcfg),
1197 mee_handler_h ("Restore default config", mh_restore_defaults, h_restore_def),
1201 static int menu_loop_options(int id, int keys)
1206 i = me_id2offset(e_menu_options, MA_OPT_CPU_CLOCKS);
1207 e_menu_options[i].enabled = cpu_clock != 0 ? 1 : 0;
1208 me_enable(e_menu_options, MA_OPT_SAVECFG_GAME, ready_to_go && CdromId[0]);
1210 me_loop(e_menu_options, &sel, NULL);
1215 // ------------ debug menu ------------
1217 static void draw_frame_debug(GPUFreeze_t *gpuf)
1219 int w = min(g_menuscreen_w, 1024);
1220 int h = min(g_menuscreen_h, 512);
1221 u16 *d = g_menuscreen_ptr;
1222 u16 *s = (u16 *)gpuf->psxVRam;
1226 gpuf->ulFreezeVersion = 1;
1227 if (GPU_freeze != NULL)
1228 GPU_freeze(1, gpuf);
1230 for (; h > 0; h--, d += g_menuscreen_w, s += 1024)
1231 bgr555_to_rgb565(d, s, w * 2);
1233 smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
1234 snprintf(buff, sizeof(buff), "GPU sr: %08x", gpuf->ulStatus);
1235 smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
1236 snprintf(buff, sizeof(buff), "PC/SP: %08x %08x", psxRegs.pc, psxRegs.GPR.n.sp);
1237 smalltext_out16(4, (ty += me_sfont_h), buff, 0xe7fc);
1240 static void debug_menu_loop(void)
1245 gpuf = malloc(sizeof(*gpuf));
1252 draw_frame_debug(gpuf);
1255 inp = in_menu_wait(PBTN_MOK|PBTN_MBACK|PBTN_MA2|PBTN_MA3|PBTN_L|PBTN_R |
1256 PBTN_UP|PBTN_DOWN|PBTN_LEFT|PBTN_RIGHT, 70);
1257 if (inp & PBTN_MBACK)
1264 // ------------ main menu ------------
1266 static void menu_bios_warn(void)
1269 static const char msg[] =
1270 "You don't seem to have copied any BIOS files to\n"
1271 "<SD card>/pandora/appdata/pcsx_rearmed/bios/\n\n"
1272 "While many games work fine with fake (HLE) BIOS,\n"
1273 "others (like MGS and FF8) require BIOS to work.\n"
1274 "After copying the file, you'll also need to\n"
1275 "select it in the emu's options->[BIOS/Plugins]\n\n"
1276 "The file is usually named SCPH1001.BIN, but\n"
1277 "other not compressed files can be used too.\n\n"
1278 "Press (B) or (X) to continue";
1282 draw_menu_message(msg, NULL);
1284 inp = in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
1285 if (inp & (PBTN_MBACK|PBTN_MOK))
1290 // ------------ main menu ------------
1294 static void draw_frame_main(void)
1296 if (CdromId[0] != 0) {
1298 snprintf(buff, sizeof(buff), "%.32s/%.9s (running as %s, with %s)",
1299 get_cd_label(), CdromId, Config.PsxType ? "PAL" : "NTSC",
1300 Config.HLE ? "HLE" : "BIOS");
1301 smalltext_out16(4, 1, buff, 0x105f);
1305 static void draw_frame_credits(void)
1307 smalltext_out16(4, 1, "build: "__DATE__ " " __TIME__ " " REV, 0xe7fc);
1310 static const char credits_text[] =
1312 "(C) 1999-2003 PCSX Team\n"
1313 "(C) 2005-2009 PCSX-df Team\n"
1314 "(C) 2009-2011 PCSX-Reloaded Team\n\n"
1315 "GPU and SPU code by Pete Bernert\n"
1316 " and the P.E.Op.S. team\n"
1317 "ARM recompiler (C) 2009-2011 Ari64\n"
1318 "PCSX4ALL plugins by PCSX4ALL team\n"
1319 " Chui, Franxis, Unai\n\n"
1320 "integration, optimization and\n"
1321 " frontend (C) 2010-2011 notaz\n";
1323 static int reset_game(void)
1326 if (bios_sel == 0 && !Config.HLE)
1332 if (CheckCdrom() != -1) {
1338 static int run_bios(void)
1344 pl_fbdev_buf = NULL;
1349 pcnt_hook_plugins();
1351 if (OpenPlugins() == -1) {
1352 me_update_msg("failed to open plugins");
1355 plugin_call_rearmed_cbs();
1358 CdromLabel[0] = '\0';
1366 static int run_cd_image(const char *fname)
1369 pl_fbdev_buf = NULL;
1372 set_cd_image(fname);
1374 pcnt_hook_plugins();
1376 if (OpenPlugins() == -1) {
1377 me_update_msg("failed to open plugins");
1380 plugin_call_rearmed_cbs();
1382 if (CheckCdrom() == -1) {
1383 // Only check the CD if we are starting the console with a CD
1385 me_update_msg("unsupported/invalid CD image");
1391 // Read main executable directly from CDRom and start it
1392 if (LoadCdrom() == -1) {
1394 me_update_msg("failed to load CD image");
1402 static int romsel_run(void)
1404 int prev_gpu, prev_spu;
1407 fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname));
1411 printf("selected file: %s\n", fname);
1413 new_dynarec_clear_full();
1415 if (run_cd_image(fname) != 0)
1418 prev_gpu = gpu_plugsel;
1419 prev_spu = spu_plugsel;
1420 if (menu_load_config(1) != 0)
1421 menu_load_config(0);
1423 // check for plugin changes, have to repeat
1424 // loading if game config changed plugins to reload them
1425 if (prev_gpu != gpu_plugsel || prev_spu != spu_plugsel) {
1426 printf("plugin change detected, reloading plugins..\n");
1427 if (run_cd_image(fname) != 0)
1431 strcpy(last_selected_fname, rom_fname_reload);
1435 static int swap_cd_image(void)
1439 fname = menu_loop_romsel(last_selected_fname, sizeof(last_selected_fname));
1443 printf("selected file: %s\n", fname);
1446 CdromLabel[0] = '\0';
1448 set_cd_image(fname);
1449 if (ReloadCdromPlugin() < 0) {
1450 me_update_msg("failed to load cdr plugin");
1453 if (CDR_open() < 0) {
1454 me_update_msg("failed to open cdr plugin");
1458 SetCdOpenCaseTime(time(NULL) + 2);
1461 strcpy(last_selected_fname, rom_fname_reload);
1465 static int main_menu_handler(int id, int keys)
1469 case MA_MAIN_RESUME_GAME:
1473 case MA_MAIN_SAVE_STATE:
1475 return menu_loop_savestate(0);
1477 case MA_MAIN_LOAD_STATE:
1479 return menu_loop_savestate(1);
1481 case MA_MAIN_RESET_GAME:
1482 if (ready_to_go && reset_game() == 0)
1485 case MA_MAIN_LOAD_ROM:
1486 if (romsel_run() == 0)
1489 case MA_MAIN_SWAP_CD:
1490 if (swap_cd_image() == 0)
1493 case MA_MAIN_RUN_BIOS:
1494 if (run_bios() == 0)
1497 case MA_MAIN_CREDITS:
1498 draw_menu_message(credits_text, draw_frame_credits);
1499 in_menu_wait(PBTN_MOK|PBTN_MBACK, 70);
1505 lprintf("%s: something unknown selected\n", __FUNCTION__);
1512 static menu_entry e_menu_main[] =
1516 mee_handler_id("Resume game", MA_MAIN_RESUME_GAME, main_menu_handler),
1517 mee_handler_id("Save State", MA_MAIN_SAVE_STATE, main_menu_handler),
1518 mee_handler_id("Load State", MA_MAIN_LOAD_STATE, main_menu_handler),
1519 mee_handler_id("Reset game", MA_MAIN_RESET_GAME, main_menu_handler),
1520 mee_handler_id("Load CD image", MA_MAIN_LOAD_ROM, main_menu_handler),
1521 mee_handler_id("Change CD image", MA_MAIN_SWAP_CD, main_menu_handler),
1522 mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler),
1523 mee_handler ("Options", menu_loop_options),
1524 mee_handler ("Controls", menu_loop_keyconfig),
1525 mee_handler_id("Credits", MA_MAIN_CREDITS, main_menu_handler),
1526 mee_handler_id("Exit", MA_MAIN_EXIT, main_menu_handler),
1530 // ----------------------------
1532 static void menu_leave_emu(void);
1534 void menu_loop(void)
1540 if (bioses[1] == NULL && !warned_about_bios) {
1542 warned_about_bios = 1;
1545 me_enable(e_menu_main, MA_MAIN_RESUME_GAME, ready_to_go);
1546 me_enable(e_menu_main, MA_MAIN_SAVE_STATE, ready_to_go && CdromId[0]);
1547 me_enable(e_menu_main, MA_MAIN_LOAD_STATE, ready_to_go && CdromId[0]);
1548 me_enable(e_menu_main, MA_MAIN_RESET_GAME, ready_to_go);
1549 me_enable(e_menu_main, MA_MAIN_SWAP_CD, ready_to_go);
1550 me_enable(e_menu_main, MA_MAIN_RUN_BIOS, bios_sel != 0);
1552 in_set_config_int(0, IN_CFG_BLOCKING, 1);
1555 me_loop(e_menu_main, &sel, draw_frame_main);
1556 } while (!ready_to_go);
1558 /* wait until menu, ok, back is released */
1559 while (in_menu_wait_any(50) & (PBTN_MENU|PBTN_MOK|PBTN_MBACK))
1562 in_set_config_int(0, IN_CFG_BLOCKING, 0);
1567 static void scan_bios_plugins(void)
1569 char fname[MAXPATHLEN];
1571 int bios_i, gpu_i, spu_i;
1576 gpu_plugins[0] = "builtin_gpu";
1577 spu_plugins[0] = "builtin_spu";
1578 bios_i = gpu_i = spu_i = 1;
1580 snprintf(fname, sizeof(fname), "%s/", Config.BiosDir);
1581 dir = opendir(fname);
1583 perror("scan_bios_plugins bios opendir");
1598 if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
1601 snprintf(fname, sizeof(fname), "%s/%s", Config.BiosDir, ent->d_name);
1602 if (stat(fname, &st) != 0 || st.st_size != 512*1024) {
1603 printf("bad BIOS file: %s\n", ent->d_name);
1607 if (bios_i < ARRAY_SIZE(bioses) - 1) {
1608 bioses[bios_i++] = strdup(ent->d_name);
1612 printf("too many BIOSes, dropping \"%s\"\n", ent->d_name);
1618 snprintf(fname, sizeof(fname), "%s/", Config.PluginsDir);
1619 dir = opendir(fname);
1621 perror("scan_bios_plugins opendir");
1635 p = strstr(ent->d_name, ".so");
1639 snprintf(fname, sizeof(fname), "%s/%s", Config.PluginsDir, ent->d_name);
1640 h = dlopen(fname, RTLD_LAZY | RTLD_LOCAL);
1642 fprintf(stderr, "%s\n", dlerror());
1646 // now what do we have here?
1647 tmp = dlsym(h, "GPUinit");
1650 if (gpu_i < ARRAY_SIZE(gpu_plugins) - 1)
1651 gpu_plugins[gpu_i++] = strdup(ent->d_name);
1655 tmp = dlsym(h, "SPUinit");
1658 if (spu_i < ARRAY_SIZE(spu_plugins) - 1)
1659 spu_plugins[spu_i++] = strdup(ent->d_name);
1663 fprintf(stderr, "ignoring unidentified plugin: %s\n", fname);
1670 void menu_init(void)
1672 char buff[MAXPATHLEN];
1674 strcpy(last_selected_fname, "/media");
1676 scan_bios_plugins();
1680 menu_set_defconfig();
1681 menu_load_config(0);
1686 g_menubg_src_ptr = calloc(g_menuscreen_w * g_menuscreen_h * 2, 1);
1687 if (g_menubg_src_ptr == NULL)
1689 emu_make_path(buff, "skin/background.png", sizeof(buff));
1690 readpng(g_menubg_src_ptr, buff, READPNG_BG, g_menuscreen_w, g_menuscreen_h);
1693 void menu_notify_mode_change(int w, int h, int bpp)
1699 if (scaling == SCALE_1_1) {
1700 g_layer_x = 800/2 - w/2; g_layer_y = 480/2 - h/2;
1701 g_layer_w = w; g_layer_h = h;
1705 static void menu_leave_emu(void)
1707 if (GPU_close != NULL) {
1708 int ret = GPU_close();
1710 fprintf(stderr, "Warning: GPU_close returned %d\n", ret);
1713 memcpy(g_menubg_ptr, g_menubg_src_ptr, g_menuscreen_w * g_menuscreen_h * 2);
1714 if (pl_fbdev_buf != NULL && ready_to_go && last_psx_bpp == 16) {
1715 int x = max(0, g_menuscreen_w - last_psx_w);
1716 int y = max(0, g_menuscreen_h / 2 - last_psx_h / 2);
1717 int w = min(g_menuscreen_w, last_psx_w);
1718 int h = min(g_menuscreen_h, last_psx_h);
1719 u16 *d = (u16 *)g_menubg_ptr + g_menuscreen_w * y + x;
1720 u16 *s = pl_fbdev_buf;
1722 for (; h > 0; h--, d += g_menuscreen_w, s += last_psx_w)
1723 menu_darken_bg(d, s, w, 0);
1727 cpu_clock = get_cpu_clock();
1729 plat_video_menu_enter(ready_to_go);
1732 void menu_prepare_emu(void)
1734 R3000Acpu *prev_cpu = psxCpu;
1736 plat_video_menu_leave();
1740 menu_notify_mode_change(last_psx_w, last_psx_h, last_psx_bpp);
1743 g_layer_x = 80; g_layer_y = 0;
1744 g_layer_w = 640; g_layer_h = 480;
1746 case SCALE_FULLSCREEN:
1747 g_layer_x = 0; g_layer_y = 0;
1748 g_layer_w = 800; g_layer_h = 480;
1754 psxCpu = (Config.Cpu == CPU_INTERPRETER) ? &psxInt : &psxRec;
1755 if (psxCpu != prev_cpu)
1756 // note that this does not really reset, just clears drc caches
1759 // core doesn't care about Config.Cdda changes,
1760 // so handle them manually here
1765 apply_lcdrate(Config.PsxType);
1766 apply_filter(filter);
1769 // push config to GPU plugin
1770 plugin_call_rearmed_cbs();
1772 if (GPU_open != NULL) {
1773 int ret = GPU_open(&gpuDisp, "PCSX", NULL);
1775 fprintf(stderr, "Warning: GPU_open returned %d\n", ret);
1778 dfinput_activate(in_type == PSE_PAD_TYPE_ANALOGPAD);
1781 void me_update_msg(const char *msg)
1783 strncpy(menu_error_msg, msg, sizeof(menu_error_msg));
1784 menu_error_msg[sizeof(menu_error_msg) - 1] = 0;
1786 menu_error_time = plat_get_ticks_ms();
1787 lprintf("msg: %s\n", menu_error_msg);