summaryrefslogtreecommitdiff
path: root/libpcsxcore/gpu.c
diff options
context:
space:
mode:
authorSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-13 18:47:20 +0000
committerSND\shalma_cp <SND\shalma_cp@e17a0e51-4ae3-4d35-97c3-1a29b211df97>2010-11-13 18:47:20 +0000
commit717eb57fbb8ff1fb15ca2706917cb55e40595f59 (patch)
tree3bf4cd509b8521199068581f92030215e984f030 /libpcsxcore/gpu.c
parent96e3916b339c759034a905d636326d1f814b3489 (diff)
downloadpcsxr-717eb57fbb8ff1fb15ca2706917cb55e40595f59.tar.gz
gpu.c
- Repair chain slice: prim48, prim4c, prim58, prim5c (thanks gschwnd) - Repair chain slice: packet80 (peops) - FF9: remove battle hangs, garbage git-svn-id: https://pcsxr.svn.codeplex.com/svn/pcsxr@59545 e17a0e51-4ae3-4d35-97c3-1a29b211df97
Diffstat (limited to 'libpcsxcore/gpu.c')
-rw-r--r--libpcsxcore/gpu.c50
1 files changed, 38 insertions, 12 deletions
diff --git a/libpcsxcore/gpu.c b/libpcsxcore/gpu.c
index d30978b2..2ec06e1b 100644
--- a/libpcsxcore/gpu.c
+++ b/libpcsxcore/gpu.c
@@ -248,9 +248,9 @@ static __inline int prim48( u32 addr )
PSXDMA_LOG( "%X @ Chain 48 - mono 3-line [#_#]\n", addr );
#endif
- lcv = 0;
+ lcv = 1;
- while( psxMu32( addr ) != 0x55555555 )
+ while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 )
{
addr += 4;
lcv++;
@@ -268,9 +268,9 @@ static __inline int prim4C( u32 addr )
PSXDMA_LOG( "%X @ Chain 4c - mono 4-line [#_#]\n", addr );
#endif
- lcv = 0;
+ lcv = 1;
- while( psxMu32( addr ) != 0x55555555 )
+ while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 )
{
addr += 4;
lcv++;
@@ -298,9 +298,9 @@ static __inline int prim58( u32 addr )
PSXDMA_LOG( "%X @ Chain 58 - 3-point gradated [#__#]\n", addr );
#endif
- lcv = 0;
+ lcv = 1;
- while( psxMu32( addr ) != 0x55555555 )
+ while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 )
{
addr += 4;
lcv++;
@@ -318,9 +318,9 @@ static __inline int prim5C( u32 addr )
PSXDMA_LOG( "%X @ Chain 5c - 4-point gradated [#__#]\n", addr );
#endif
- lcv = 0;
+ lcv = 1;
- while( psxMu32( addr ) != 0x55555555 )
+ while( (psxMu32( addr ) & 0xF000F000) != 0x50005000 )
{
addr += 4;
lcv++;
@@ -630,15 +630,41 @@ static u32 gpuDmaChainSize(u32 addr) {
*/
if( code == 0x80 )
{
- s16 width, height;
+ s16 x0,x1,y0,y1,width, height;
+ // PEOPS
+ x0 = (psxMu32( lcv + 4*1 ) >> 0) & 0xffff;
+ y0 = (psxMu32( lcv + 4*1 ) >> 16) & 0xffff;
+ x1 = (psxMu32( lcv + 4*2 ) >> 0) & 0xffff;
+ y1 = (psxMu32( lcv + 4*2 ) >> 16) & 0xffff;
width = (psxMu32( lcv + 4*3 ) >> 0) & 0xffff;
height = (psxMu32( lcv + 4*3 ) >> 16) & 0xffff;
+ x0 &= 0x3ff;
+ x1 &= 0x3ff;
+ y0 &= 0x1ff;
+ y1 &= 0x1ff;
+
+ if( (x0 == x1) && (y0 == y1) ) break;
+
- // PEOPS - check width, height
- if( width < 0 ) break;
- if( height < 0 ) break;
+ // Xenogears - main menu cursor
+ if( width <= 0 ) break;
+ if( height <= 0 ) break;
+
+
+ /*
+ PEOPS
+
+ Final Fantasy 9: battles
+ Medievil: stage 1 opening
+
+ Intense hang, slowdown if we count as full-blown vram transfer
+ */
+ if( (x0+width) > 1024 ||
+ (y0+height) > 512 ||
+ (x1+width) > 1024 ||
+ (y1+height) > 512 ) break;
size += (width * height) / 32;