summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/mame/drivers/namcos23.c138
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;
}