made gte a separate class.

This commit is contained in:
smf- 2011-04-28 16:51:33 +00:00
parent ad7eaf9cce
commit 3c81107df2
4 changed files with 181 additions and 144 deletions

View File

@ -9,20 +9,19 @@
#include "emu.h"
#include "gte.h"
#include "psx.h"
#if 0
void ATTR_PRINTF(1,2) GTELOG(const char *a,...)
void ATTR_PRINTF(2,3) GTELOG( UINT32 pc, const char *a,...)
{
va_list va;
char s_text[ 1024 ];
va_start( va, a );
vsprintf( s_text, a, va );
va_end( va );
logerror( "%08x: GTE: %08x %s\n", m_pc, INS_COFUN( m_op ), s_text );
logerror( "%08x: GTE: %s\n", pc, s_text );
}
#else
INLINE void ATTR_PRINTF(1,2) GTELOG(const char *a, ...) {}
INLINE void ATTR_PRINTF(2,3) GTELOG( UINT32 pc, const char *a, ...) {}
#endif
@ -150,7 +149,7 @@ INLINE void ATTR_PRINTF(1,2) GTELOG(const char *a, ...) {}
#define ZSF4 ( m_cp2cr[ 30 ].sw.l )
#define FLAG ( m_cp2cr[ 31 ].d )
INT32 psxcpu_device::LIM( INT32 value, INT32 max, INT32 min, UINT32 flag )
INT32 gte::LIM( INT32 value, INT32 max, INT32 min, UINT32 flag )
{
if( value > max )
{
@ -165,7 +164,7 @@ INT32 psxcpu_device::LIM( INT32 value, INT32 max, INT32 min, UINT32 flag )
return value;
}
UINT32 psxcpu_device::getcp2dr( int reg )
UINT32 gte::getcp2dr( UINT32 pc, int reg )
{
switch( reg )
{
@ -197,13 +196,13 @@ UINT32 psxcpu_device::getcp2dr( int reg )
break;
}
GTELOG( "get CP2DR%u=%08x", reg, m_cp2dr[ reg ].d );
GTELOG( pc, "get CP2DR%u=%08x", reg, m_cp2dr[ reg ].d );
return m_cp2dr[ reg ].d;
}
void psxcpu_device::setcp2dr( int reg, UINT32 value )
void gte::setcp2dr( UINT32 pc, int reg, UINT32 value )
{
GTELOG( "set CP2DR%u=%08x", reg, value );
GTELOG( pc, "set CP2DR%u=%08x", reg, value );
switch( reg )
{
@ -245,16 +244,16 @@ void psxcpu_device::setcp2dr( int reg, UINT32 value )
m_cp2dr[ reg ].d = value;
}
UINT32 psxcpu_device::getcp2cr( int reg )
UINT32 gte::getcp2cr( UINT32 pc, int reg )
{
GTELOG( "get CP2CR%u=%08x", reg, m_cp2cr[ reg ].d );
GTELOG( pc, "get CP2CR%u=%08x", reg, m_cp2cr[ reg ].d );
return m_cp2cr[ reg ].d;
}
void psxcpu_device::setcp2cr( int reg, UINT32 value )
void gte::setcp2cr( UINT32 pc, int reg, UINT32 value )
{
GTELOG( "set CP2CR%u=%08x", reg, value );
GTELOG( pc, "set CP2CR%u=%08x", reg, value );
switch( reg )
{
@ -280,7 +279,7 @@ void psxcpu_device::setcp2cr( int reg, UINT32 value )
m_cp2cr[ reg ].d = value;
}
INT64 psxcpu_device::BOUNDS( INT64 n_value, INT64 n_max, int n_maxflag, INT64 n_min, int n_minflag )
INT64 gte::BOUNDS( INT64 n_value, INT64 n_max, int n_maxflag, INT64 n_min, int n_minflag )
{
if( n_value > n_max )
{
@ -2379,7 +2378,7 @@ INLINE UINT32 gte_divide( INT16 numerator, UINT16 denominator )
#define Lm_C3( a ) LIM( ( a ), 0x00ff, 0x0000, ( 1 << 19 ) )
#define Lm_D( a ) LIM( ( a ), 0xffff, 0x0000, ( 1 << 31 ) | ( 1 << 18 ) )
UINT32 psxcpu_device::Lm_E( UINT32 result )
UINT32 gte::Lm_E( UINT32 result )
{
if( result > 0x1ffff )
{
@ -2395,7 +2394,7 @@ UINT32 psxcpu_device::Lm_E( UINT32 result )
#define Lm_G2( a ) LIM( ( a ), 0x3ff, -0x400, ( 1 << 31 ) | ( 1 << 13 ) )
#define Lm_H( a ) LIM( ( a ), 0xfff, 0x000, ( 1 << 12 ) )
void psxcpu_device::docop2( int gteop )
int gte::docop2( UINT32 pc, int gteop )
{
int shift;
int v;
@ -2410,7 +2409,7 @@ void psxcpu_device::docop2( int gteop )
case 0x01:
if( gteop == 0x0180001 )
{
GTELOG( "RTPS" );
GTELOG( pc, "%08x RTPS", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) TRX << 12 ) + ( R11 * VX0 ) + ( R12 * VY0 ) + ( R13 * VZ0 ) ) >> 12 );
@ -2430,19 +2429,19 @@ void psxcpu_device::docop2( int gteop )
SY2 = Lm_G2( F( (INT64) OFY + ( (INT64) IR2 * h_over_sz3 ) ) >> 16 );
MAC0 = F( (INT64) DQB + ( (INT64) DQA * h_over_sz3 ) );
IR0 = Lm_H( MAC0 >> 12 );
return;
return 1;
}
break;
case 0x06:
GTELOG( "NCLIP" );
GTELOG( pc, "%08x NCLIP", gteop );
FLAG = 0;
MAC0 = F( (INT64)( SX0 * SY1 ) + ( SX1 * SY2 ) + ( SX2 * SY0 ) - ( SX0 * SY2 ) - ( SX1 * SY0 ) - ( SX2 * SY1 ) );
return;
return 1;
case 0x0c:
GTELOG( "OP" );
GTELOG( pc, "%08x OP", gteop );
FLAG = 0;
shift = 12 * GTE_SF( gteop );
@ -2454,10 +2453,10 @@ void psxcpu_device::docop2( int gteop )
IR1 = Lm_B1( MAC1, lm );
IR2 = Lm_B2( MAC2, lm );
IR3 = Lm_B3( MAC3, lm );
return;
return 1;
case 0x10:
GTELOG( "DPCS" );
GTELOG( pc, "%08x DPCS", gteop );
FLAG = 0;
shift = 12 * GTE_SF( gteop );
@ -2475,10 +2474,10 @@ void psxcpu_device::docop2( int gteop )
R2 = Lm_C1( MAC1 >> 4 );
G2 = Lm_C2( MAC2 >> 4 );
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
case 0x11:
GTELOG( "INTPL" );
GTELOG( pc, "%08x INTPL", gteop );
FLAG = 0;
shift = 12 * GTE_SF( gteop );
@ -2496,12 +2495,12 @@ void psxcpu_device::docop2( int gteop )
R2 = Lm_C1( MAC1 >> 4 );
G2 = Lm_C2( MAC2 >> 4 );
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
case 0x12:
if( GTE_OP( gteop ) == 0x04 )
{
GTELOG( "MVMVA" );
GTELOG( pc, "%08x MVMVA", gteop );
shift = 12 * GTE_SF( gteop );
mx = GTE_MX( gteop );
v = GTE_V( gteop );
@ -2517,13 +2516,13 @@ void psxcpu_device::docop2( int gteop )
IR1 = Lm_B1( MAC1, lm );
IR2 = Lm_B2( MAC2, lm );
IR3 = Lm_B3( MAC3, lm );
return;
return 1;
}
break;
case 0x13:
if( gteop == 0x0e80413 )
{
GTELOG( "NCDS" );
GTELOG( pc, "%08x NCDS", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) L11 * VX0 ) + ( L12 * VY0 ) + ( L13 * VZ0 ) ) >> 12 );
@ -2556,13 +2555,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x14:
if( gteop == 0x1280414 )
{
GTELOG( "CDP" );
GTELOG( pc, "%08x CDP", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) RBK << 12 ) + ( LR1 * IR1 ) + ( LR2 * IR2 ) + ( LR3 * IR3 ) ) >> 12 );
@ -2589,13 +2588,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x16:
if( gteop == 0x0f80416 )
{
GTELOG( "NCDT" );
GTELOG( pc, "%08x NCDT", gteop );
FLAG = 0;
for( v = 0; v < 3; v++ )
@ -2631,13 +2630,13 @@ void psxcpu_device::docop2( int gteop )
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
}
return;
return 1;
}
break;
case 0x1b:
if( gteop == 0x108041b || gteop == 0x118041b )
{
GTELOG( "NCCS" );
GTELOG( pc, "%08x NCCS", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) L11 * VX0 ) + ( L12 * VY0 ) + ( L13 * VZ0 ) ) >> 12 );
@ -2670,13 +2669,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x1c:
if( gteop == 0x138041c )
{
GTELOG( "CC" );
GTELOG( pc, "%08x CC", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) RBK << 12 ) + ( LR1 * IR1 ) + ( LR2 * IR2 ) + ( LR3 * IR3 ) ) >> 12 );
@ -2703,13 +2702,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x1e:
if( gteop == 0x0c8041e )
{
GTELOG( "NCS" );
GTELOG( pc, "%08x NCS", gteop );
FLAG = 0;
MAC1 = A1( ( ( (INT64) L11 * VX0 ) + ( L12 * VY0 ) + ( L13 * VZ0 ) ) >> 12 );
@ -2736,13 +2735,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x20:
if( gteop == 0x0d80420 )
{
GTELOG( "NCT" );
GTELOG( pc, "%08x NCT", gteop );
FLAG = 0;
for( v = 0; v < 3; v++ )
@ -2772,12 +2771,12 @@ void psxcpu_device::docop2( int gteop )
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
}
return;
return 1;
}
break;
case 0x28:
GTELOG( "SQR" );
GTELOG( pc, "%08x SQR", gteop );
FLAG = 0;
shift = 12 * GTE_SF( gteop );
@ -2789,13 +2788,13 @@ void psxcpu_device::docop2( int gteop )
IR1 = Lm_B1( MAC1, lm );
IR2 = Lm_B2( MAC2, lm );
IR3 = Lm_B3( MAC3, lm );
return;
return 1;
// DCPL 0x29
case 0x2a:
if( gteop == 0x0f8002a )
{
GTELOG( "DPCT" );
GTELOG( pc, "%08x DPCT", gteop );
FLAG = 0;
for( v = 0; v < 3; v++ )
@ -2819,34 +2818,34 @@ void psxcpu_device::docop2( int gteop )
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
}
return;
return 1;
}
break;
case 0x2d:
GTELOG( "AVSZ3" );
GTELOG( pc, "%08x AVSZ3", gteop );
FLAG = 0;
mac0 = F( (INT64) ( ZSF3 * SZ1 ) + ( ZSF3 * SZ2 ) + ( ZSF3 * SZ3 ) );
OTZ = Lm_D( mac0 >> 12 );
MAC0 = mac0;
return;
return 1;
case 0x2e:
GTELOG( "AVSZ4" );
GTELOG( pc, "%08x AVSZ4", gteop );
FLAG = 0;
mac0 = F( (INT64) ( ZSF4 * SZ0 ) + ( ZSF4 * SZ1 ) + ( ZSF4 * SZ2 ) + ( ZSF4 * SZ3 ) );
OTZ = Lm_D( mac0 >> 12 );
MAC0 = mac0;
return;
return 1;
case 0x30:
if( gteop == 0x0280030 )
{
GTELOG( "RTPT" );
GTELOG( pc, "%08x RTPT", gteop );
FLAG = 0;
for( v = 0; v < 3; v++ )
@ -2869,14 +2868,14 @@ void psxcpu_device::docop2( int gteop )
MAC0 = F( (INT64) DQB + ( (INT64) DQA * h_over_sz3 ) );
IR0 = Lm_H( MAC0 >> 12 );
}
return;
return 1;
}
break;
case 0x3d:
if( GTE_OP( gteop ) == 0x09 ||
GTE_OP( gteop ) == 0x19 )
{
GTELOG( "GPF" );
GTELOG( pc, "%08x GPF", gteop );
shift = 12 * GTE_SF( gteop );
FLAG = 0;
@ -2898,13 +2897,13 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x3e:
if( GTE_OP( gteop ) == 0x1a )
{
GTELOG( "GPL" );
GTELOG( pc, "%08x GPL", gteop );
shift = 12 * GTE_SF( gteop );
FLAG = 0;
@ -2926,14 +2925,14 @@ void psxcpu_device::docop2( int gteop )
B0 = B1;
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
return;
return 1;
}
break;
case 0x3f:
if( gteop == 0x108043f ||
gteop == 0x118043f )
{
GTELOG( "NCCT" );
GTELOG( pc, "%08x NCCT", gteop );
FLAG = 0;
for( v = 0; v < 3; v++ )
@ -2969,11 +2968,13 @@ void psxcpu_device::docop2( int gteop )
B1 = B2;
B2 = Lm_C3( MAC3 >> 4 );
}
return;
return 1;
}
break;
}
popmessage( "unknown GTE op %08x", gteop );
logerror( "%08x: unknown GTE op %08x\n", m_pc, gteop );
stop();
logerror( "%08x: unknown GTE op %08x\n", pc, gteop );
return 0;
}

View File

@ -1,3 +1,19 @@
/*
* Geometry Transformation Engine
*
* Copyright 2003-2011 smf
*
* divider reverse engineering by pSXAuthor.
*
*/
#pragma once
#include "emu.h"
#ifndef __GTE_H__
#define __GTE_H__
#define GTE_OP( op ) ( ( op >> 20 ) & 31 )
#define GTE_SF( op ) ( ( op >> 19 ) & 1 )
#define GTE_MX( op ) ( ( op >> 17 ) & 3 )
@ -7,3 +23,23 @@
#define GTE_LM( op ) ( ( op >> 10 ) & 1 )
#define GTE_CT( op ) ( ( op >> 6 ) & 15 ) /* not used */
#define GTE_FUNCT( op ) ( op & 63 )
class gte
{
public:
PAIR m_cp2cr[ 32 ];
PAIR m_cp2dr[ 32 ];
UINT32 getcp2dr( UINT32 pc, int reg );
void setcp2dr( UINT32 pc, int reg, UINT32 value );
UINT32 getcp2cr( UINT32 pc, int reg );
void setcp2cr( UINT32 pc, int reg, UINT32 value );
int docop2( UINT32 pc, int gteop );
protected:
INT32 LIM( INT32 value, INT32 max, INT32 min, UINT32 flag );
INT64 BOUNDS( INT64 n_value, INT64 n_max, int n_maxflag, INT64 n_min, int n_minflag );
UINT32 Lm_E( UINT32 result );
};
#endif

View File

@ -1214,7 +1214,10 @@ int psxcpu_device::execute_unstoppable_instructions( int executeCop2 )
return 0;
}
docop2( INS_COFUN( m_op ) );
if( !m_gte.docop2( m_pc, INS_COFUN( m_op ) ) )
{
stop();
}
break;
}
}
@ -1612,8 +1615,8 @@ void psxcpu_device::device_start()
save_item( NAME(m_biu) );
save_item( NAME(m_r) );
save_item( NAME(m_cp0r) );
save_item( NAME(m_cp2cr) );
save_item( NAME(m_cp2dr) );
save_item( NAME(m_gte.m_cp2cr) );
save_item( NAME(m_gte.m_cp2dr) );
save_item( NAME(m_icacheTag) );
save_item( NAME(m_icache) );
save_item( NAME(m_dcache) );
@ -1676,70 +1679,70 @@ void psxcpu_device::device_start()
state_add( PSXCPU_CP0R13, "Cause", m_cp0r[ 13 ] ).callimport();
state_add( PSXCPU_CP0R14, "EPC", m_cp0r[ 14 ] );
state_add( PSXCPU_CP0R15, "PRId", m_cp0r[ 15 ] );
state_add( PSXCPU_CP2DR0, "vxy0", m_cp2dr[ 0 ].d );
state_add( PSXCPU_CP2DR1, "vz0", m_cp2dr[ 1 ].d );
state_add( PSXCPU_CP2DR2, "vxy1", m_cp2dr[ 2 ].d );
state_add( PSXCPU_CP2DR3, "vz1", m_cp2dr[ 3 ].d );
state_add( PSXCPU_CP2DR4, "vxy2", m_cp2dr[ 4 ].d );
state_add( PSXCPU_CP2DR5, "vz2", m_cp2dr[ 5 ].d );
state_add( PSXCPU_CP2DR6, "rgb", m_cp2dr[ 6 ].d );
state_add( PSXCPU_CP2DR7, "otz", m_cp2dr[ 7 ].d );
state_add( PSXCPU_CP2DR8, "ir0", m_cp2dr[ 8 ].d );
state_add( PSXCPU_CP2DR9, "ir1", m_cp2dr[ 9 ].d );
state_add( PSXCPU_CP2DR10, "ir2", m_cp2dr[ 10 ].d );
state_add( PSXCPU_CP2DR11, "ir3", m_cp2dr[ 11 ].d );
state_add( PSXCPU_CP2DR12, "sxy0", m_cp2dr[ 12 ].d );
state_add( PSXCPU_CP2DR13, "sxy1", m_cp2dr[ 13 ].d );
state_add( PSXCPU_CP2DR14, "sxy2", m_cp2dr[ 14 ].d );
state_add( PSXCPU_CP2DR15, "sxyp", m_cp2dr[ 15 ].d );
state_add( PSXCPU_CP2DR16, "sz0", m_cp2dr[ 16 ].d );
state_add( PSXCPU_CP2DR17, "sz1", m_cp2dr[ 17 ].d );
state_add( PSXCPU_CP2DR18, "sz2", m_cp2dr[ 18 ].d );
state_add( PSXCPU_CP2DR19, "sz3", m_cp2dr[ 19 ].d );
state_add( PSXCPU_CP2DR20, "rgb0", m_cp2dr[ 20 ].d );
state_add( PSXCPU_CP2DR21, "rgb1", m_cp2dr[ 21 ].d );
state_add( PSXCPU_CP2DR22, "rgb2", m_cp2dr[ 22 ].d );
state_add( PSXCPU_CP2DR23, "res1", m_cp2dr[ 23 ].d );
state_add( PSXCPU_CP2DR24, "mac0", m_cp2dr[ 24 ].d );
state_add( PSXCPU_CP2DR25, "mac1", m_cp2dr[ 25 ].d );
state_add( PSXCPU_CP2DR26, "mac2", m_cp2dr[ 26 ].d );
state_add( PSXCPU_CP2DR27, "mac3", m_cp2dr[ 27 ].d );
state_add( PSXCPU_CP2DR28, "irgb", m_cp2dr[ 28 ].d );
state_add( PSXCPU_CP2DR29, "orgb", m_cp2dr[ 29 ].d );
state_add( PSXCPU_CP2DR30, "lzcs", m_cp2dr[ 30 ].d );
state_add( PSXCPU_CP2DR31, "lzcr", m_cp2dr[ 31 ].d );
state_add( PSXCPU_CP2CR0, "r11r12", m_cp2cr[ 0 ].d );
state_add( PSXCPU_CP2CR1, "r13r21", m_cp2cr[ 1 ].d );
state_add( PSXCPU_CP2CR2, "r22r23", m_cp2cr[ 2 ].d );
state_add( PSXCPU_CP2CR3, "r31r32", m_cp2cr[ 3 ].d );
state_add( PSXCPU_CP2CR4, "r33", m_cp2cr[ 4 ].d );
state_add( PSXCPU_CP2CR5, "trx", m_cp2cr[ 5 ].d );
state_add( PSXCPU_CP2CR6, "try", m_cp2cr[ 6 ].d );
state_add( PSXCPU_CP2CR7, "trz", m_cp2cr[ 7 ].d );
state_add( PSXCPU_CP2CR8, "l11l12", m_cp2cr[ 8 ].d );
state_add( PSXCPU_CP2CR9, "l13l21", m_cp2cr[ 9 ].d );
state_add( PSXCPU_CP2CR10, "l22l23", m_cp2cr[ 10 ].d );
state_add( PSXCPU_CP2CR11, "l31l32", m_cp2cr[ 11 ].d );
state_add( PSXCPU_CP2CR12, "l33", m_cp2cr[ 12 ].d );
state_add( PSXCPU_CP2CR13, "rbk", m_cp2cr[ 13 ].d );
state_add( PSXCPU_CP2CR14, "gbk", m_cp2cr[ 14 ].d );
state_add( PSXCPU_CP2CR15, "bbk", m_cp2cr[ 15 ].d );
state_add( PSXCPU_CP2CR16, "lr1lr2", m_cp2cr[ 16 ].d );
state_add( PSXCPU_CP2CR17, "lr31g1", m_cp2cr[ 17 ].d );
state_add( PSXCPU_CP2CR18, "lg2lg3", m_cp2cr[ 18 ].d );
state_add( PSXCPU_CP2CR19, "lb1lb2", m_cp2cr[ 19 ].d );
state_add( PSXCPU_CP2CR20, "lb3", m_cp2cr[ 20 ].d );
state_add( PSXCPU_CP2CR21, "rfc", m_cp2cr[ 21 ].d );
state_add( PSXCPU_CP2CR22, "gfc", m_cp2cr[ 22 ].d );
state_add( PSXCPU_CP2CR23, "bfc", m_cp2cr[ 23 ].d );
state_add( PSXCPU_CP2CR24, "ofx", m_cp2cr[ 24 ].d );
state_add( PSXCPU_CP2CR25, "ofy", m_cp2cr[ 25 ].d );
state_add( PSXCPU_CP2CR26, "h", m_cp2cr[ 26 ].d );
state_add( PSXCPU_CP2CR27, "dqa", m_cp2cr[ 27 ].d );
state_add( PSXCPU_CP2CR28, "dqb", m_cp2cr[ 28 ].d );
state_add( PSXCPU_CP2CR29, "zsf3", m_cp2cr[ 29 ].d );
state_add( PSXCPU_CP2CR30, "zsf4", m_cp2cr[ 30 ].d );
state_add( PSXCPU_CP2CR31, "flag", m_cp2cr[ 31 ].d );
state_add( PSXCPU_CP2DR0, "vxy0", m_gte.m_cp2dr[ 0 ].d );
state_add( PSXCPU_CP2DR1, "vz0", m_gte.m_cp2dr[ 1 ].d );
state_add( PSXCPU_CP2DR2, "vxy1", m_gte.m_cp2dr[ 2 ].d );
state_add( PSXCPU_CP2DR3, "vz1", m_gte.m_cp2dr[ 3 ].d );
state_add( PSXCPU_CP2DR4, "vxy2", m_gte.m_cp2dr[ 4 ].d );
state_add( PSXCPU_CP2DR5, "vz2", m_gte.m_cp2dr[ 5 ].d );
state_add( PSXCPU_CP2DR6, "rgb", m_gte.m_cp2dr[ 6 ].d );
state_add( PSXCPU_CP2DR7, "otz", m_gte.m_cp2dr[ 7 ].d );
state_add( PSXCPU_CP2DR8, "ir0", m_gte.m_cp2dr[ 8 ].d );
state_add( PSXCPU_CP2DR9, "ir1", m_gte.m_cp2dr[ 9 ].d );
state_add( PSXCPU_CP2DR10, "ir2", m_gte.m_cp2dr[ 10 ].d );
state_add( PSXCPU_CP2DR11, "ir3", m_gte.m_cp2dr[ 11 ].d );
state_add( PSXCPU_CP2DR12, "sxy0", m_gte.m_cp2dr[ 12 ].d );
state_add( PSXCPU_CP2DR13, "sxy1", m_gte.m_cp2dr[ 13 ].d );
state_add( PSXCPU_CP2DR14, "sxy2", m_gte.m_cp2dr[ 14 ].d );
state_add( PSXCPU_CP2DR15, "sxyp", m_gte.m_cp2dr[ 15 ].d );
state_add( PSXCPU_CP2DR16, "sz0", m_gte.m_cp2dr[ 16 ].d );
state_add( PSXCPU_CP2DR17, "sz1", m_gte.m_cp2dr[ 17 ].d );
state_add( PSXCPU_CP2DR18, "sz2", m_gte.m_cp2dr[ 18 ].d );
state_add( PSXCPU_CP2DR19, "sz3", m_gte.m_cp2dr[ 19 ].d );
state_add( PSXCPU_CP2DR20, "rgb0", m_gte.m_cp2dr[ 20 ].d );
state_add( PSXCPU_CP2DR21, "rgb1", m_gte.m_cp2dr[ 21 ].d );
state_add( PSXCPU_CP2DR22, "rgb2", m_gte.m_cp2dr[ 22 ].d );
state_add( PSXCPU_CP2DR23, "res1", m_gte.m_cp2dr[ 23 ].d );
state_add( PSXCPU_CP2DR24, "mac0", m_gte.m_cp2dr[ 24 ].d );
state_add( PSXCPU_CP2DR25, "mac1", m_gte.m_cp2dr[ 25 ].d );
state_add( PSXCPU_CP2DR26, "mac2", m_gte.m_cp2dr[ 26 ].d );
state_add( PSXCPU_CP2DR27, "mac3", m_gte.m_cp2dr[ 27 ].d );
state_add( PSXCPU_CP2DR28, "irgb", m_gte.m_cp2dr[ 28 ].d );
state_add( PSXCPU_CP2DR29, "orgb", m_gte.m_cp2dr[ 29 ].d );
state_add( PSXCPU_CP2DR30, "lzcs", m_gte.m_cp2dr[ 30 ].d );
state_add( PSXCPU_CP2DR31, "lzcr", m_gte.m_cp2dr[ 31 ].d );
state_add( PSXCPU_CP2CR0, "r11r12", m_gte.m_cp2cr[ 0 ].d );
state_add( PSXCPU_CP2CR1, "r13r21", m_gte.m_cp2cr[ 1 ].d );
state_add( PSXCPU_CP2CR2, "r22r23", m_gte.m_cp2cr[ 2 ].d );
state_add( PSXCPU_CP2CR3, "r31r32", m_gte.m_cp2cr[ 3 ].d );
state_add( PSXCPU_CP2CR4, "r33", m_gte.m_cp2cr[ 4 ].d );
state_add( PSXCPU_CP2CR5, "trx", m_gte.m_cp2cr[ 5 ].d );
state_add( PSXCPU_CP2CR6, "try", m_gte.m_cp2cr[ 6 ].d );
state_add( PSXCPU_CP2CR7, "trz", m_gte.m_cp2cr[ 7 ].d );
state_add( PSXCPU_CP2CR8, "l11l12", m_gte.m_cp2cr[ 8 ].d );
state_add( PSXCPU_CP2CR9, "l13l21", m_gte.m_cp2cr[ 9 ].d );
state_add( PSXCPU_CP2CR10, "l22l23", m_gte.m_cp2cr[ 10 ].d );
state_add( PSXCPU_CP2CR11, "l31l32", m_gte.m_cp2cr[ 11 ].d );
state_add( PSXCPU_CP2CR12, "l33", m_gte.m_cp2cr[ 12 ].d );
state_add( PSXCPU_CP2CR13, "rbk", m_gte.m_cp2cr[ 13 ].d );
state_add( PSXCPU_CP2CR14, "gbk", m_gte.m_cp2cr[ 14 ].d );
state_add( PSXCPU_CP2CR15, "bbk", m_gte.m_cp2cr[ 15 ].d );
state_add( PSXCPU_CP2CR16, "lr1lr2", m_gte.m_cp2cr[ 16 ].d );
state_add( PSXCPU_CP2CR17, "lr31g1", m_gte.m_cp2cr[ 17 ].d );
state_add( PSXCPU_CP2CR18, "lg2lg3", m_gte.m_cp2cr[ 18 ].d );
state_add( PSXCPU_CP2CR19, "lb1lb2", m_gte.m_cp2cr[ 19 ].d );
state_add( PSXCPU_CP2CR20, "lb3", m_gte.m_cp2cr[ 20 ].d );
state_add( PSXCPU_CP2CR21, "rfc", m_gte.m_cp2cr[ 21 ].d );
state_add( PSXCPU_CP2CR22, "gfc", m_gte.m_cp2cr[ 22 ].d );
state_add( PSXCPU_CP2CR23, "bfc", m_gte.m_cp2cr[ 23 ].d );
state_add( PSXCPU_CP2CR24, "ofx", m_gte.m_cp2cr[ 24 ].d );
state_add( PSXCPU_CP2CR25, "ofy", m_gte.m_cp2cr[ 25 ].d );
state_add( PSXCPU_CP2CR26, "h", m_gte.m_cp2cr[ 26 ].d );
state_add( PSXCPU_CP2CR27, "dqa", m_gte.m_cp2cr[ 27 ].d );
state_add( PSXCPU_CP2CR28, "dqb", m_gte.m_cp2cr[ 28 ].d );
state_add( PSXCPU_CP2CR29, "zsf3", m_gte.m_cp2cr[ 29 ].d );
state_add( PSXCPU_CP2CR30, "zsf4", m_gte.m_cp2cr[ 30 ].d );
state_add( PSXCPU_CP2CR31, "flag", m_gte.m_cp2cr[ 31 ].d );
// set our instruction counter
m_icountptr = &m_icount;
@ -1914,7 +1917,7 @@ void psxcpu_device::lwc( int cop, int sr_cu )
break;
case 2:
setcp2dr( reg, data );
m_gte.setcp2dr( m_pc, reg, data );
break;
case 3:
@ -1985,7 +1988,7 @@ void psxcpu_device::swc( int cop, int sr_cu )
break;
case 2:
data = getcp2dr( INS_RT( m_op ) );
data = m_gte.getcp2dr( m_pc, INS_RT( m_op ) );
break;
case 3:
@ -2507,20 +2510,20 @@ void psxcpu_device::execute_run()
switch( INS_RS( m_op ) )
{
case RS_MFC:
delayed_load( INS_RT( m_op ), getcp2dr( INS_RD( m_op ) ) );
delayed_load( INS_RT( m_op ), m_gte.getcp2dr( m_pc, INS_RD( m_op ) ) );
break;
case RS_CFC:
delayed_load( INS_RT( m_op ), getcp2cr( INS_RD( m_op ) ) );
delayed_load( INS_RT( m_op ), m_gte.getcp2cr( m_pc, INS_RD( m_op ) ) );
break;
case RS_MTC:
setcp2dr( INS_RD( m_op ), m_r[ INS_RT( m_op ) ] );
m_gte.setcp2dr( m_pc, INS_RD( m_op ), m_r[ INS_RT( m_op ) ] );
advance_pc();
break;
case RS_CTC:
setcp2cr( INS_RD( m_op ), m_r[ INS_RT( m_op ) ] );
m_gte.setcp2cr( m_pc, INS_RD( m_op ), m_r[ INS_RT( m_op ) ] );
advance_pc();
break;
@ -2542,7 +2545,11 @@ void psxcpu_device::execute_run()
switch( INS_CO( m_op ) )
{
case 1:
docop2( INS_COFUN( m_op ) );
if( !m_gte.docop2( m_pc, INS_COFUN( m_op ) ) )
{
stop();
}
advance_pc();
break;

View File

@ -11,6 +11,7 @@
#ifndef __PSXCPU_H__
#define __PSXCPU_H__
#include "gte.h"
//**************************************************************************
// CONSTANTS
@ -158,8 +159,6 @@ protected:
UINT32 m_pc;
UINT32 m_r[ 32 ];
UINT32 m_cp0r[ 16 ];
PAIR m_cp2cr[ 32 ];
PAIR m_cp2dr[ 32 ];
UINT32 m_hi;
UINT32 m_lo;
@ -256,14 +255,8 @@ protected:
void setcp3dr( int reg, UINT32 value );
UINT32 getcp3cr( int reg );
void setcp3cr( int reg, UINT32 value );
INT32 LIM( INT32 value, INT32 max, INT32 min, UINT32 flag );
UINT32 getcp2dr( int reg );
void setcp2dr( int reg, UINT32 value );
UINT32 getcp2cr( int reg );
void setcp2cr( int reg, UINT32 value );
INT64 BOUNDS( INT64 n_value, INT64 n_max, int n_maxflag, INT64 n_min, int n_minflag );
UINT32 Lm_E( UINT32 result );
void docop2( int gteop );
gte m_gte;
};
class cxd8530aq_device : public psxcpu_device