From a37e3f092fd84658c67ec537590dd5f4710ee174 Mon Sep 17 00:00:00 2001 From: "SND\\ckain_cp" Date: Thu, 14 Nov 2013 15:33:16 +0000 Subject: peopsgl/xvideo: fixed interlace/frame bit31 toggling. Now X-Men Academies are fine. Obsoletes use of odd/even hack. git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@87829 e17a0e51-4ae3-4d35-97c3-1a29b211df97 --- plugins/peopsxgl/gpu.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'plugins/peopsxgl/gpu.c') diff --git a/plugins/peopsxgl/gpu.c b/plugins/peopsxgl/gpu.c index 1bf52937..5d59782c 100755 --- a/plugins/peopsxgl/gpu.c +++ b/plugins/peopsxgl/gpu.c @@ -181,6 +181,7 @@ int iFakePrimBusy = 0; int iRumbleVal = 0; int iRumbleTime = 0; uint32_t vBlank=0; +BOOL oddLines; //////////////////////////////////////////////////////////////////////// // stuff to make this a true PDK module @@ -578,6 +579,7 @@ long CALLBACK GPUinit() // device initialised already ! //lGPUstatusRet = 0x74000000; vBlank = 0; + oddLines = FALSE; STATUSREG = 0x14802000; GPUIsIdle; @@ -2021,8 +2023,8 @@ static unsigned short usFirstPos=2; void CALLBACK GPUupdateLace(void) { - //if(!(dwActFixes&0x1000)) - // STATUSREG^=0x80000000; // interlaced bit toggle, if the CC game fix is not active (see gpuReadStatus) + if(!(dwActFixes&0x1000)) + STATUSREG^=0x80000000; // interlaced bit toggle, if the CC game fix is not active (see gpuReadStatus) if(!(dwActFixes&128)) // normal frame limit func CheckFrameRate(); @@ -2034,7 +2036,7 @@ void CALLBACK GPUupdateLace(void) if(PSXDisplay.Interlaced) // interlaced mode? { - STATUSREG^=0x80000000; + //STATUSREG^=0x80000000; if(PSXDisplay.DisplayMode.x>0 && PSXDisplay.DisplayMode.y>0) { updateDisplay(); // -> swap buffers (new frame) @@ -2059,7 +2061,16 @@ void CALLBACK GPUupdateLace(void) //////////////////////////////////////////////////////////////////////// uint32_t CALLBACK GPUreadStatus(void) -{ +{ + if (vBlank || oddLines == FALSE) + { // vblank or even lines + STATUSREG &= ~(0x80000000); + } + else + { // Oddlines and not vblank + STATUSREG |= 0x80000000; + } + if(dwActFixes&0x1000) // CC game fix { static int iNumRead=0; @@ -2086,7 +2097,7 @@ uint32_t CALLBACK GPUreadStatus(void) } } - return STATUSREG | (vBlank ? 0x80000000 : 0 );; + return STATUSREG; } //////////////////////////////////////////////////////////////////////// @@ -3590,5 +3601,15 @@ void CALLBACK GPUdisplayFlags(uint32_t dwFlags) void CALLBACK GPUvBlank( int val ) { - vBlank = val; + vBlank = val; + oddLines = oddLines ? FALSE : TRUE; // bit changes per frame when not interlaced + //printf("VB %x (%x)\n", oddLines, vBlank); +} + +void CALLBACK GPUhSync( int val ) { + // Interlaced mode - update bit every scanline + if (PSXDisplay.Interlaced) { + oddLines = (val%2 ? FALSE : TRUE); + } + //printf("HS %x (%x)\n", oddLines, vBlank); } -- cgit v1.2.3