summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2016-04-04 22:38:03 +0200
committer Olivier Galibert <galibert@pobox.com>2016-04-04 22:40:00 +0200
commit0d217bb97c7359f2932ae7f6173f5c55d40542a3 (patch)
tree80953cf74f1cc2e8a213289b8db692cba6d8d0f8 /src
parent1046be89db453886ee98b72c846f6e42e8da3cfa (diff)
model 1 checkpoint (nw)
Diffstat (limited to 'src')
-rw-r--r--src/mame/includes/model1.h10
-rw-r--r--src/mame/machine/model1.cpp327
2 files changed, 174 insertions, 163 deletions
diff --git a/src/mame/includes/model1.h b/src/mame/includes/model1.h
index 824766648e5..caf9ed1f690 100644
--- a/src/mame/includes/model1.h
+++ b/src/mame/includes/model1.h
@@ -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 );
diff --git a/src/mame/machine/model1.cpp b/src/mame/machine/model1.cpp
index 2f974d00a97..6ffe5ffd6a8 100644
--- a/src/mame/machine/model1.cpp
+++ b/src/mame/machine/model1.cpp
@@ -247,30 +247,36 @@ TGP_FUNCTION( model1_state::anglev )
next_fn();
}
-TGP_FUNCTION( model1_state::f11 )
-{
- 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);
+TGP_FUNCTION( model1_state::triangle_normal )
+{
+ 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::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 },
-
- { 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 },
-
- { &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::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::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 */ // 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 */ // 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 */ // 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 */ // 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 }
};