aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-06-27 18:51:27 +0300
committernotaz2011-07-08 00:15:08 +0300
commit4feed8d3c6c867a45cae54fa7399041c3b5dd2c1 (patch)
tree65b2ff4b9db1286c3f91b6b1f5758bf736cab4d9
parent9f21ebfe5570056501063c4165a0debf880f534f (diff)
downloadpcsx_rearmed-4feed8d3c6c867a45cae54fa7399041c3b5dd2c1.tar.gz
pcsx_rearmed-4feed8d3c6c867a45cae54fa7399041c3b5dd2c1.tar.bz2
pcsx_rearmed-4feed8d3c6c867a45cae54fa7399041c3b5dd2c1.zip
cdrom: make read reschedule optional
Some really nasty timing issues, I guess can only be resolved for good when general timing is good and BIAS is gone.
-rw-r--r--frontend/common/menu.c10
-rw-r--r--frontend/menu.c16
-rw-r--r--libpcsxcore/cdrom.c7
-rw-r--r--libpcsxcore/psxcommon.h1
4 files changed, 22 insertions, 12 deletions
diff --git a/frontend/common/menu.c b/frontend/common/menu.c
index 96e1bd3..7890df4 100644
--- a/frontend/common/menu.c
+++ b/frontend/common/menu.c
@@ -560,11 +560,11 @@ static int me_process(menu_entry *entry, int is_next, int is_lr)
names = (const char **)entry->data;
for (c = 0; names[c] != NULL; c++)
;
- *(int *)entry->var += is_next ? 1 : -1;
- if (*(int *)entry->var < 0)
- *(int *)entry->var = 0;
- if (*(int *)entry->var >= c)
- *(int *)entry->var = c - 1;
+ *(signed char *)entry->var += is_next ? 1 : -1;
+ if (*(signed char *)entry->var < 0)
+ *(signed char *)entry->var = 0;
+ if (*(signed char *)entry->var >= c)
+ *(signed char *)entry->var = c - 1;
return 1;
default:
return 0;
diff --git a/frontend/menu.c b/frontend/menu.c
index 5c3824b..e8dc79d 100644
--- a/frontend/menu.c
+++ b/frontend/menu.c
@@ -162,6 +162,7 @@ static void menu_set_defconfig(void)
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.frameskip = 0;
pl_rearmed_cbs.gpu_peops.iUseDither = 0;
@@ -214,6 +215,7 @@ static const struct {
CE_CONFIG_VAL(RCntFix),
CE_CONFIG_VAL(VSyncWA),
CE_CONFIG_VAL(Cpu),
+ CE_CONFIG_VAL(CdrReschedule),
CE_INTVAL(region),
CE_INTVAL(scaling),
CE_INTVAL(g_layer_x),
@@ -1136,15 +1138,20 @@ static int menu_loop_plugin_options(int id, int keys)
// ------------ adv options menu ------------
+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_fl[] = "Frame Limiter keeps the game from running too fast";
static const char h_cfg_xa[] = "Disables XA sound, which can sometimes improve performance";
static const char h_cfg_cdda[] = "Disable CD Audio for a performance boost\n"
"(proper .cue/.bin dump is needed otherwise)";
-static const char h_cfg_sio[] = "This should be enabled for certain memcards/gamepads";
-static const char h_cfg_spuirq[] = "Compatibility tweak; should probably be left off";
-static const char h_cfg_rcnt1[] = "Parasite Eve 2, Vandal Hearts 1/2 Fix";
-static const char h_cfg_rcnt2[] = "InuYasha Sengoku Battle Fix";
+static const char h_cfg_sio[] = "You should not need this, breaks games";
+static const char h_cfg_spuirq[] = "Compatibility tweak; should be left off";
+static const char h_cfg_rcnt1[] = "Parasite Eve 2, Vandal Hearts 1/2 Fix\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_nodrc[] = "Disable dynamic recompiler and use interpreter\n"
"Might be useful to overcome some dynarec bugs";
@@ -1158,6 +1165,7 @@ static menu_entry e_menu_adv_options[] =
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 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_end,
};
diff --git a/libpcsxcore/cdrom.c b/libpcsxcore/cdrom.c
index 87a7c19..33b76fa 100644
--- a/libpcsxcore/cdrom.c
+++ b/libpcsxcore/cdrom.c
@@ -1905,9 +1905,10 @@ void cdrWrite3(unsigned char rt) {
if (cdr.Reading && !cdr.ResultReady) {
int left = psxRegs.intCycle[PSXINT_CDREAD].sCycle + psxRegs.intCycle[PSXINT_CDREAD].cycle - psxRegs.cycle;
int time = (cdr.Mode & MODE_SPEED) ? (cdReadTime / 2) : cdReadTime;
- if (left < time / 2) { // rearmed guesswork hack
- //printf("-- resched %d -> %d\n", left, time / 2);
- CDREAD_INT(time / 2);
+ if (Config.CdrReschedule != 2)
+ if (left < time / 2 || Config.CdrReschedule) { // rearmed guesswork hack
+ //printf("-- resched %d -> %d\n", left, time);
+ CDREAD_INT(time);
}
}
diff --git a/libpcsxcore/psxcommon.h b/libpcsxcore/psxcommon.h
index 500c44a..9f12e3b 100644
--- a/libpcsxcore/psxcommon.h
+++ b/libpcsxcore/psxcommon.h
@@ -127,6 +127,7 @@ typedef struct {
boolean RCntFix;
boolean UseNet;
boolean VSyncWA;
+ boolean CdrReschedule;
u8 Cpu; // CPU_DYNAREC or CPU_INTERPRETER
u8 PsxType; // PSX_TYPE_NTSC or PSX_TYPE_PAL
#ifdef _WIN32