#include "linux/in_evdev.h"
#include "../libpcsxcore/misc.h"
#include "../libpcsxcore/cdrom.h"
+#include "../libpcsxcore/cdriso.h"
#include "../libpcsxcore/psemu_plugin_defs.h"
#include "../libpcsxcore/new_dynarec/new_dynarec.h"
#include "../plugins/dfinput/main.h"
MA_MAIN_RESET_GAME,
MA_MAIN_LOAD_ROM,
MA_MAIN_SWAP_CD,
+ MA_MAIN_SWAP_CD_MULTI,
MA_MAIN_RUN_BIOS,
MA_MAIN_RUN_EXE,
MA_MAIN_CONTROLS,
static char rom_fname_reload[MAXPATHLEN];
static char last_selected_fname[MAXPATHLEN];
static int warned_about_bios, region, in_type_sel1, in_type_sel2;
+static int psx_clock;
static int memcard1_sel, memcard2_sel;
-int g_opts, analog_deadzone;
+int g_opts;
+int analog_deadzone; // for Caanoo
+
+#ifdef __ARM_ARCH_7A__
+#define DEFAULT_PSX_CLOCK 57
+#define DEFAULT_PSX_CLOCK_S "57"
+#else
+#define DEFAULT_PSX_CLOCK 50
+#define DEFAULT_PSX_CLOCK_S "50"
+#endif
// sound plugin
extern int iUseReverb;
Config.PsxAuto = 0;
Config.PsxType = region - 1;
}
+ cycle_multiplier = 10000 / psx_clock;
+
switch (in_type_sel1) {
case 1: in_type1 = PSE_PAD_TYPE_ANALOGPAD; break;
case 2: in_type1 = PSE_PAD_TYPE_GUNCON; break;
default: in_type2 = PSE_PAD_TYPE_STANDARD;
}
if (in_evdev_allow_abs_only != allow_abs_only_old) {
- plat_rescan_inputs();
+ in_probe();
allow_abs_only_old = in_evdev_allow_abs_only;
}
static void menu_set_defconfig(void)
{
+ emu_set_default_config();
+
g_opts = 0;
scaling = SCALE_4_3;
volume_boost = 0;
frameskip = 0;
- analog_deadzone = 70;
+ analog_deadzone = 50;
+ psx_clock = DEFAULT_PSX_CLOCK;
region = 0;
in_type_sel1 = in_type_sel2 = 0;
in_evdev_allow_abs_only = 0;
- Config.Xa = Config.Cdda = Config.Sio =
- Config.SpuIrq = Config.RCntFix = Config.VSyncWA = 0;
- Config.CdrReschedule = 0;
-
- pl_rearmed_cbs.gpu_peops.iUseDither = 0;
- pl_rearmed_cbs.gpu_peops.dwActFixes = 1<<7;
- pl_rearmed_cbs.gpu_unai.abe_hack =
- pl_rearmed_cbs.gpu_unai.no_light =
- pl_rearmed_cbs.gpu_unai.no_blend = 0;
-
- iUseReverb = 2;
- iUseInterpolation = 1;
- iXAPitch = 0;
- iSPUIRQWait = 1;
- iUseTimer = 2;
menu_sync_config();
}
CE_INTVAL(warned_about_bios),
CE_INTVAL(in_evdev_allow_abs_only),
CE_INTVAL(volume_boost),
+ CE_INTVAL(psx_clock),
+ CE_INTVAL(new_dynarec_hacks),
};
static char *get_cd_label(void)
f = fopen(cfgfile, "r");
if (f == NULL) {
printf("menu_load_config: failed to open: %s\n", cfgfile);
- return -1;
+ goto fail;
}
fseek(f, 0, SEEK_END);
}
}
+ keys_load_all(cfg);
+ ret = 0;
+fail_read:
+ free(cfg);
+fail:
+ if (f != NULL)
+ fclose(f);
+
menu_sync_config();
// sync plugins
if (strcmp(Config.Spu, spu_plugins[i]) == 0)
{ spu_plugsel = i; break; }
- keys_load_all(cfg);
- ret = 0;
-fail_read:
- free(cfg);
-fail:
- fclose(f);
return ret;
}
// rrrr rggg gggb bbbb
static unsigned short fname2color(const char *fname)
{
- static const char *cdimg_exts[] = { ".bin", ".img", ".mdf", ".iso", ".cue", ".z", ".bz", ".znx", ".pbp" };
- static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub", ".table", ".index", ".sbi" };
+ static const char *cdimg_exts[] = { ".bin", ".img", ".mdf", ".iso", ".cue", ".z",
+ ".bz", ".znx", ".pbp", ".cbn" };
+ static const char *other_exts[] = { ".ccd", ".toc", ".mds", ".sub",
+ ".table", ".index", ".sbi" };
const char *ext = strrchr(fname, '.');
int i;
{ "Gun A button ", 1 << SACTION_GUN_A },
{ "Gun B button ", 1 << SACTION_GUN_B },
{ "Gun Offscreen Trigger", 1 << SACTION_GUN_TRIGGER2 },
+#ifndef __ARM_ARCH_7A__ /* XXX */
+ { "Volume Up ", 1 << SACTION_VOLUME_UP },
+ { "Volume Down ", 1 << SACTION_VOLUME_DOWN },
+#endif
{ NULL, 0 }
};
}
kbinds = binds[IN_BIND_OFFS(k, IN_BINDTYPE_EMU)];
- for (i = 0; kbinds && i < ARRAY_SIZE(emuctrl_actions) - 1; i++) {
+ for (i = 0; kbinds && emuctrl_actions[i].name != NULL; i++) {
mask = emuctrl_actions[i].mask;
if (mask & kbinds) {
strncpy(act, emuctrl_actions[i].name, 31);
static int mh_input_rescan(int id, int keys)
{
//menu_sync_config();
- plat_rescan_inputs();
+ in_probe();
me_update_msg("rescan complete.");
return 0;
// ------------ adv options menu ------------
+static const char h_cfg_psxclk[] = "Over/under-clock the PSX, default is " DEFAULT_PSX_CLOCK_S "\n";
+static const char h_cfg_nosmc[] = "Will cause crashes when loading, break memcards";
+static const char h_cfg_gteunn[] = "May cause graphical glitches";
+static const char h_cfg_gteflgs[] = "Will cause graphical glitches";
+
+static menu_entry e_menu_speed_hacks[] =
+{
+ mee_range_h ("PSX CPU clock, %%", 0, psx_clock, 1, 500, h_cfg_psxclk),
+ mee_onoff_h ("Disable SMC checks", 0, new_dynarec_hacks, NDHACK_NO_SMC_CHECK, h_cfg_nosmc),
+ mee_onoff_h ("Assume GTE regs unneeded", 0, new_dynarec_hacks, NDHACK_GTE_UNNEEDED, h_cfg_gteunn),
+ mee_onoff_h ("Disable GTE flags", 0, new_dynarec_hacks, NDHACK_GTE_NO_FLAGS, h_cfg_gteflgs),
+ mee_end,
+};
+
+static int menu_loop_speed_hacks(int id, int keys)
+{
+ static int sel = 0;
+ me_loop(e_menu_speed_hacks, &sel);
+ return 0;
+}
+
static const char *men_cfg_cdrr[] = { "Auto", "ON", "OFF", NULL };
static const char h_cfg_cpul[] = "Shows CPU usage in %";
static const char h_cfg_spu[] = "Shows active SPU channels\n"
"(timing hack, breaks other games)";
static const char h_cfg_rcnt2[] = "InuYasha Sengoku Battle Fix\n"
"(timing hack, breaks other games)";
-static const char h_cfg_cdrr[] = "Compatibility tweak (fixes Team Buddies, maybe more)\n"
- "(CD timing hack, breaks FMVs)";
+static const char h_cfg_cdrr[] = "Compatibility tweak (CD timing hack, breaks FMVs)";
static const char h_cfg_nodrc[] = "Disable dynamic recompiler and use interpreter\n"
"Might be useful to overcome some dynarec bugs";
+static const char h_cfg_shacks[] = "Breaks games but may give better performance\n"
+ "must reload game for any change to take effect";
static menu_entry e_menu_adv_options[] =
{
mee_onoff_h ("Disable CD Audio", 0, Config.Cdda, 1, h_cfg_cdda),
mee_onoff_h ("SIO IRQ Always Enabled", 0, Config.Sio, 1, h_cfg_sio),
mee_onoff_h ("SPU IRQ Always Enabled", 0, Config.SpuIrq, 1, h_cfg_spuirq),
- mee_onoff_h ("Rootcounter hack", 0, Config.RCntFix, 1, h_cfg_rcnt1),
+ //mee_onoff_h ("Rootcounter hack", 0, Config.RCntFix, 1, h_cfg_rcnt1),
mee_onoff_h ("Rootcounter hack 2", 0, Config.VSyncWA, 1, h_cfg_rcnt2),
mee_enum_h ("CD read reschedule hack",0, Config.CdrReschedule, men_cfg_cdrr, h_cfg_cdrr),
mee_onoff_h ("Disable dynarec (slow!)",0, Config.Cpu, 1, h_cfg_nodrc),
+ mee_handler_h ("[Speed hacks]", menu_loop_speed_hacks, h_cfg_shacks),
mee_end,
};
{
int inp;
static const char msg[] =
- "You don't seem to have copied any BIOS files to\n"
+ "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"
- "While many games work fine with fake (HLE) BIOS,\n"
- "others (like MGS and FF8) require BIOS to work.\n"
- "After copying the file, you'll also need to\n"
- "select it in the emu's options->[BIOS/Plugins]\n\n"
- "The file is usually named SCPH1001.BIN, but\n"
- "other not compressed files can be used too.\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 (B) or (X) to continue";
while (1)
}
plugin_call_rearmed_cbs();
+ cdrIsoMultidiskCount = 1;
CdromId[0] = '\0';
CdromLabel[0] = '\0';
}
ready_to_go = 1;
+ snprintf(hud_msg, sizeof(hud_msg), "Booting up...");
+ hud_new_msg = 2;
return 0;
}
return -1;
}
+ if (Config.HLE)
+ printf("note: running without BIOS, expect compatibility problems\n");
+
strcpy(last_selected_fname, rom_fname_reload);
return 0;
}
return 0;
}
+static int swap_cd_multidisk(void)
+{
+ cdrIsoMultidiskSelect++;
+ CdromId[0] = '\0';
+ CdromLabel[0] = '\0';
+
+ CDR_close();
+ if (CDR_open() < 0) {
+ me_update_msg("failed to open cdr plugin");
+ return -1;
+ }
+
+ SetCdOpenCaseTime(time(NULL) + 2);
+ LidInterrupt();
+
+ return 0;
+}
+
static int main_menu_handler(int id, int keys)
{
switch (id)
if (swap_cd_image() == 0)
return 1;
break;
+ case MA_MAIN_SWAP_CD_MULTI:
+ if (swap_cd_multidisk() == 0)
+ return 1;
+ break;
case MA_MAIN_RUN_BIOS:
if (run_bios() == 0)
return 1;
static menu_entry e_menu_main2[] =
{
- mee_handler_id("Change CD image", MA_MAIN_SWAP_CD, main_menu_handler),
- mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler),
- mee_handler_id("Run EXE", MA_MAIN_RUN_EXE, main_menu_handler),
+ mee_handler_id("Change CD image", MA_MAIN_SWAP_CD, main_menu_handler),
+ mee_handler_id("Next multidisk CD", MA_MAIN_SWAP_CD_MULTI, main_menu_handler),
+ mee_handler_id("Run BIOS", MA_MAIN_RUN_BIOS, main_menu_handler),
+ mee_handler_id("Run EXE", MA_MAIN_RUN_EXE, main_menu_handler),
mee_handler ("Memcard manager", menu_loop_memcards),
mee_end,
};
static int sel = 0;
me_enable(e_menu_main2, MA_MAIN_SWAP_CD, ready_to_go);
+ me_enable(e_menu_main2, MA_MAIN_SWAP_CD_MULTI, ready_to_go && cdrIsoMultidiskCount > 1);
me_enable(e_menu_main2, MA_MAIN_RUN_BIOS, bios_sel != 0);
return me_loop_d(e_menu_main2, &sel, NULL, draw_frame_main);
g_layer_w = w; g_layer_h = h;
break;
- case SCALE_4_3:
- mult = 240.0f / (float)h * 4.0f / 3.0f;
- if (h > 256)
- mult *= 2.0f;
- g_layer_w = mult * (float)g_menuscreen_h;
- g_layer_h = g_menuscreen_h;
- printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult);
- break;
-
case SCALE_4_3v2:
+ if (h > g_menuscreen_h || (240 < h && h <= 360))
+ goto fractional_4_3;
+
// 4:3 that prefers integer scaling
imult = g_menuscreen_h / h;
g_layer_w = w * imult;
printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult);
break;
+ fractional_4_3:
+ case SCALE_4_3:
+ mult = 240.0f / (float)h * 4.0f / 3.0f;
+ if (h > 256)
+ mult *= 2.0f;
+ g_layer_w = mult * (float)g_menuscreen_h;
+ g_layer_h = g_menuscreen_h;
+ printf(" -> %dx%d %.1f\n", g_layer_w, g_layer_h, mult);
+ break;
+
case SCALE_FULLSCREEN:
g_layer_w = g_menuscreen_w;
g_layer_h = g_menuscreen_h;