Previous 199869 Revisions Next

r37121 Saturday 11th April, 2015 at 18:54:51 UTC by hap
undo the intrusive personal-style changes i did a while ago, make Sarayan feel home again =)
[src/mame/drivers]namcos23.c

trunk/src/mame/drivers/namcos23.c
r245632r245633
15901590{
15911591   if(id == 0x8000)
15921592      return m_light_vector;
1593   if(id >= 0x100)
1594   {
1593   if(id >= 0x100) {
15951594      memset(m_spv, 0, sizeof(m_spv));
15961595      return m_spv;
15971596   }
r245632r245633
16001599
16011600INT16 *namcos23_state::c435_getm(UINT16 id)
16021601{
1603   if(id >= 0x100)
1604   {
1602   if(id >= 0x100) {
16051603      memset(m_spm, 0, sizeof(m_spm));
16061604      return m_spm;
16071605   }
r245632r245633
16101608
16111609void namcos23_state::c435_matrix_matrix_mul() // 0.0
16121610{
1613   if((m_c435_buffer[0] & 0xf) != 4)
1614   {
1611   if((m_c435_buffer[0] & 0xf) != 4) {
16151612      logerror("WARNING: c435_matrix_matrix_mul with size %d\n", m_c435_buffer[0] & 0xf);
16161613      return;
16171614   }
r245632r245633
16351632
16361633void namcos23_state::c435_matrix_vector_mul() // 0.1
16371634{
1638   if((m_c435_buffer[0] & 0xf) != 4)
1639   {
1635   if((m_c435_buffer[0] & 0xf) != 4) {
16401636      logerror("WARNING: c435_matrix_vector_mul with size %d\n", m_c435_buffer[0] & 0xf);
16411637      return;
16421638   }
r245632r245633
16641660
16651661void namcos23_state::c435_matrix_set() // 0.4
16661662{
1667   if((m_c435_buffer[0] & 0xf) != 10)
1668   {
1663   if((m_c435_buffer[0] & 0xf) != 10) {
16691664      logerror("WARNING: c435_matrix_set with size %d\n", m_c435_buffer[0] & 0xf);
16701665      return;
16711666   }
r245632r245633
16761671
16771672void namcos23_state::c435_vector_set() // 0.5
16781673{
1679   if((m_c435_buffer[0] & 0xf) != 7)
1680   {
1674   if((m_c435_buffer[0] & 0xf) != 7) {
16811675      logerror("WARNING: c435_vector_set with size %d\n", m_c435_buffer[0] & 0xf);
16821676      return;
16831677   }
r245632r245633
16881682
16891683void namcos23_state::c435_scaling_set() // 4.4
16901684{
1691   if((m_c435_buffer[0] & 0xff) != 1)
1692   {
1685   if((m_c435_buffer[0] & 0xff) != 1) {
16931686      logerror("WARNING: c435_scaling_set with size %d\n", m_c435_buffer[0] & 0xff);
16941687      return;
16951688   }
r245632r245633
16981691
16991692void namcos23_state::c435_state_set_interrupt() // 4.f.0001
17001693{
1701   if(m_c435_buffer[0] != 0x4f02)
1702   {
1694   if(m_c435_buffer[0] != 0x4f02) {
17031695      logerror("WARNING: c435_state_set_interrupt with size %d\n", m_c435_buffer[0] & 0xff);
17041696      return;
17051697   }
r245632r245633
17111703
17121704void namcos23_state::c435_state_set() // 4.f
17131705{
1714   if((m_c435_buffer[0] & 0xff) == 0)
1715   {
1706   if((m_c435_buffer[0] & 0xff) == 0) {
17161707      logerror("WARNING: c435_state_set with size %d\n", m_c435_buffer[0] & 0xff);
17171708      return;
17181709   }
r245632r245633
17261717
17271718void namcos23_state::c435_render() // 8
17281719{
1729   if((m_c435_buffer[0] & 0xf) != 3)
1730   {
1720   if((m_c435_buffer[0] & 0xf) != 3) {
17311721      logerror("WARNING: c435_render with size %d, header %04x", m_c435_buffer[0] & 0xf, m_c435_buffer[0]);
17321722      return;
17331723   }
r245632r245633
17371727
17381728   logerror("render model %x %swith matrix %x and vector %x\n", m_c435_buffer[1], use_scaling ? "scaled " : "", m_c435_buffer[2], m_c435_buffer[3]);
17391729
1740   if(render.count[render.cur] >= RENDER_MAX_ENTRIES)
1741   {
1730   if(render.count[render.cur] >= RENDER_MAX_ENTRIES) {
17421731      logerror("WARNING: render buffer full\n");
17431732      return;
17441733   }
r245632r245633
17661755
17671756void namcos23_state::c435_flush() // c
17681757{
1769   if((m_c435_buffer[0] & 0xf) != 0)
1770   {
1758   if((m_c435_buffer[0] & 0xf) != 0) {
17711759      logerror("WARNING: c435_flush with size %d\n", m_c435_buffer[0] & 0xf);
17721760      return;
17731761   }
r245632r245633
18351823
18361824READ32_MEMBER(namcos23_state::c435_r)
18371825{
1838   switch (offset)
1839   {
1840      case 0xa:
1841         return 1; // Busy flag
1826   switch(offset) {
1827   case 0xa:
1828      return 1; // Busy flag
18421829   }
18431830
18441831   logerror("c435_r %02x @ %08x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
r245632r245633
18471834
18481835WRITE32_MEMBER(namcos23_state::c435_w)
18491836{
1850   switch (offset)
1851   {
1852      case 0x7:
1853         COMBINE_DATA(&m_c435_address);
1854         break;
1855      case 0x8:
1856         COMBINE_DATA(&m_c435_size);
1857         break;
1858      case 0x9:
1859         if (data & 1)
1860            c435_dma(space, m_c435_address, m_c435_size);
1861         break;
1862      default:
1863         logerror("c435_w %02x, %08x @ %08x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
1864         break;
1837   switch(offset) {
1838   case 0x7:
1839      COMBINE_DATA(&m_c435_address);
1840      break;
1841   case 0x8:
1842      COMBINE_DATA(&m_c435_size);
1843      break;
1844   case 0x9:
1845      if(data & 1)
1846         c435_dma(space, m_c435_address, m_c435_size);
1847      break;
1848   default:
1849      logerror("c435_w %02x, %08x @ %08x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
1850      break;
18651851   }
18661852}
18671853
r245632r245633
18831869   bitmap_rgb32 *bitmap = (bitmap_rgb32 *)dest;
18841870   UINT32 *img = &bitmap->pix32(scanline, extent->startx);
18851871
1886   for(int x = extent->startx; x < extent->stopx; x++)
1887   {
1872   for(int x = extent->startx; x < extent->stopx; x++) {
18881873      float z = w ? 1/w : 0;
18891874      UINT32 pcol = rd->texture_lookup(*rd->machine, rd->pens, u*z, v*z);
18901875      float ll = l*z;
r245632r245633
19481933{
19491934   render_t &render = m_render;
19501935   UINT32 adr = m_ptrom[re->model.model];
1951   if(adr >= m_ptrom_limit)
1952   {
1936   if(adr >= m_ptrom_limit) {
19531937      logerror("WARNING: model %04x base address %08x out-of-bounds - pointram?\n", re->model.model, adr);
19541938      return;
19551939   }
19561940
1957   while(adr < m_ptrom_limit)
1958   {
1941   while(adr < m_ptrom_limit) {
19591942      poly_vertex pv[15];
19601943
19611944      UINT32 type = m_ptrom[adr++];
r245632r245633
19731956      UINT32 light = 0;
19741957      UINT32 extptr = 0;
19751958
1976      if(lmode == 3)
1977      {
1959      if(lmode == 3) {
19781960         extptr = adr;
19791961         adr += ne;
19801962      }
r245632r245633
19841966      float minz = FLT_MAX;
19851967      float maxz = FLT_MIN;
19861968
1987      for(int i=0; i<ne; i++)
1988      {
1969      for(int i=0; i<ne; i++) {
19891970         UINT32 v1 = m_ptrom[adr++];
19901971         UINT32 v2 = m_ptrom[adr++];
19911972         UINT32 v3 = m_ptrom[adr++];
r245632r245633
19991980         if(pv[i].p[0] < minz)
20001981            minz = pv[i].p[0];
20011982
2002         switch(lmode)
2003         {
1983         switch(lmode) {
20041984         case 0:
20051985            pv[i].p[3] = ((light >> (8*(3-i))) & 0xff) / 64.0;
20061986            break;
r245632r245633
20101990         case 2:
20111991            pv[i].p[3] = 1.0;
20121992            break;
2013         case 3:
2014         {
1993         case 3: {
20151994            UINT32 norm = m_ptrom[extptr++];
20161995            INT32 nx = u32_to_s10(norm >> 20);
20171996            INT32 ny = u32_to_s10(norm >> 10);
r245632r245633
20332012
20342013      p->vertex_count = poly_zclip_if_less(ne, pv, p->pv, 4, 0.001f);
20352014
2036      if(p->vertex_count >= 3)
2037      {
2038         for(int i=0; i<p->vertex_count; i++)
2039         {
2015      if(p->vertex_count >= 3) {
2016         for(int i=0; i<p->vertex_count; i++) {
20402017            render_project(p->pv[i]);
20412018            float w = p->pv[i].p[0];
20422019            p->pv[i].p[1] *= w;
r245632r245633
20812058
20822059   const static rectangle scissor(0, 639, 0, 479);
20832060
2084   for(int i=0; i<render.poly_count; i++)
2085   {
2061   for(int i=0; i<render.poly_count; i++) {
20862062      const namcos23_poly_entry *p = render.poly_order[i];
20872063      namcos23_render_data *rd = (namcos23_render_data *)poly_get_extra_data(render.polymgr);
20882064      *rd = p->rd;
r245632r245633
20972073   const namcos23_render_entry *re = render.entries[!render.cur];
20982074
20992075   render.poly_count = 0;
2100   for(int i=0; i<render.count[!render.cur]; i++)
2101   {
2102      switch(re->type)
2103      {
2076   for(int i=0; i<render.count[!render.cur]; i++) {
2077      switch(re->type) {
21042078      case MODEL:
21052079         render_one_model(re);
21062080         break;
r245632r245633
21372111   COMBINE_DATA(&m_generic_paletteram_32[offset]);
21382112
21392113   // each LONGWORD is 2 colors, each OFFSET is 2 colors
2140   for (int i = 0; i < 2; i++)
2141   {
2114   for(int i = 0; i < 2; i++) {
21422115      int which = (offset << 2 | i << 1) & 0xfffe;
21432116      int r = nthbyte(m_generic_paletteram_32, which|0x00001);
21442117      int g = nthbyte(m_generic_paletteram_32, which|0x10001);
r245632r245633
21972170   render_run(bitmap);
21982171
21992172   m_bgtilemap->set_palette_offset(m_c404.palbase);
2200   if (m_c404.layer & 4)
2173   if(m_c404.layer & 4)
22012174      m_bgtilemap->draw(screen, bitmap, cliprect, 0, 0);
22022175
22032176   m_vblank_count++;
r245632r245633
22242197   m_main_irqcause = cause;
22252198
22262199   // level 2: vblank
2227   if (changed & MAIN_VBLANK_IRQ)
2200   if(changed & MAIN_VBLANK_IRQ)
22282201      m_maincpu->set_input_line(MIPS3_IRQ0, (cause & MAIN_VBLANK_IRQ) ? ASSERT_LINE : CLEAR_LINE);
22292202
22302203   // level 3: C361/subcpu
2231   if (changed & (MAIN_C361_IRQ | MAIN_SUBCPU_IRQ))
2204   if(changed & (MAIN_C361_IRQ | MAIN_SUBCPU_IRQ))
22322205      m_maincpu->set_input_line(MIPS3_IRQ1, (cause & (MAIN_C361_IRQ | MAIN_SUBCPU_IRQ)) ? ASSERT_LINE : CLEAR_LINE);
22332206
22342207   // level 4: C435
2235   if (changed & MAIN_C435_IRQ)
2208   if(changed & MAIN_C435_IRQ)
22362209      m_maincpu->set_input_line(MIPS3_IRQ2, (cause & MAIN_C435_IRQ) ? ASSERT_LINE : CLEAR_LINE);
22372210
22382211   // level 5: C422
2239   if (changed & MAIN_C422_IRQ)
2212   if(changed & MAIN_C422_IRQ)
22402213      m_maincpu->set_input_line(MIPS3_IRQ3, (cause & MAIN_C422_IRQ) ? ASSERT_LINE : CLEAR_LINE);
22412214
22422215   // crszone(sys23ev2) has a different configuration, are they hardwired or configured by software? (where?)..
r245632r245633
22482221
22492222INTERRUPT_GEN_MEMBER(namcos23_state::interrupt)
22502223{
2251   if (!m_ctl_vbl_active)
2252   {
2224   if(!m_ctl_vbl_active) {
22532225      m_ctl_vbl_active = true;
22542226      update_main_interrupts(m_main_irqcause | MAIN_VBLANK_IRQ);
22552227   }
r245632r245633
22702242
22712243READ16_MEMBER(namcos23_state::c417_r)
22722244{
2273   switch (offset)
2274   {
2275      /* According to timecrs2v4a, +0 is the status word with bits being:
2276         15: test mode flag (huh?)
2277         10: fifo data ready
2278         9:  cmd ram data ready
2279         8:  matrix busy
2280         7:  output unit busy (inverted)
2281         6:  hokan/tenso unit busy
2282         5:  point unit busy
2283         4:  access unit busy
2284         3:  c403 busy, called c444 in 500gp (inverted)
2285         2:  2nd c435 busy (inverted)
2286         1:  1st c435 busy (inverted)
2287         0:  xcpreq
2288       */
2289      case 0:
2290         return 0x8e | (m_screen->vblank() ? 0x0000 : 0x8000);
2291      case 1:
2292         return m_c417.adr;
2293      case 4:
2294         //logerror("c417_r %04x = %04x (%08x, %08x)\n", c417.adr, c417.ram[c417.adr], space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2295         return m_c417.ram[m_c417.adr];
2296      case 5:
2297         if (m_c417.pointrom_adr >= m_ptrom_limit)
2298            return 0xffff;
2299         return m_ptrom[m_c417.pointrom_adr] >> 16;
2300      case 6:
2301         if (m_c417.pointrom_adr >= m_ptrom_limit)
2302            return 0xffff;
2303         return m_ptrom[m_c417.pointrom_adr];
2245   switch(offset) {
2246   /* According to timecrs2v4a, +0 is the status word with bits being:
2247      15: test mode flag (huh?)
2248      10: fifo data ready
2249      9:  cmd ram data ready
2250      8:  matrix busy
2251      7:  output unit busy (inverted)
2252      6:  hokan/tenso unit busy
2253      5:  point unit busy
2254      4:  access unit busy
2255      3:  c403 busy, called c444 in 500gp (inverted)
2256      2:  2nd c435 busy (inverted)
2257      1:  1st c435 busy (inverted)
2258      0:  xcpreq
2259   */
2260   case 0:
2261      return 0x8e | (m_screen->vblank() ? 0x0000 : 0x8000);
2262   case 1:
2263      return m_c417.adr;
2264   case 4:
2265      //logerror("c417_r %04x = %04x (%08x, %08x)\n", c417.adr, c417.ram[c417.adr], space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2266      return m_c417.ram[m_c417.adr];
2267   case 5:
2268      if(m_c417.pointrom_adr >= m_ptrom_limit)
2269         return 0xffff;
2270      return m_ptrom[m_c417.pointrom_adr] >> 16;
2271   case 6:
2272      if(m_c417.pointrom_adr >= m_ptrom_limit)
2273         return 0xffff;
2274      return m_ptrom[m_c417.pointrom_adr];
23042275   }
23052276
23062277   logerror("c417_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
r245632r245633
23092280
23102281WRITE16_MEMBER(namcos23_state::c417_w)
23112282{
2312   switch (offset)
2313   {
2314      case 0:
2315         c435_pio_w(data);
2316         break;
2317      case 1:
2318         COMBINE_DATA(&m_c417.adr);
2319         break;
2320      case 2:
2321         m_c417.pointrom_adr = (m_c417.pointrom_adr << 16) | data;
2322         break;
2323      case 3:
2324         m_c417.pointrom_adr = 0;
2325         break;
2326      case 4:
2327         //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));
2328         COMBINE_DATA(m_c417.ram + m_c417.adr);
2329         break;
2330      case 7:
2331         logerror("c417_w: ack IRQ 2 (%x)\n", data);
2332         update_main_interrupts(m_main_irqcause & ~MAIN_C435_IRQ);
2333         break;
2334      default:
2335         logerror("c417_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2336         break;
2283   switch(offset) {
2284   case 0:
2285      c435_pio_w(data);
2286      break;
2287   case 1:
2288      COMBINE_DATA(&m_c417.adr);
2289      break;
2290   case 2:
2291      m_c417.pointrom_adr = (m_c417.pointrom_adr << 16) | data;
2292      break;
2293   case 3:
2294      m_c417.pointrom_adr = 0;
2295      break;
2296   case 4:
2297      //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));
2298      COMBINE_DATA(m_c417.ram + m_c417.adr);
2299      break;
2300   case 7:
2301      logerror("c417_w: ack IRQ 2 (%x)\n", data);
2302      update_main_interrupts(m_main_irqcause & ~MAIN_C435_IRQ);
2303      break;
2304   default:
2305      logerror("c417_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2306      break;
23372307   }
23382308}
23392309
r245632r245633
23712341
23722342READ16_MEMBER(namcos23_state::c412_r)
23732343{
2374   switch (offset)
2375   {
2376      case 0x3:
2377         return 0x0002; // 0001 = busy, 0002 = game uploads things
2378      case 0x8:
2379         return m_c412.adr;
2380      case 0x9:
2381         return m_c412.adr >> 16;
2382      case 0xa:
2383         return c412_ram_r(space, m_c412.adr, mem_mask);
2384      case 0xc:
2385         // unknown status, 500gp reads it and waits for a transition
2386         // no other games use it?
2387         m_c412.status_c ^= 1;
2388         return m_c412.status_c;
2344   switch(offset) {
2345   case 0x3:
2346      return 0x0002; // 0001 = busy, 0002 = game uploads things
2347   case 0x8:
2348      return m_c412.adr;
2349   case 0x9:
2350      return m_c412.adr >> 16;
2351   case 0xa:
2352      return c412_ram_r(space, m_c412.adr, mem_mask);
2353   case 0xc:
2354      // unknown status, 500gp reads it and waits for a transition
2355      // no other games use it?
2356      m_c412.status_c ^= 1;
2357      return m_c412.status_c;
23892358   }
23902359
23912360   logerror("c412_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
r245632r245633
23942363
23952364WRITE16_MEMBER(namcos23_state::c412_w)
23962365{
2397   switch (offset)
2398   {
2399      case 0x2:
2400         // d0: cz on
2401         // other bits: no function?
2402         break;
2403      case 0x8:
2404         m_c412.adr = (data & mem_mask) | (m_c412.adr & (0xffffffff ^ mem_mask));
2405         break;
2406      case 0x9:
2407         m_c412.adr = ((data & mem_mask) << 16) | (m_c412.adr & (0xffffffff ^ (mem_mask << 16)));
2408         break;
2409      case 0xa:
2410         c412_ram_w(space, m_c412.adr, data, mem_mask);
2411         m_c412.adr += 2;
2412         break;
2413      default:
2414         logerror("c412_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2415         break;
2366   switch(offset) {
2367   case 0x2:
2368      // d0: cz on
2369      // other bits: no function?
2370      break;
2371   case 0x8:
2372      m_c412.adr = (data & mem_mask) | (m_c412.adr & (0xffffffff ^ mem_mask));
2373      break;
2374   case 0x9:
2375      m_c412.adr = ((data & mem_mask) << 16) | (m_c412.adr & (0xffffffff ^ (mem_mask << 16)));
2376      break;
2377   case 0xa:
2378      c412_ram_w(space, m_c412.adr, data, mem_mask);
2379      m_c412.adr += 2;
2380      break;
2381   default:
2382      logerror("c412_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2383      break;
24162384   }
24172385}
24182386
r245632r245633
24462414
24472415READ16_MEMBER(namcos23_state::c421_r)
24482416{
2449   switch (offset)
2450   {
2451      case 0:
2452         return c421_ram_r(space, m_c421.adr & 0xfffff, mem_mask);
2417   switch(offset) {
2418   case 0:
2419      return c421_ram_r(space, m_c421.adr & 0xfffff, mem_mask);
24532420
2454      case 2:
2455         return m_c421.adr >> 16;
2456      case 3:
2457         return m_c421.adr;
2421   case 2:
2422      return m_c421.adr >> 16;
2423   case 3:
2424      return m_c421.adr;
24582425   }
24592426
24602427   logerror("c421_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
r245632r245633
24632430
24642431WRITE16_MEMBER(namcos23_state::c421_w)
24652432{
2466   switch (offset)
2467   {
2468      case 0:
2469         c421_ram_w(space, m_c421.adr & 0xfffff, data, mem_mask);
2470         m_c421.adr += 2;
2471         break;
2472      case 2:
2473         m_c421.adr = ((data & mem_mask) << 16) | (m_c421.adr & (0xffffffff ^ (mem_mask << 16)));
2474         break;
2475      case 3:
2476         m_c421.adr = (data & mem_mask) | (m_c421.adr & (0xffffffff ^ mem_mask));
2477         break;
2478      default:
2479         logerror("c421_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2480         break;
2433   switch(offset) {
2434   case 0:
2435      c421_ram_w(space, m_c421.adr & 0xfffff, data, mem_mask);
2436      m_c421.adr += 2;
2437      break;
2438   case 2:
2439      m_c421.adr = ((data & mem_mask) << 16) | (m_c421.adr & (0xffffffff ^ (mem_mask << 16)));
2440      break;
2441   case 3:
2442      m_c421.adr = (data & mem_mask) | (m_c421.adr & (0xffffffff ^ mem_mask));
2443      break;
2444   default:
2445      logerror("c421_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2446      break;
24812447   }
24822448}
24832449
r245632r245633
24922458
24932459WRITE16_MEMBER(namcos23_state::c422_w)
24942460{
2495   switch (offset)
2496   {
2497      case 1:
2498         if (data == 0xfffb)
2499         {
2500            logerror("c422_w: raise IRQ 3\n");
2501            update_main_interrupts(m_main_irqcause | MAIN_C422_IRQ);
2502         }
2503         else if (data == 0x000f)
2504         {
2505            logerror("c422_w: ack IRQ 3\n");
2506            update_main_interrupts(m_main_irqcause & ~MAIN_C422_IRQ);
2507         }
2508         break;
2461   switch(offset) {
2462   case 1:
2463      if(data == 0xfffb) {
2464         logerror("c422_w: raise IRQ 3\n");
2465         update_main_interrupts(m_main_irqcause | MAIN_C422_IRQ);
2466      }
2467      else if(data == 0x000f) {
2468         logerror("c422_w: ack IRQ 3\n");
2469         update_main_interrupts(m_main_irqcause & ~MAIN_C422_IRQ);
2470      }
2471      break;
25092472
2510      default:
2511         logerror("c422_w: %04x @ %x\n", data, offset);
2512         break;
2473   default:
2474      logerror("c422_w: %04x @ %x\n", data, offset);
2475      break;
25132476   }
25142477
25152478   COMBINE_DATA(&m_c422.regs[offset]);
r245632r245633
25212484
25222485TIMER_CALLBACK_MEMBER(namcos23_state::c361_timer_cb)
25232486{
2524   if (m_c361.scanline != 0x1ff)
2525   {
2487   if(m_c361.scanline != 0x1ff) {
25262488      // need to do a partial update here, but doesn't work properly yet
25272489      //m_screen->update_partial(m_screen->vpos());
25282490      update_main_interrupts(m_main_irqcause | MAIN_C361_IRQ);
r245632r245633
25362498
25372499WRITE16_MEMBER(namcos23_state::c361_w)
25382500{
2539   switch (offset)
2540   {
2541      case 0:
2542         m_bgtilemap->set_scrollx(0, data&0xfff);
2543         break;
2501   switch(offset) {
2502   case 0:
2503      m_bgtilemap->set_scrollx(0, data&0xfff);
2504      break;
25442505
2545      case 1:
2546         m_bgtilemap->set_scrolly(0, data&0xfff);
2547         break;
2506   case 1:
2507      m_bgtilemap->set_scrolly(0, data&0xfff);
2508      break;
25482509
2549      case 4: // interrupt control
2550         m_c361.scanline = data & 0x1ff;
2551         m_c361.timer->adjust(m_screen->time_until_pos(m_c361.scanline));
2552         break;
2510   case 4: // interrupt control
2511      m_c361.scanline = data & 0x1ff;
2512      m_c361.timer->adjust(m_screen->time_until_pos(m_c361.scanline));
2513      break;
25532514
2554      default:
2555         logerror("c361_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2556         break;
2515   default:
2516      logerror("c361_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2517      break;
25572518   }
25582519}
25592520
25602521READ16_MEMBER(namcos23_state::c361_r)
25612522{
2562   switch (offset)
2563   {
2564      // current raster position
2565      // how does it work exactly? it's not understood in namcos22 either (also has a c361)
2566      case 5:
2567         update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ);
2568         return (m_screen->vpos()*2) | (m_screen->vblank() ? 1 : 0);
2569      case 6:
2570         update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ);
2571         return m_screen->vblank() ? 1 : 0;
2523   switch(offset) {
2524   // current raster position
2525   // how does it work exactly? it's not understood in namcos22 either (also has a c361)
2526   case 5:
2527      update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ);
2528      return (m_screen->vpos()*2) | (m_screen->vblank() ? 1 : 0);
2529   case 6:
2530      update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ);
2531      return m_screen->vblank() ? 1 : 0;
25722532   }
25732533
25742534   logerror("c361_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
r245632r245633
25812541
25822542WRITE16_MEMBER(namcos23_state::ctl_w)
25832543{
2584   switch (offset)
2585   {
2586      case 0:
2587         if (m_ctl_led != (data & 0xff))
2588         {
2589            m_ctl_led = data & 0xff;
2590            for (int i = 0; i < 8; i++)
2591               output_set_lamp_value(i, (~data<<i & 0x80) ? 0 : 1);
2592         }
2593         break;
2544   switch(offset) {
2545   case 0:
2546      if(m_ctl_led != (data & 0xff)) {
2547         m_ctl_led = data & 0xff;
2548         for(int i = 0; i < 8; i++)
2549            output_set_lamp_value(i, (~data<<i & 0x80) ? 0 : 1);
2550      }
2551      break;
25942552
2595      case 2: case 3:
2596         // These may be coming from another CPU, in particular the I/O one
2597         m_ctl_inp_buffer[offset-2] = (offset == 2 ? m_p1 : m_p2)->read();
2598         break;
2599      case 5:
2600         if(m_ctl_vbl_active)
2601         {
2602            m_ctl_vbl_active = false;
2603            update_main_interrupts(m_main_irqcause & ~MAIN_VBLANK_IRQ);
2604         }
2605         break;
2553   case 2: case 3:
2554      // These may be coming from another CPU, in particular the I/O one
2555      m_ctl_inp_buffer[offset-2] = (offset == 2 ? m_p1 : m_p2)->read();
2556      break;
2557   case 5:
2558      if(m_ctl_vbl_active) {
2559         m_ctl_vbl_active = false;
2560         update_main_interrupts(m_main_irqcause & ~MAIN_VBLANK_IRQ);
2561      }
2562      break;
26062563
2607      case 6: // gmen wars spams this heavily with 0 prior to starting the GMEN board test
2608         if (data != 0)
2609            logerror("ctl_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2610         break;
2611
2612      default:
2564   case 6: // gmen wars spams this heavily with 0 prior to starting the GMEN board test
2565      if(data != 0)
26132566         logerror("ctl_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2614         break;
2567      break;
2568
2569   default:
2570      logerror("ctl_w %x, %04x @ %04x (%08x, %08x)\n", offset, data, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
2571      break;
26152572   }
26162573}
26172574
26182575READ16_MEMBER(namcos23_state::ctl_r)
26192576{
2620   switch (offset)
2621   {
2622      // 0100 set freezes gorgon (polygon fifo flag)
2623      case 1:
2624         return 0x0000 | ioport("DSW")->read() | ((m_main_irqcause & MAIN_C361_IRQ) ? 0x400 : 0);
2625      case 2: case 3:
2626      {
2627         UINT16 res = m_ctl_inp_buffer[offset-2] & 0x800 ? 0xffff : 0x0000;
2628         m_ctl_inp_buffer[offset-2] = (m_ctl_inp_buffer[offset-2] << 1) | 1;
2629         return res;
2630      }
2577   switch(offset) {
2578   // 0100 set freezes gorgon (polygon fifo flag)
2579   case 1:
2580      return 0x0000 | ioport("DSW")->read() | ((m_main_irqcause & MAIN_C361_IRQ) ? 0x400 : 0);
2581   case 2: case 3: {
2582      UINT16 res = m_ctl_inp_buffer[offset-2] & 0x800 ? 0xffff : 0x0000;
2583      m_ctl_inp_buffer[offset-2] = (m_ctl_inp_buffer[offset-2] << 1) | 1;
2584      return res;
26312585   }
2586   }
26322587
26332588   logerror("ctl_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31));
26342589   return 0xffff;
r245632r245633
26402595
26412596WRITE16_MEMBER(namcos23_state::mcuen_w)
26422597{
2643   switch (offset)
2644   {
2645      case 2:
2646         // subcpu irq ack
2647         update_main_interrupts(m_main_irqcause & ~MAIN_SUBCPU_IRQ);
2648         break;
2598   switch(offset) {
2599   case 2:
2600      // subcpu irq ack
2601      update_main_interrupts(m_main_irqcause & ~MAIN_SUBCPU_IRQ);
2602      break;
26492603
2650      case 5:
2651         // boot/start the audio mcu
2652         if (data)
2653         {
2654            logerror("mcuen_w: booting H8/3002\n");
2604   case 5:
2605      // boot/start the audio mcu
2606      if(data) {
2607         logerror("mcuen_w: booting H8/3002\n");
26552608
2656            // Panic Park: writing 1 when it's already running means reboot?
2657            if (m_subcpu_running)
2658            {
2659               m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
2660            }
2661
2662            m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
2663            m_subcpu_running = true;
2664         }
2665         else
2666         {
2667            logerror("mcuen_w: stopping H8/3002\n");
2609         // Panic Park: writing 1 when it's already running means reboot?
2610         if(m_subcpu_running) {
26682611            m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
2669            m_subcpu_running = false;
26702612         }
2671         break;
26722613
2673      default:
2674         logerror("mcuen_w: mask %04x, data %04x @ %x\n", mem_mask, data, offset);
2675         break;
2614         m_subcpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE);
2615         m_subcpu_running = true;
2616      } else {
2617         logerror("mcuen_w: stopping H8/3002\n");
2618         m_subcpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE);
2619         m_subcpu_running = false;
2620      }
2621      break;
2622
2623   default:
2624      logerror("mcuen_w: mask %04x, data %04x @ %x\n", mem_mask, data, offset);
2625      break;
26762626   }
26772627}
26782628
r245632r245633
27982748   UINT16 *shared16 = reinterpret_cast<UINT16 *>(m_shared_ram.target());
27992749
28002750   // fake that an I/O board is connected for games w/o a dump or that aren't properly communicating with it yet
2801   if (!m_has_jvsio)
2802   {
2803      if ((offset == 0x4052/2) && (data == 0x78))
2804      {
2751   if(!m_has_jvsio) {
2752      if((offset == 0x4052/2) && (data == 0x78)) {
28052753         data = 0;
28062754      }
28072755   }
r245632r245633
28192767
28202768WRITE16_MEMBER(namcos23_state::sub_interrupt_main_w)
28212769{
2822   if  ((mem_mask == 0xffff) && (data == 0x3170))
2823   {
2770   if((mem_mask == 0xffff) && (data == 0x3170)) {
28242771      update_main_interrupts(m_main_irqcause | MAIN_SUBCPU_IRQ);
2825   }
2826   else
2827   {
2772   } else {
28282773      logerror("Unknown write %x to sub_interrupt_main_w!\n", data);
28292774   }
28302775}
r245632r245633
29932938   UINT16 ypos = m_lighty->read();
29942939   // ypos is not completely understood yet, there should be a difference between case 1/4 and 2/5
29952940
2996   switch(offset)
2997   {
2941   switch(offset) {
29982942      case 0: return xpos&0xff;
29992943      case 1: return ypos&0xff;
30002944      case 2: return ypos&0xff;
r245632r245633
32653209   m_render.count[0] = m_render.count[1] = 0;
32663210   m_render.cur = 0;
32673211
3268   if ((!strcmp(machine().system().name, "motoxgo")) ||
3212   if((!strcmp(machine().system().name, "motoxgo")) ||
32693213      (!strcmp(machine().system().name, "panicprk")) ||
32703214      (!strcmp(machine().system().name, "panicprkj")) ||
32713215      (!strcmp(machine().system().name, "rapidrvr")) ||
r245632r245633
32853229      (!strcmp(machine().system().name, "crszonev3a")) ||
32863230      (!strcmp(machine().system().name, "crszonev2a")) ||
32873231      (!strcmp(machine().system().name, "timecrs2v2b")) ||
3288      (!strcmp(machine().system().name, "timecrs2")))
3289   {
3232      (!strcmp(machine().system().name, "timecrs2"))) {
32903233      m_has_jvsio = 1;
3291   }
3292   else
3293   {
3234   } else {
32943235      m_has_jvsio = 0;
32953236   }
32963237}


Previous 199869 Revisions Next


© 1997-2024 The MAME Team