trunk/src/mame/drivers/namcos23.c
| r29173 | r29174 | |
| 1427 | 1427 | UINT32 m_tile_mask; |
| 1428 | 1428 | UINT32 m_ptrom_limit; |
| 1429 | 1429 | |
| 1430 | int m_vblank_count; |
| 1431 | |
| 1430 | 1432 | // It may only be 128 |
| 1431 | 1433 | // At 0x1e bytes per slot, rounded up to 0x20, that's 0x1000 to 0x2000 bytes. |
| 1432 | 1434 | // That fits pretty much anywhere, including inside a IC |
| r29173 | r29174 | |
| 1614 | 1616 | logerror("WARNING: c435_matrix_matrix_mul with +2=%04x\n", m_c435_buffer[3]); |
| 1615 | 1617 | |
| 1616 | 1618 | INT16 *t = c435_getm(m_c435_buffer[1]); |
| 1617 | | const INT16 *m1 = c435_getm(m_c435_buffer[2]); |
| 1618 | | const INT16 *m2 = c435_getm(m_c435_buffer[4]); |
| 1619 | const INT16 *m2 = c435_getm(m_c435_buffer[2]); |
| 1620 | const INT16 *m1 = c435_getm(m_c435_buffer[4]); |
| 1619 | 1621 | |
| 1620 | | t[0] = INT16((m1[0]*m2[0] + m1[1]*m2[3] + m1[2]*m2[6]) >> 14); |
| 1621 | | t[1] = INT16((m1[0]*m2[1] + m1[1]*m2[4] + m1[2]*m2[7]) >> 14); |
| 1622 | | t[2] = INT16((m1[0]*m2[2] + m1[1]*m2[5] + m1[2]*m2[8]) >> 14); |
| 1623 | | t[3] = INT16((m1[3]*m2[0] + m1[4]*m2[3] + m1[5]*m2[6]) >> 14); |
| 1624 | | t[4] = INT16((m1[3]*m2[1] + m1[4]*m2[4] + m1[5]*m2[7]) >> 14); |
| 1625 | | t[5] = INT16((m1[3]*m2[2] + m1[4]*m2[5] + m1[5]*m2[8]) >> 14); |
| 1626 | | t[6] = INT16((m1[6]*m2[0] + m1[7]*m2[3] + m1[8]*m2[6]) >> 14); |
| 1627 | | t[7] = INT16((m1[6]*m2[1] + m1[7]*m2[4] + m1[8]*m2[7]) >> 14); |
| 1628 | | t[8] = INT16((m1[6]*m2[2] + m1[7]*m2[5] + m1[8]*m2[8]) >> 14); |
| 1622 | t[0] = INT16((m1[0]*m2[0] + m1[1]*m2[1] + m1[2]*m2[2]) >> 14); |
| 1623 | t[1] = INT16((m1[0]*m2[3] + m1[1]*m2[4] + m1[2]*m2[5]) >> 14); |
| 1624 | t[2] = INT16((m1[0]*m2[6] + m1[1]*m2[7] + m1[2]*m2[8]) >> 14); |
| 1625 | t[3] = INT16((m1[3]*m2[0] + m1[4]*m2[1] + m1[5]*m2[2]) >> 14); |
| 1626 | t[4] = INT16((m1[3]*m2[3] + m1[4]*m2[4] + m1[5]*m2[5]) >> 14); |
| 1627 | t[5] = INT16((m1[3]*m2[6] + m1[4]*m2[7] + m1[5]*m2[8]) >> 14); |
| 1628 | t[6] = INT16((m1[6]*m2[0] + m1[7]*m2[1] + m1[8]*m2[2]) >> 14); |
| 1629 | t[7] = INT16((m1[6]*m2[3] + m1[7]*m2[4] + m1[8]*m2[5]) >> 14); |
| 1630 | t[8] = INT16((m1[6]*m2[6] + m1[7]*m2[7] + m1[8]*m2[8]) >> 14); |
| 1629 | 1631 | } |
| 1630 | 1632 | |
| 1631 | 1633 | void namcos23_state::c435_matrix_set() // 004. |
| r29173 | r29174 | |
| 1667 | 1669 | const INT32 *v = c435_getv(m_c435_buffer[4]); |
| 1668 | 1670 | |
| 1669 | 1671 | t[0] = INT32((m[0]*INT64(v[0]) + m[1]*INT64(v[1]) + m[2]*INT64(v[2])) >> 14); |
| 1670 | | t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[7]*INT64(v[2])) >> 14); |
| 1672 | t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[5]*INT64(v[2])) >> 14); |
| 1671 | 1673 | t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); |
| 1672 | 1674 | } |
| 1673 | 1675 | |
| r29173 | r29174 | |
| 1685 | 1687 | const INT16 *m = c435_getm(m_c435_buffer[2]); |
| 1686 | 1688 | const INT32 *v = c435_getv(m_c435_buffer[4]); |
| 1687 | 1689 | |
| 1688 | | t[0] = INT32((m[0]*INT64(v[0]) + m[3]*INT64(v[1]) + m[6]*INT64(v[2])) >> 14); |
| 1689 | | t[1] = INT32((m[1]*INT64(v[0]) + m[4]*INT64(v[1]) + m[7]*INT64(v[2])) >> 14); |
| 1690 | | t[2] = INT32((m[2]*INT64(v[0]) + m[5]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); |
| 1690 | t[0] = INT32((m[0]*INT64(v[0]) + m[1]*INT64(v[1]) + m[2]*INT64(v[2])) >> 14); |
| 1691 | t[1] = INT32((m[3]*INT64(v[0]) + m[4]*INT64(v[1]) + m[5]*INT64(v[2])) >> 14); |
| 1692 | t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14); |
| 1691 | 1693 | } |
| 1692 | 1694 | |
| 1693 | 1695 | void namcos23_state::c435_scaling_set() // 44.. |
| r29173 | r29174 | |
| 1730 | 1732 | |
| 1731 | 1733 | void namcos23_state::c435_render() // 800. 808. |
| 1732 | 1734 | { |
| 1733 | | if(m_c435_buffer[0] != 0x8003 && m_c435_buffer[0] != 0x8083) |
| 1735 | if(m_c435_buffer[0] != 0x8003 && m_c435_buffer[0] != 0x8043 && m_c435_buffer[0] != 0x8083) |
| 1734 | 1736 | { |
| 1735 | 1737 | logerror("WARNING: c435_render with header %04x\n", m_c435_buffer[0]); |
| 1736 | 1738 | return; |
| r29173 | r29174 | |
| 1812 | 1814 | case 0x4400: c435_scaling_set(); break; |
| 1813 | 1815 | case 0x4f00: c435_state_set(); break; |
| 1814 | 1816 | case 0x8000: c435_render(); break; |
| 1817 | case 0x8040: c435_render(); break; |
| 1815 | 1818 | case 0x8080: c435_render(); break; |
| 1816 | 1819 | case 0xc000: c435_flush(); break; |
| 1817 | 1820 | default: |
| r29173 | r29174 | |
| 1902 | 1905 | |
| 1903 | 1906 | void namcos23_state::render_apply_transform(INT32 xi, INT32 yi, INT32 zi, const namcos23_render_entry *re, poly_vertex &pv) |
| 1904 | 1907 | { |
| 1905 | | pv.x = (INT32((re->model.m[0]*INT64(xi) + re->model.m[3]*INT64(yi) + re->model.m[6]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[0])/16384.0; |
| 1906 | | pv.y = (INT32((re->model.m[1]*INT64(xi) + re->model.m[4]*INT64(yi) + re->model.m[7]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[1])/16384.0; |
| 1907 | | pv.p[0] = (INT32((re->model.m[2]*INT64(xi) + re->model.m[5]*INT64(yi) + re->model.m[8]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[2])/16384.0; |
| 1908 | pv.x = (INT32((re->model.m[0]*INT64(xi) + re->model.m[1]*INT64(yi) + re->model.m[2]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[0])/16384.0; |
| 1909 | pv.y = (INT32((re->model.m[3]*INT64(xi) + re->model.m[4]*INT64(yi) + re->model.m[5]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[1])/16384.0; |
| 1910 | pv.p[0] = (INT32((re->model.m[6]*INT64(xi) + re->model.m[7]*INT64(yi) + re->model.m[8]*INT64(zi)) >> 14)*re->model.scaling + re->model.v[2])/16384.0; |
| 1908 | 1911 | } |
| 1909 | 1912 | |
| 1910 | 1913 | void namcos23_state::render_apply_matrot(INT32 xi, INT32 yi, INT32 zi, const namcos23_render_entry *re, INT32 &x, INT32 &y, INT32 &z) |
| r29173 | r29174 | |
| 1963 | 1966 | UINT32 type = m_ptrom[adr++]; |
| 1964 | 1967 | UINT32 h = m_ptrom[adr++]; |
| 1965 | 1968 | |
| 1966 | | |
| 1967 | 1969 | float tbase = (type >> 24) << 12; |
| 1968 | 1970 | UINT8 color = (h >> 24) & 0x7f; |
| 1969 | 1971 | int lmode = (type >> 19) & 3; |
| r29173 | r29174 | |
| 2004 | 2006 | |
| 2005 | 2007 | switch(lmode) |
| 2006 | 2008 | { |
| 2007 | | case 0: case 1: |
| 2009 | case 0: |
| 2008 | 2010 | pv[i].p[3] = ((light >> (8*(3-i))) & 0xff) / 64.0; |
| 2009 | 2011 | break; |
| 2012 | case 1: |
| 2013 | pv[i].p[3] = ((light >> (8*(3-i))) & 0xff) / 64.0; |
| 2014 | break; |
| 2010 | 2015 | case 2: |
| 2011 | 2016 | pv[i].p[3] = 1.0; |
| 2012 | 2017 | break; |
| r29173 | r29174 | |
| 2018 | 2023 | INT32 nz = u32_to_s10(norm); |
| 2019 | 2024 | INT32 nrx, nry, nrz; |
| 2020 | 2025 | render_apply_matrot(nx, ny, nz, re, nrx, nry, nrz); |
| 2021 | | |
| 2022 | 2026 | float lsi = float(nrx*m_light_vector[0] + nry*m_light_vector[1] + nrz*m_light_vector[2])/4194304.0; |
| 2023 | 2027 | if(lsi < 0) |
| 2024 | 2028 | lsi = 0; |
| 2025 | 2029 | |
| 2026 | 2030 | // Mapping taken out of a hat |
| 2027 | | pv[i].p[3] = 0.5+lsi; |
| 2031 | pv[i].p[3] = 0.25+1.5*lsi; |
| 2028 | 2032 | break; |
| 2029 | 2033 | } |
| 2030 | 2034 | } |
| r29173 | r29174 | |
| 2201 | 2205 | if (m_c404.layer & 4) |
| 2202 | 2206 | m_bgtilemap->draw(screen, bitmap, cliprect, 0, 0); |
| 2203 | 2207 | |
| 2208 | m_vblank_count++; |
| 2209 | |
| 2204 | 2210 | return 0; |
| 2205 | 2211 | } |
| 2206 | 2212 | |
| r29173 | r29174 | |
| 2323 | 2329 | m_c417.pointrom_adr = 0; |
| 2324 | 2330 | break; |
| 2325 | 2331 | case 4: |
| 2326 | | //logerror("c417_w %04x = %04x (%08x, %08x)\n", c417.adr, data, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31)); |
| 2332 | //logerror("c417_w %04x = %04x (%08x, %08x)\n", m_c417.adr, data, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31)); |
| 2327 | 2333 | COMBINE_DATA(m_c417.ram + m_c417.adr); |
| 2328 | 2334 | break; |
| 2329 | 2335 | case 7: |
| r29173 | r29174 | |
| 3164 | 3170 | PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 3165 | 3171 | |
| 3166 | 3172 | PORT_START("SERVICE") |
| 3167 | | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 ) |
| 3173 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE ) |
| 3168 | 3174 | |
| 3169 | 3175 | PORT_START("DSW") |
| 3170 | 3176 | PORT_SERVICE( 0x01, IP_ACTIVE_LOW ) |
| r29173 | r29174 | |
| 3222 | 3228 | |
| 3223 | 3229 | void namcos23_state::machine_reset() |
| 3224 | 3230 | { |
| 3231 | m_vblank_count = 0; |
| 3225 | 3232 | m_c435_buffer_pos = 0; |
| 3226 | 3233 | m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 3227 | 3234 | } |