1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
// license:BSD-3-Clause
// copyright-holders:smf
/*
* PlayStation Geometry Transformation Engine emulator
*
* Copyright 2003-2013 smf
*
*/
#pragma once
#ifndef __PSXGTE_H__
#define __PSXGTE_H__
#include "emu.h"
#define GTE_SF( op ) ( ( op >> 19 ) & 1 )
#define GTE_MX( op ) ( ( op >> 17 ) & 3 )
#define GTE_V( op ) ( ( op >> 15 ) & 3 )
#define GTE_CV( op ) ( ( op >> 13 ) & 3 )
#define GTE_LM( op ) ( ( op >> 10 ) & 1 )
#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:
class int44
{
public:
int44( INT64 value ) :
m_value( value ),
m_positive_overflow( value > S64( 0x7ffffffffff ) ),
m_negative_overflow( value < S64( -0x80000000000 ) )
{
}
int44( INT64 value, bool positive_overflow, bool negative_overflow ) :
m_value( value ),
m_positive_overflow( positive_overflow ),
m_negative_overflow( negative_overflow )
{
}
int44 operator+( INT64 add )
{
INT64 value = ( ( m_value + add ) << 20 ) >> 20;
return int44( value,
m_positive_overflow || ( value < 0 && m_value >= 0 && add >= 0 ),
m_negative_overflow || ( value >= 0 && m_value < 0 && add < 0 ) );
}
bool positive_overflow()
{
return m_positive_overflow;
}
bool negative_overflow()
{
return m_negative_overflow;
}
INT64 value()
{
return m_value;
}
private:
INT64 m_value;
bool m_positive_overflow;
bool m_negative_overflow;
};
INT32 LIM( INT32 value, INT32 max, INT32 min, UINT32 flag );
INT32 BOUNDS( int44 a, int max_flag, int min_flag );
INT32 A1( int44 a );
INT32 A2( int44 a );
INT32 A3( int44 a );
INT32 Lm_B1( INT32 a, int lm );
INT32 Lm_B2( INT32 a, int lm );
INT32 Lm_B3( INT32 a, int lm );
INT32 Lm_B3_sf( INT64 value, int sf, int lm );
INT32 Lm_C1( INT32 a );
INT32 Lm_C2( INT32 a );
INT32 Lm_C3( INT32 a );
INT32 Lm_D( INT64 a, int sf );
UINT32 Lm_E( UINT32 result );
INT64 F( INT64 a );
INT32 Lm_G1( INT64 a );
INT32 Lm_G2( INT64 a );
INT32 Lm_H( INT64 value, int sf );
int m_sf;
INT64 m_mac0;
INT64 m_mac1;
INT64 m_mac2;
INT64 m_mac3;
};
#endif
|