Previous 199869 Revisions Next

r29174 Wednesday 2nd April, 2014 at 07:26:45 UTC by O. Galibert
namcos23: Fix 3D computations in timecrs2 [O. Galibert]
[src/mame/drivers]namcos23.c

trunk/src/mame/drivers/namcos23.c
r29173r29174
14271427   UINT32 m_tile_mask;
14281428   UINT32 m_ptrom_limit;
14291429
1430   int m_vblank_count;
1431
14301432// It may only be 128
14311433// At 0x1e bytes per slot, rounded up to 0x20, that's 0x1000 to 0x2000 bytes.
14321434// That fits pretty much anywhere, including inside a IC
r29173r29174
16141616      logerror("WARNING: c435_matrix_matrix_mul with +2=%04x\n", m_c435_buffer[3]);
16151617
16161618   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]);
16191621
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);
16291631}
16301632
16311633void namcos23_state::c435_matrix_set() // 004.
r29173r29174
16671669   const INT32 *v = c435_getv(m_c435_buffer[4]);
16681670
16691671   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);
16711673   t[2] = INT32((m[6]*INT64(v[0]) + m[7]*INT64(v[1]) + m[8]*INT64(v[2])) >> 14);
16721674}
16731675
r29173r29174
16851687   const INT16 *m = c435_getm(m_c435_buffer[2]);
16861688   const INT32 *v = c435_getv(m_c435_buffer[4]);
16871689
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);
16911693}
16921694
16931695void namcos23_state::c435_scaling_set() // 44..
r29173r29174
17301732
17311733void namcos23_state::c435_render() // 800. 808.
17321734{
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)
17341736   {
17351737      logerror("WARNING: c435_render with header %04x\n", m_c435_buffer[0]);
17361738      return;
r29173r29174
18121814   case 0x4400: c435_scaling_set(); break;
18131815   case 0x4f00: c435_state_set(); break;
18141816   case 0x8000: c435_render(); break;
1817   case 0x8040: c435_render(); break;
18151818   case 0x8080: c435_render(); break;
18161819   case 0xc000: c435_flush(); break;
18171820   default:
r29173r29174
19021905
19031906void namcos23_state::render_apply_transform(INT32 xi, INT32 yi, INT32 zi, const namcos23_render_entry *re, poly_vertex &pv)
19041907{
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;
19081911}
19091912
19101913void namcos23_state::render_apply_matrot(INT32 xi, INT32 yi, INT32 zi, const namcos23_render_entry *re, INT32 &x, INT32 &y, INT32 &z)
r29173r29174
19631966      UINT32 type = m_ptrom[adr++];
19641967      UINT32 h    = m_ptrom[adr++];
19651968
1966
19671969      float tbase = (type >> 24) << 12;
19681970      UINT8 color = (h >> 24) & 0x7f;
19691971      int lmode = (type >> 19) & 3;
r29173r29174
20042006
20052007         switch(lmode)
20062008         {
2007         case 0: case 1:
2009         case 0:
20082010            pv[i].p[3] = ((light >> (8*(3-i))) & 0xff) / 64.0;
20092011            break;
2012         case 1:
2013            pv[i].p[3] = ((light >> (8*(3-i))) & 0xff) / 64.0;
2014            break;
20102015         case 2:
20112016            pv[i].p[3] = 1.0;
20122017            break;
r29173r29174
20182023            INT32 nz = u32_to_s10(norm);
20192024            INT32 nrx, nry, nrz;
20202025            render_apply_matrot(nx, ny, nz, re, nrx, nry, nrz);
2021
20222026            float lsi = float(nrx*m_light_vector[0] + nry*m_light_vector[1] + nrz*m_light_vector[2])/4194304.0;
20232027            if(lsi < 0)
20242028               lsi = 0;
20252029
20262030            // Mapping taken out of a hat
2027            pv[i].p[3] = 0.5+lsi;
2031            pv[i].p[3] = 0.25+1.5*lsi;
20282032            break;
20292033         }
20302034         }
r29173r29174
22012205   if (m_c404.layer & 4)
22022206      m_bgtilemap->draw(screen, bitmap, cliprect, 0, 0);
22032207
2208   m_vblank_count++;
2209
22042210   return 0;
22052211}
22062212
r29173r29174
23232329         m_c417.pointrom_adr = 0;
23242330         break;
23252331      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));
23272333         COMBINE_DATA(m_c417.ram + m_c417.adr);
23282334         break;
23292335      case 7:
r29173r29174
31643170   PORT_BIT( 0xffff, IP_ACTIVE_LOW, IPT_UNKNOWN )
31653171
31663172   PORT_START("SERVICE")
3167   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE1 )
3173   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_SERVICE )
31683174
31693175   PORT_START("DSW")
31703176   PORT_SERVICE( 0x01, IP_ACTIVE_LOW )
r29173r29174
32223228
32233229void namcos23_state::machine_reset()
32243230{
3231   m_vblank_count = 0;
32253232   m_c435_buffer_pos = 0;
32263233   m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
32273234}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team