model 1 checkpoint (nw)

This commit is contained in:
Olivier Galibert 2016-04-04 22:38:03 +02:00
parent 1046be89db
commit 0d217bb97c
2 changed files with 169 additions and 158 deletions

View File

@ -180,12 +180,12 @@ public:
DECLARE_TGP_FUNCTION( clear_stack );
DECLARE_TGP_FUNCTION( matrix_mul );
DECLARE_TGP_FUNCTION( anglev );
DECLARE_TGP_FUNCTION( f11 );
DECLARE_TGP_FUNCTION( triangle_normal );
DECLARE_TGP_FUNCTION( normalize );
DECLARE_TGP_FUNCTION( acc_seti );
DECLARE_TGP_FUNCTION( track_select );
DECLARE_TGP_FUNCTION( f14 );
DECLARE_TGP_FUNCTION( f15_swa );
DECLARE_TGP_FUNCTION( load_base );
DECLARE_TGP_FUNCTION( transpose );
DECLARE_TGP_FUNCTION( anglep );
DECLARE_TGP_FUNCTION( matrix_ident );
DECLARE_TGP_FUNCTION( matrix_read );
@ -214,9 +214,9 @@ public:
DECLARE_TGP_FUNCTION( xyz2rqf );
DECLARE_TGP_FUNCTION( f43 );
DECLARE_TGP_FUNCTION( f43_swa );
DECLARE_TGP_FUNCTION( f44 );
DECLARE_TGP_FUNCTION( track_read_tri );
DECLARE_TGP_FUNCTION( matrix_sdir );
DECLARE_TGP_FUNCTION( f45 );
DECLARE_TGP_FUNCTION( inverse );
DECLARE_TGP_FUNCTION( vlength );
DECLARE_TGP_FUNCTION( f47 );
DECLARE_TGP_FUNCTION( track_read_info );

View File

@ -247,30 +247,36 @@ TGP_FUNCTION( model1_state::anglev )
next_fn();
}
TGP_FUNCTION( model1_state::f11 )
TGP_FUNCTION( model1_state::triangle_normal )
{
float a = fifoin_pop_f();
float b = fifoin_pop_f();
float c = fifoin_pop_f();
float d = fifoin_pop_f();
float e = fifoin_pop_f();
float f = fifoin_pop_f();
float g = fifoin_pop_f();
float h = fifoin_pop_f();
float i = fifoin_pop_f();
(void)a;
(void)b;
(void)c;
(void)d;
(void)e;
(void)f;
(void)g;
(void)h;
(void)i;
logerror("TGP f11 %f, %f, %f, %f, %f, %f, %f, %f, %f (%x)\n", a, b, c, d, e, f, g, h, i, m_pushpc);
fifoout_push_f(0);
fifoout_push_f(0);
fifoout_push_f(0);
float p1x = fifoin_pop_f();
float p1y = fifoin_pop_f();
float p1z = fifoin_pop_f();
float p2x = fifoin_pop_f();
float p2y = fifoin_pop_f();
float p2z = fifoin_pop_f();
float p3x = fifoin_pop_f();
float p3y = fifoin_pop_f();
float p3z = fifoin_pop_f();
float nx = (p1y-p2y)*(p3z-p2z) - (p3y-p2y)*(p1z-p2z);
float ny = (p1z-p2z)*(p3x-p2x) - (p3z-p2z)*(p1x-p2x);
float nz = (p1x-p2x)*(p3y-p2y) - (p3x-p2x)*(p1y-p2y);
float nn = sqrtf(nx*nx + ny*ny + nz*nz);
if(nn < 1e-3)
nn = 0;
else
nn = 1/nn;
nx *= nn;
ny *= nn;
nz *= nn;
logerror("TGP triangle_normal %f, %f, %f, %f, %f, %f, %f, %f, %f (%x)\n", p1x, p1y, p1z, p2x, p2y,p2z, p3x, p3y, p3z, m_pushpc);
fifoout_push_f(nx);
fifoout_push_f(ny);
fifoout_push_f(nz);
next_fn();
}
@ -304,19 +310,25 @@ TGP_FUNCTION( model1_state::track_select )
next_fn();
}
TGP_FUNCTION( model1_state::f14 )
TGP_FUNCTION( model1_state::load_base )
{
m_tgp_vr_base[0] = fifoin_pop_f();
m_tgp_vr_base[1] = fifoin_pop_f();
m_tgp_vr_base[2] = fifoin_pop_f();
m_tgp_vr_base[3] = fifoin_pop_f();
logerror("TGP load_base %f, %f, %f, %f (%x)\n", m_tgp_vr_base[0], m_tgp_vr_base[1], m_tgp_vr_base[2], m_tgp_vr_base[3], m_pushpc);
next_fn();
}
TGP_FUNCTION( model1_state::f15_swa )
TGP_FUNCTION( model1_state::transpose )
{
logerror("TGP f15_swa (%x)\n", m_pushpc);
logerror("TGP transpose (%x)\n", m_pushpc);
float t;
t = m_cmat[1]; m_cmat[1] = m_cmat[3]; m_cmat[3] = t;
t = m_cmat[2]; m_cmat[2] = m_cmat[6]; m_cmat[6] = t;
t = m_cmat[5]; m_cmat[5] = m_cmat[7]; m_cmat[7] = t;
next_fn();
}
@ -371,6 +383,8 @@ TGP_FUNCTION( model1_state::matrix_trans )
float b = fifoin_pop_f();
float c = fifoin_pop_f();
logerror("TCP matrix_trans %f %f %f (%x)\n", a, b, c, m_pushpc);
m_cmat[ 9] += m_cmat[0]*a+m_cmat[3]*b+m_cmat[6]*c;
m_cmat[10] += m_cmat[1]*a+m_cmat[4]*b+m_cmat[7]*c;
m_cmat[11] += m_cmat[2]*a+m_cmat[5]*b+m_cmat[8]*c;
@ -504,7 +518,7 @@ TGP_FUNCTION( model1_state::f24_swa )
(void)f;
(void)g;
logerror("TGP f24_swa %f, %f, %f, %f, %f, %f, %x (%x)\n", a, b, c, d, e, f, g, m_pushpc);
fifoout_push_f(0);
fifoout_push(1);
next_fn();
}
@ -514,7 +528,6 @@ TGP_FUNCTION( model1_state::transform_point )
float y = fifoin_pop_f();
float z = fifoin_pop_f();
logerror("TGP transform_point %f, %f, %f (%x)\n", x, y, z, m_pushpc);
fifoout_push_f(m_cmat[0]*x+m_cmat[3]*y+m_cmat[6]*z+m_cmat[9]);
fifoout_push_f(m_cmat[1]*x+m_cmat[4]*y+m_cmat[7]*z+m_cmat[10]);
fifoout_push_f(m_cmat[2]*x+m_cmat[5]*y+m_cmat[8]*z+m_cmat[11]);
@ -568,7 +581,7 @@ TGP_FUNCTION( model1_state::distance3 )
a -= d;
b -= e;
c -= f;
fifoout_push_f((a*a+b*b+c*c)/sqrtf(a*a+b*b+c*c));
fifoout_push_f(sqrtf(a*a+b*b+c*c));
next_fn();
}
@ -663,9 +676,6 @@ TGP_FUNCTION( model1_state::xyz2rqf )
float b = fifoin_pop_f();
float c = fifoin_pop_f();
float norm;
(void)a;
(void)b;
(void)c;
logerror("TGP xyz2rqf %f, %f, %f (%x)\n", a, b, c, m_pushpc);
fifoout_push_f((a*a+b*b+c*c)/sqrtf(a*a+b*b+c*c));
norm = sqrt(a*a+c*c);
@ -732,14 +742,18 @@ TGP_FUNCTION( model1_state::f43_swa )
next_fn();
}
TGP_FUNCTION( model1_state::f44 )
TGP_FUNCTION( model1_state::track_read_tri )
{
float a = fifoin_pop_f();
(void)a;
logerror("TGP f44 %f (%x)\n", a, m_pushpc);
fifoout_push_f(0);
fifoout_push_f(0);
fifoout_push_f(0);
const UINT32 *tgp_data = (const UINT32 *)memregion("user2")->base();
UINT32 a = fifoin_pop();
int offd;
logerror("TGP track_read_tri %d (%x)\n", a, m_pushpc);
offd = tgp_data[0x20+m_tgp_vr_select] + 16*a;
fifoout_push(tgp_data[offd+12]);
fifoout_push(tgp_data[offd+13]);
fifoout_push(tgp_data[offd+14]);
next_fn();
}
@ -793,27 +807,25 @@ TGP_FUNCTION( model1_state::matrix_sdir )
next_fn();
}
TGP_FUNCTION( model1_state::f45 )
TGP_FUNCTION( model1_state::inverse )
{
float a = fifoin_pop_f();
(void)a;
logerror("TGP f45 %f (%x)\n", a, m_pushpc);
fifoout_push_f(0);
fifoout_push_f(1/a);
next_fn();
}
TGP_FUNCTION( model1_state::vlength )
{
float a = fifoin_pop_f() - m_tgp_vr_base[0];
float b = fifoin_pop_f() - m_tgp_vr_base[1];
float c = fifoin_pop_f() - m_tgp_vr_base[2];
logerror("TGP vlength %f, %f, %f (%x)\n", a, b, c, m_pushpc);
float x = fifoin_pop_f();
float y = fifoin_pop_f();
float z = fifoin_pop_f();
logerror("TGP vlength %f, %f, %f (%x)\n", x, y, z, m_pushpc);
a = (a*a+b*b+c*c);
b = 1/sqrt(a);
c = a * b;
c -= m_tgp_vr_base[3];
fifoout_push_f(c);
x -= m_tgp_vr_base[0];
y -= m_tgp_vr_base[1];
z -= m_tgp_vr_base[2];
fifoout_push_f(sqrt(x*x + y*y + z*z) - m_tgp_vr_base[3]);
next_fn();
}
@ -1581,110 +1593,111 @@ TGP_FUNCTION( model1_state::f103 )
next_fn();
}
// Addresses in daytona's TGP program
const struct model1_state::function model1_state::ftab_vf[] = {
{ &model1_state::fadd, 2 }, /* 0x00 */
{ &model1_state::fsub, 2 },
{ &model1_state::fmul, 2 },
{ &model1_state::fdiv, 2 },
{ nullptr, 0 },
{ &model1_state::matrix_push, 0 },
{ &model1_state::matrix_pop, 0 },
{ &model1_state::matrix_write, 12 },
{ &model1_state::clear_stack, 0 },
{ nullptr, 0 },
{ &model1_state::anglev, 2 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::track_select, 1 },
{ &model1_state::f14, 4 },
{ &model1_state::anglep, 4 },
{ &model1_state::fadd, 2 }, /* 0x00 */ // 0b5
{ &model1_state::fsub, 2 }, // 0ba
{ &model1_state::fmul, 2 }, // 0bf
{ &model1_state::fdiv, 2 }, // 0c4
{ nullptr, 0 }, // 0d2
{ &model1_state::matrix_push, 0 }, // 0e3
{ &model1_state::matrix_pop, 0 }, // 0f7
{ &model1_state::matrix_write, 12 }, // 106
{ &model1_state::clear_stack, 0 }, // 10a
{ &model1_state::matrix_mul, 12 }, // 10e
{ &model1_state::anglev, 2 }, // 154
{ nullptr, 0 }, // 15d
{ nullptr, 0 }, // 19f
{ &model1_state::track_select, 1 }, // 1b8
{ &model1_state::load_base, 4 }, // 1bb
{ &model1_state::anglep, 4 }, // 1c1
{ &model1_state::matrix_ident, 0 }, /* 0x10 */
{ &model1_state::matrix_read, 0 },
{ &model1_state::matrix_trans, 3 },
{ &model1_state::matrix_scale, 3 },
{ &model1_state::matrix_rotx, 1 },
{ &model1_state::matrix_roty, 1 },
{ &model1_state::matrix_rotz, 1 },
{ nullptr, 0 },
{ &model1_state::track_read_quad, 1 },
{ nullptr, 0 },
{ &model1_state::transform_point, 3 },
{ &model1_state::fsin_m1, 1 },
{ &model1_state::fcos_m1, 1 },
{ &model1_state::fsinm_m1, 2 },
{ &model1_state::fcosm_m1, 2 },
{ &model1_state::distance3, 6 },
{ &model1_state::matrix_ident, 0 }, /* 0x10 */ // 1d2
{ &model1_state::matrix_read, 0 }, // 1d9
{ &model1_state::matrix_trans, 3 }, // 1dd
{ &model1_state::matrix_scale, 3 }, // 1f3
{ &model1_state::matrix_rotx, 1 }, // 20a
{ &model1_state::matrix_roty, 1 }, // 223
{ &model1_state::matrix_rotz, 1 }, // 23b
{ nullptr, 0 }, // 253
{ &model1_state::track_read_quad, 1 }, // 2aa
{ nullptr, 0 }, // 2b0
{ &model1_state::transform_point, 3 }, // 2b2
{ &model1_state::fsin_m1, 1 }, // 2cb
{ &model1_state::fcos_m1, 1 }, // 2ce
{ &model1_state::fsinm_m1, 2 }, // 2d1
{ &model1_state::fcosm_m1, 2 }, // 2d7
{ &model1_state::distance3, 6 }, // 2dd
{ nullptr, 0 }, /* 0x20 */
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::acc_set, 1 },
{ &model1_state::acc_get, 0 },
{ &model1_state::acc_add, 1 },
{ &model1_state::acc_sub, 1 },
{ &model1_state::acc_mul, 1 },
{ &model1_state::acc_div, 1 }, // not used ?
{ &model1_state::f42, 3 },
{ &model1_state::f43, 6 },
{ &model1_state::f44, 1 },
{ &model1_state::f45, 1 },
{ &model1_state::vlength, 3 },
{ nullptr, 0 },
{ nullptr, 0 }, /* 0x20 */ // 2ff
{ nullptr, 0 }, // 2ff
{ nullptr, 0 }, // 300
{ nullptr, 0 }, // 304
{ &model1_state::acc_set, 1 }, // 308
{ &model1_state::acc_get, 0 }, // 30a
{ &model1_state::acc_add, 1 }, // 30c
{ &model1_state::acc_sub, 1 }, // 311
{ &model1_state::acc_mul, 1 }, // 316
{ &model1_state::acc_div, 1 }, // 31b
{ &model1_state::f42, 3 }, // 329
{ &model1_state::f43, 6 }, // 36c
{ &model1_state::track_read_tri, 1 }, // 3c2
{ &model1_state::inverse, 1 }, // 3c7
{ &model1_state::vlength, 3 }, // 3cf
{ nullptr, 0 }, // 3ef
{ &model1_state::track_read_info, 1 }, /* 0x30 */
{ &model1_state::colbox_set, 12 },
{ &model1_state::colbox_test, 3 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::track_lookup, 4 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::track_read_info, 1 }, /* 0x30 */ // 410
{ &model1_state::colbox_set, 12 }, // 413
{ &model1_state::colbox_test, 3 }, // 417
{ nullptr, 0 }, // 43b
{ nullptr, 0 }, // 44d
{ nullptr, 0 }, // 452
{ &model1_state::track_lookup, 4 }, // 457
{ nullptr, 0 }, // 51a
{ nullptr, 0 }, // 521
{ nullptr, 0 }, // 52f
{ nullptr, 0 }, // 53d
{ nullptr, 0 }, // 545
{ nullptr, 0 }, // 558
{ nullptr, 0 }, // 559
{ nullptr, 0 }, // 5c6
{ nullptr, 0 }, // 5e9
{ &model1_state::col_setcirc, 3 }, /* 0x40 */
{ &model1_state::col_testpt, 2 },
{ nullptr, 0 },
{ &model1_state::distance, 4 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::car_move, 4 },
{ &model1_state::cpa, 12 },
{ nullptr, 0 },
{ &model1_state::col_setcirc, 3 }, /* 0x40 */ // 5f3
{ &model1_state::col_testpt, 2 }, // 5fa
{ nullptr, 0 }, // 615
{ &model1_state::distance, 4 }, // 631
{ nullptr, 0 }, // 63f
{ nullptr, 0 }, // 643
{ nullptr, 0 }, // 64b
{ &model1_state::car_move, 4 }, // 661
{ &model1_state::cpa, 12 }, // 7d9
{ nullptr, 0 },
{ &model1_state::vmat_store, 1 },
{ &model1_state::vmat_restore, 1 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::vmat_mul, 2 },
{ &model1_state::vmat_read, 1 },
{ &model1_state::matrix_unrot, 0 },
{ &model1_state::f80, 0 }, /* 0x50 */
{ nullptr, 0 },
{ &model1_state::f80, 0 }, /* 0x50 */
{ nullptr, 0 },
{ &model1_state::matrix_rtrans, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::vmat_save, 1 },
{ &model1_state::vmat_load, 1 },
{ &model1_state::ram_setadr, 1 },
{ &model1_state::groundbox_test, 3 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::f89, 4 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::f92, 4 },
{ &model1_state::f93, 1 },
{ &model1_state::f94, 1 },
{ &model1_state::vmat_flatten, 0 },
{ &model1_state::vmat_load1, 1 }, /* 0x60 */
{ &model1_state::vmat_load1, 1 }, /* 0x60 */
{ &model1_state::ram_trans, 0 },
{ &model1_state::f98, 1 },
{ &model1_state::f99, 0 },
@ -1695,27 +1708,25 @@ const struct model1_state::function model1_state::ftab_vf[] = {
};
// Used in swa scene 1 and unemulated:
// f14
// f49_swa
// f15_swa
const struct model1_state::function model1_state::ftab_swa[] = {
{ &model1_state::fadd, 2 }, /* 0x00 */
{ &model1_state::fsub, 2 },
{ &model1_state::fmul, 2 },
{ &model1_state::fdiv, 2 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::matrix_push, 0 },
{ &model1_state::matrix_pop, 0 },
{ &model1_state::matrix_write, 12 },
{ &model1_state::clear_stack, 0 },
{ &model1_state::matrix_mul, 12 },
{ &model1_state::anglev, 2 },
{ &model1_state::f11, 9 },
{ &model1_state::triangle_normal, 9 },
{ &model1_state::normalize, 3 },
{ &model1_state::acc_seti, 1 },
{ &model1_state::f14, 4 },
{ &model1_state::f15_swa, 0 },
{ &model1_state::load_base, 4 },
{ &model1_state::transpose, 0 },
{ &model1_state::matrix_ident, 0 }, /* 0x10 */
{ &model1_state::matrix_read, 0 },
@ -1724,9 +1735,9 @@ const struct model1_state::function model1_state::ftab_swa[] = {
{ &model1_state::matrix_rotx, 1 },
{ &model1_state::matrix_roty, 1 },
{ &model1_state::matrix_rotz, 1 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::f24_swa, 7 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::transform_point, 3 },
{ &model1_state::fsin_m1, 1 },
{ &model1_state::fcos_m1, 1 },
@ -1734,8 +1745,8 @@ const struct model1_state::function model1_state::ftab_swa[] = {
{ &model1_state::fcosm_m1, 2 },
{ &model1_state::distance3, 6 },
{ nullptr, 0 }, /* 0x20 */
{ nullptr, 0 },
{ nullptr, 0 }, /* 0x20 */
{ nullptr, 0 },
{ &model1_state::ftoi, 1 },
{ &model1_state::itof, 1 },
{ &model1_state::acc_set, 1 },
@ -1747,30 +1758,30 @@ const struct model1_state::function model1_state::ftab_swa[] = {
{ &model1_state::xyz2rqf, 3 },
{ &model1_state::f43_swa, 3 },
{ &model1_state::matrix_sdir, 3 },
{ &model1_state::f45, 1 },
{ &model1_state::inverse, 1 },
{ &model1_state::vlength, 3 },
{ &model1_state::f47, 3 },
{ nullptr, 0 }, /* 0x30 */
{ nullptr, 0 }, /* 0x30 */
{ &model1_state::f49_swa, 6 },
{ &model1_state::f50_swa, 4 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::f52, 0 },
{ &model1_state::matrix_rdir, 3 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::f56, 7 },
{ &model1_state::f57, 0 },
{ &model1_state::matrix_readt, 0 },
{ &model1_state::acc_geti, 0 },
{ &model1_state::f60, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::push_and_ident, 0 }, /* 0x40 */
{ nullptr, 0 },
{ nullptr, 0 },
{ &model1_state::catmull_rom, 13 }
};