From 4feed8d3c6c867a45cae54fa7399041c3b5dd2c1 Mon Sep 17 00:00:00 2001 From: notaz Date: Mon, 27 Jun 2011 18:51:27 +0300 Subject: [PATCH] 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. --- frontend/common/menu.c | 10 +++++----- frontend/menu.c | 16 ++++++++++++---- libpcsxcore/cdrom.c | 7 ++++--- libpcsxcore/psxcommon.h | 1 + 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/frontend/common/menu.c b/frontend/common/menu.c index 96e1bd3b..7890df4b 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 5c3824b8..e8dc79dc 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 87a7c198..33b76fab 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 500c44ad..9f12e3bb 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 -- 2.39.2