From 0d217bb97c7359f2932ae7f6173f5c55d40542a3 Mon Sep 17 00:00:00 2001 From: Olivier Galibert Date: Mon, 4 Apr 2016 22:38:03 +0200 Subject: [PATCH] model 1 checkpoint (nw) --- src/mame/includes/model1.h | 10 +- src/mame/machine/model1.cpp | 317 +++++++++++++++++++----------------- 2 files changed, 169 insertions(+), 158 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 ) +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 } };