aboutsummaryrefslogtreecommitdiff
path: root/libpcsxcore/psxcounters.c
diff options
context:
space:
mode:
authornotaz2011-10-26 02:38:58 +0300
committernotaz2011-10-30 23:48:08 +0200
commit4f55097de04a34ddcc83647f3b1f69570d7f1e36 (patch)
tree05c2c582df2d57a2e309090b2315b9c97c9852a5 /libpcsxcore/psxcounters.c
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.
Diffstat (limited to 'libpcsxcore/psxcounters.c')
-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;
}