diff options
author | Olivier Galibert <galibert@pobox.com> | 2014-04-02 19:25:55 +0000 |
---|---|---|
committer | Olivier Galibert <galibert@pobox.com> | 2014-04-02 19:25:55 +0000 |
commit | e9e5edab27bea519cd68f7ffa17ab43f682f2b58 (patch) | |
tree | 6a85e43b625f5252b2f6db6022187a0d9c5aa5a2 /src/mame/drivers/namcos23.c | |
parent | ddc2acd46b41dc9f9941bbe4540c2c7d0a67185c (diff) |
namcos23: Enhance matrix-vector mul [O. Galibert]
Diffstat (limited to 'src/mame/drivers/namcos23.c')
-rw-r--r-- | src/mame/drivers/namcos23.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/mame/drivers/namcos23.c b/src/mame/drivers/namcos23.c index 62611209a02..9496ceafff3 100644 --- a/src/mame/drivers/namcos23.c +++ b/src/mame/drivers/namcos23.c @@ -1637,16 +1637,26 @@ void namcos23_state::c435_matrix_vector_mul() // 0.1 logerror("WARNING: c435_matrix_vector_mul with size %d\n", m_c435_buffer[0] & 0xf); return; } - if(m_c435_buffer[3] != 0xffff) - logerror("WARNING: c435_matrix_vector_mul with +2=%04x\n", m_c435_buffer[3]); - INT32 *t = c435_getv(m_c435_buffer[1]); - const INT16 *m = c435_getm(m_c435_buffer[2]); - const INT32 *v = c435_getv(m_c435_buffer[4]); + if(m_c435_buffer[3] != 0xffff) { + INT32 *t = c435_getv(m_c435_buffer[1]); + const INT16 *m = c435_getm(m_c435_buffer[2]); + const INT32 *vt = c435_getv(m_c435_buffer[3]); + const INT32 *v = c435_getv(m_c435_buffer[4]); + + t[0] = INT32((m[0]*INT64(v[0]) + m[1]*INT64(v[1]) + m[2]*INT64(v[2])) >> 14) + vt[0]; + t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[5]*INT64(v[2])) >> 14) + vt[1]; + t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14) + vt[2]; - t[0] = INT32((m[0]*INT64(v[0]) + m[1]*INT64(v[1]) + m[2]*INT64(v[2])) >> 14); - t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[5]*INT64(v[2])) >> 14); - t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); + } else { + INT32 *t = c435_getv(m_c435_buffer[1]); + const INT16 *m = c435_getm(m_c435_buffer[2]); + const INT32 *v = c435_getv(m_c435_buffer[4]); + + t[0] = INT32((m[0]*INT64(v[0]) + m[1]*INT64(v[1]) + m[2]*INT64(v[2])) >> 14); + t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[5]*INT64(v[2])) >> 14); + t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); + } } void namcos23_state::c435_matrix_set() // 0.4 @@ -1791,9 +1801,9 @@ void namcos23_state::c435_pio_w(UINT16 data) break; case 0x4000: - switch(h & 0xf00) { - case 0x400: c435_scaling_set(); break; - case 0xf00: c435_state_set(); break; + switch(h & 0x3f00) { + case 0x0400: c435_scaling_set(); break; + case 0x0f00: c435_state_set(); break; default: known = false; break; } break; |