diff options
-rw-r--r-- | src/mame/drivers/namcos23.c | 138 |
1 files changed, 60 insertions, 78 deletions
diff --git a/src/mame/drivers/namcos23.c b/src/mame/drivers/namcos23.c index 9c794537c25..62611209a02 100644 --- a/src/mame/drivers/namcos23.c +++ b/src/mame/drivers/namcos23.c @@ -1605,9 +1605,9 @@ INT16 *namcos23_state::c435_getm(UINT16 id) return m_matrices[id]; } -void namcos23_state::c435_matrix_matrix_mul() // 000. +void namcos23_state::c435_matrix_matrix_mul() // 0.0 { - if(m_c435_buffer[0] != 0x0004) + if((m_c435_buffer[0] & 0xf) != 4) { logerror("WARNING: c435_matrix_matrix_mul with size %d\n", m_c435_buffer[0] & 0xf); return; @@ -1630,33 +1630,9 @@ void namcos23_state::c435_matrix_matrix_mul() // 000. t[8] = INT16((m1[6]*m2[6] + m1[7]*m2[7] + m1[8]*m2[8]) >> 14); } -void namcos23_state::c435_matrix_set() // 004. +void namcos23_state::c435_matrix_vector_mul() // 0.1 { - if(m_c435_buffer[0] != 0x004a) - { - logerror("WARNING: c435_matrix_set with size %d\n", m_c435_buffer[0] & 0xf); - return; - } - INT16 *t = c435_getm(m_c435_buffer[1]); - for(int i=0; i<9; i++) - t[i] = m_c435_buffer[i+2]; -} - -void namcos23_state::c435_vector_set() // 005. -{ - if(m_c435_buffer[0] != 0x0057) - { - logerror("WARNING: c435_vector_set with size %d\n", m_c435_buffer[0] & 0xf); - return; - } - INT32 *t = c435_getv(m_c435_buffer[1]); - for(int i=0; i<3; i++) - t[i] = u32_to_s24((m_c435_buffer[2*i+2] << 16) | m_c435_buffer[2*i+3]); -} - -void namcos23_state::c435_matrix_vector_mul() // 081. -{ - if(m_c435_buffer[0] != 0x0814) + if((m_c435_buffer[0] & 0xf) != 4) { logerror("WARNING: c435_matrix_vector_mul with size %d\n", m_c435_buffer[0] & 0xf); return; @@ -1673,28 +1649,33 @@ void namcos23_state::c435_matrix_vector_mul() // 081. t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); } -void namcos23_state::c435_vector_matrix_mul() // 101. +void namcos23_state::c435_matrix_set() // 0.4 { - if(m_c435_buffer[0] != 0x1014) + if((m_c435_buffer[0] & 0xf) != 10) { - logerror("WARNING: c435_vector_matrix_mul with size %d\n", m_c435_buffer[0] & 0xf); + logerror("WARNING: c435_matrix_set with size %d\n", m_c435_buffer[0] & 0xf); return; } - if(m_c435_buffer[3] != 0xffff) - logerror("WARNING: c435_vector_matrix_mul with [3]=%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]); + INT16 *t = c435_getm(m_c435_buffer[1]); + for(int i=0; i<9; i++) + t[i] = m_c435_buffer[i+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); +void namcos23_state::c435_vector_set() // 0.5 +{ + if((m_c435_buffer[0] & 0xf) != 7) + { + logerror("WARNING: c435_vector_set with size %d\n", m_c435_buffer[0] & 0xf); + return; + } + INT32 *t = c435_getv(m_c435_buffer[1]); + for(int i=0; i<3; i++) + t[i] = u32_to_s24((m_c435_buffer[2*i+2] << 16) | m_c435_buffer[2*i+3]); } -void namcos23_state::c435_scaling_set() // 44.. +void namcos23_state::c435_scaling_set() // 4.4 { - if(m_c435_buffer[0] != 0x4401) + if((m_c435_buffer[0] & 0xff) != 1) { logerror("WARNING: c435_scaling_set with size %d\n", m_c435_buffer[0] & 0xff); return; @@ -1702,7 +1683,7 @@ void namcos23_state::c435_scaling_set() // 44.. m_scaling = m_c435_buffer[1]; } -void namcos23_state::c435_state_set_interrupt() // 4f.. 0001 +void namcos23_state::c435_state_set_interrupt() // 4.f.0001 { if(m_c435_buffer[0] != 0x4f02) { @@ -1715,9 +1696,9 @@ void namcos23_state::c435_state_set_interrupt() // 4f.. 0001 update_main_interrupts(m_main_irqcause & ~MAIN_C435_IRQ); } -void namcos23_state::c435_state_set() // 4f.. +void namcos23_state::c435_state_set() // 4.f { - if(m_c435_buffer[0] == 0x4f00) + if((m_c435_buffer[0] & 0xff) == 0) { logerror("WARNING: c435_state_set with size %d\n", m_c435_buffer[0] & 0xff); return; @@ -1730,11 +1711,11 @@ void namcos23_state::c435_state_set() // 4f.. } } -void namcos23_state::c435_render() // 800. 808. +void namcos23_state::c435_render() // 8 { - if(m_c435_buffer[0] != 0x8003 && m_c435_buffer[0] != 0x8043 && m_c435_buffer[0] != 0x8083) + if((m_c435_buffer[0] & 0xf) != 3) { - logerror("WARNING: c435_render with header %04x\n", m_c435_buffer[0]); + logerror("WARNING: c435_render with size %d, header %04x", m_c435_buffer[0] & 0xf, m_c435_buffer[0]); return; } @@ -1770,9 +1751,9 @@ void namcos23_state::c435_render() // 800. 808. render.count[render.cur]++; } -void namcos23_state::c435_flush() // c00. +void namcos23_state::c435_flush() // c { - if(m_c435_buffer[0] != 0xc000) + if((m_c435_buffer[0] & 0xf) != 0) { logerror("WARNING: c435_flush with size %d\n", m_c435_buffer[0] & 0xf); return; @@ -1789,44 +1770,45 @@ void namcos23_state::c435_pio_w(UINT16 data) { m_c435_buffer[m_c435_buffer_pos++] = data; UINT16 h = m_c435_buffer[0]; - UINT16 h1; int psize; - if(h & 0x4000) - { - h1 = h & 0xff00; + if((h & 0x4000) == 0x4000) psize = h & 0xff; - } else - { - h1 = h & 0xfff0; psize = h & 0xf; - } if(m_c435_buffer_pos < psize+1) return; - switch(h1) - { - case 0x0000: c435_matrix_matrix_mul(); break; - case 0x0040: c435_matrix_set(); break; - case 0x0050: c435_vector_set(); break; - case 0x0810: c435_matrix_vector_mul(); break; - case 0x1010: c435_vector_matrix_mul(); break; - case 0x4400: c435_scaling_set(); break; - case 0x4f00: c435_state_set(); break; - case 0x8000: c435_render(); break; - case 0x8040: c435_render(); break; - case 0x8080: c435_render(); break; - case 0xc000: c435_flush(); break; - default: - if(1) - { - logerror("c435 - [%04x]", h1); - for(int i=0; i<m_c435_buffer_pos; i++) - logerror(" %04x", m_c435_buffer[i]); - logerror("\n"); + bool known = true; + switch(h & 0xc000) { + case 0x0000: + switch(h & 0xf0) { + case 0x00: c435_matrix_matrix_mul(); break; + case 0x10: c435_matrix_vector_mul(); break; + case 0x40: c435_matrix_set(); break; + case 0x50: c435_vector_set(); break; + default: known = false; break; + } + break; + + case 0x4000: + switch(h & 0xf00) { + case 0x400: c435_scaling_set(); break; + case 0xf00: c435_state_set(); break; + default: known = false; break; } break; + + case 0x8000: c435_render(); break; + case 0xc000: c435_flush(); break; } + + if(!known) { + logerror("c435 -"); + for(int i=0; i<m_c435_buffer_pos; i++) + logerror(" %04x", m_c435_buffer[i]); + logerror("\n"); + } + m_c435_buffer_pos = 0; } |