aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornotaz2011-10-26 02:38:58 +0300
committernotaz2011-10-30 23:48:08 +0200
commit4f55097de04a34ddcc83647f3b1f69570d7f1e36 (patch)
tree05c2c582df2d57a2e309090b2315b9c97c9852a5
parent48e74ef5e10804f8809fae397be4234e8bf613a7 (diff)
downloadpcsx_rearmed-4f55097de04a34ddcc83647f3b1f69570d7f1e36.tar.gz
pcsx_rearmed-4f55097de04a34ddcc83647f3b1f69570d7f1e36.tar.bz2
pcsx_rearmed-4f55097de04a34ddcc83647f3b1f69570d7f1e36.zip
psxcounters: use higher precision for vsync timing
don't know why this is needed (having things like BIAS in mind), maybe desyncs with cdrom code or SPU? Tuned this on RE1.
-rw-r--r--libpcsxcore/psxcounters.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/libpcsxcore/psxcounters.c b/libpcsxcore/psxcounters.c
index 3f6e139..177ccb7 100644
--- a/libpcsxcore/psxcounters.c
+++ b/libpcsxcore/psxcounters.c
@@ -74,6 +74,7 @@ static u32 hSyncCount = 0;
static u32 spuSyncCount = 0;
static u32 hsync_steps = 0;
static u32 gpu_wants_hcnt = 0;
+static u32 base_cycle = 0;
u32 psxNextCounter = 0, psxNextsCounter = 0;
@@ -322,7 +323,14 @@ void psxRcntUpdate()
hsync_steps = 1;
rcnts[3].cycleStart = cycle - leftover_cycles;
- rcnts[3].cycle = hsync_steps * rcnts[3].target;
+ if (Config.PsxType)
+ // 20.12 precision, clk / 50 / 313 ~= 2164.14
+ base_cycle += hsync_steps * 8864320;
+ else
+ // clk / 60 / 263 ~= 2146.31
+ base_cycle += hsync_steps * 8791293;
+ rcnts[3].cycle = base_cycle >> 12;
+ base_cycle &= 0xfff;
psxRcntSet();
}
@@ -494,6 +502,8 @@ s32 psxRcntFreeze( gzFile f, s32 Mode )
if (Mode == 0)
hsync_steps = (psxRegs.cycle - rcnts[3].cycleStart) / rcnts[3].target;
+ base_cycle = 0;
+
return 0;
}