trunk/src/mame/drivers/namcos23.c
| r18693 | r18694 | |
| 1238 | 1238 | #define S23_HSYNC (16666150) |
| 1239 | 1239 | #define S23_MODECLOCK (130205) |
| 1240 | 1240 | |
| 1241 | #define MAIN_VBLANK_IRQ 1 |
| 1242 | #define MAIN_C361_IRQ 2 |
| 1243 | #define MAIN_SUBCPU_IRQ 4 |
| 1244 | #define MAIN_C435_IRQ 8 |
| 1245 | #define MAIN_C422_IRQ 16 |
| 1246 | |
| 1241 | 1247 | enum { MODEL, FLUSH }; |
| 1242 | 1248 | |
| 1243 | 1249 | struct namcos23_render_entry { |
| r18693 | r18694 | |
| 1354 | 1360 | tilemap_t *m_bgtilemap; |
| 1355 | 1361 | UINT8 m_jvssense; |
| 1356 | 1362 | INT32 m_has_jvsio; |
| 1363 | UINT32 m_main_irqcause; |
| 1357 | 1364 | bool m_ctl_vbl_active; |
| 1358 | 1365 | UINT8 m_ctl_led; |
| 1359 | 1366 | UINT16 m_ctl_inp_buffer[2]; |
| r18693 | r18694 | |
| 1397 | 1404 | UINT8 m_im_wr; |
| 1398 | 1405 | UINT8 m_s23_tssio_port_4; |
| 1399 | 1406 | |
| 1407 | void update_main_interrupts(UINT32 cause); |
| 1408 | |
| 1400 | 1409 | DECLARE_WRITE32_MEMBER(namcos23_textram_w); |
| 1401 | 1410 | DECLARE_WRITE32_MEMBER(s23_txtchar_w); |
| 1402 | 1411 | DECLARE_WRITE32_MEMBER(namcos23_paletteram_w); |
| r18693 | r18694 | |
| 1455 | 1464 | }; |
| 1456 | 1465 | |
| 1457 | 1466 | |
| 1467 | void namcos23_state::update_main_interrupts(UINT32 cause) |
| 1468 | { |
| 1469 | UINT32 changed = cause ^ m_main_irqcause; |
| 1470 | m_main_irqcause = cause; |
| 1471 | |
| 1472 | // level 2: vblank |
| 1473 | if (changed & MAIN_VBLANK_IRQ) |
| 1474 | m_maincpu->set_input_line(MIPS3_IRQ0, (cause & MAIN_VBLANK_IRQ) ? ASSERT_LINE : CLEAR_LINE); |
| 1458 | 1475 | |
| 1476 | // level 3: C361/subcpu |
| 1477 | if (changed & (MAIN_C361_IRQ | MAIN_SUBCPU_IRQ)) |
| 1478 | m_maincpu->set_input_line(MIPS3_IRQ1, (cause & (MAIN_C361_IRQ | MAIN_SUBCPU_IRQ)) ? ASSERT_LINE : CLEAR_LINE); |
| 1479 | |
| 1480 | // level 4: C435 |
| 1481 | if (changed & MAIN_C435_IRQ) |
| 1482 | m_maincpu->set_input_line(MIPS3_IRQ2, (cause & MAIN_C435_IRQ) ? ASSERT_LINE : CLEAR_LINE); |
| 1483 | |
| 1484 | // level 5: C422 |
| 1485 | if (changed & MAIN_C422_IRQ) |
| 1486 | m_maincpu->set_input_line(MIPS3_IRQ3, (cause & MAIN_C422_IRQ) ? ASSERT_LINE : CLEAR_LINE); |
| 1487 | } |
| 1488 | |
| 1459 | 1489 | static UINT16 nthword( const UINT32 *pSource, int offs ) |
| 1460 | 1490 | { |
| 1461 | 1491 | pSource += offs/2; |
| r18693 | r18694 | |
| 1582 | 1612 | break; |
| 1583 | 1613 | case 7: |
| 1584 | 1614 | logerror("c417_w: ack IRQ 2 (%x)\n", data); |
| 1585 | | m_maincpu->set_input_line(MIPS3_IRQ2, CLEAR_LINE); |
| 1615 | update_main_interrupts(m_main_irqcause & ~MAIN_C435_IRQ); |
| 1586 | 1616 | break; |
| 1587 | 1617 | default: |
| 1588 | 1618 | 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)); |
| r18693 | r18694 | |
| 1754 | 1784 | if(m_ctl_vbl_active) |
| 1755 | 1785 | { |
| 1756 | 1786 | m_ctl_vbl_active = false; |
| 1757 | | space.device().execute().set_input_line(MIPS3_IRQ0, CLEAR_LINE); |
| 1787 | update_main_interrupts(m_main_irqcause & ~MAIN_VBLANK_IRQ); |
| 1758 | 1788 | } |
| 1759 | 1789 | break; |
| 1760 | 1790 | |
| r18693 | r18694 | |
| 1793 | 1823 | |
| 1794 | 1824 | if (c361.scanline != 0x1ff) |
| 1795 | 1825 | { |
| 1796 | | m_maincpu->set_input_line(MIPS3_IRQ1, ASSERT_LINE); |
| 1826 | // need to do a partial update here, but doesn't work properly yet |
| 1827 | update_main_interrupts(m_main_irqcause | MAIN_C361_IRQ); |
| 1797 | 1828 | |
| 1798 | 1829 | // TC2 indicates it's probably one-shot since it resets it each VBL... |
| 1799 | 1830 | //c361.timer->adjust(machine().primary_screen->time_until_pos(c361.scanline)); |
| 1800 | 1831 | } |
| 1832 | else |
| 1833 | update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ); |
| 1801 | 1834 | } |
| 1802 | 1835 | |
| 1803 | 1836 | WRITE16_MEMBER(namcos23_state::s23_c361_w) |
| r18693 | r18694 | |
| 1830 | 1863 | switch (offset) |
| 1831 | 1864 | { |
| 1832 | 1865 | case 5: |
| 1833 | | m_maincpu->set_input_line(MIPS3_IRQ1, CLEAR_LINE); |
| 1866 | update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ); |
| 1834 | 1867 | return machine().primary_screen->vblank() ? 0x1ff : machine().primary_screen->vpos(); |
| 1835 | 1868 | case 6: |
| 1836 | | return machine().primary_screen->vblank(); |
| 1869 | update_main_interrupts(m_main_irqcause & ~MAIN_C361_IRQ); |
| 1870 | return machine().primary_screen->vblank() ? ~0 : 0; |
| 1837 | 1871 | } |
| 1838 | 1872 | |
| 1839 | 1873 | logerror("c361_r %x @ %04x (%08x, %08x)\n", offset, mem_mask, space.device().safe_pc(), (unsigned int)space.device().state().state_int(MIPS3_R31)); |
| r18693 | r18694 | |
| 1855 | 1889 | if (data == 0xfffb) |
| 1856 | 1890 | { |
| 1857 | 1891 | logerror("c422_w: raise IRQ 3\n"); |
| 1858 | | m_maincpu->set_input_line(MIPS3_IRQ3, ASSERT_LINE); |
| 1892 | update_main_interrupts(m_main_irqcause | MAIN_C422_IRQ); |
| 1859 | 1893 | } |
| 1860 | 1894 | else if (data == 0x000f) |
| 1861 | 1895 | { |
| 1862 | 1896 | logerror("c422_w: ack IRQ 3\n"); |
| 1863 | | m_maincpu->set_input_line(MIPS3_IRQ3, CLEAR_LINE); |
| 1897 | update_main_interrupts(m_main_irqcause & ~MAIN_C422_IRQ); |
| 1864 | 1898 | } |
| 1865 | 1899 | break; |
| 1866 | 1900 | |
| r18693 | r18694 | |
| 1879 | 1913 | { |
| 1880 | 1914 | case 2: |
| 1881 | 1915 | // subcpu irq ack |
| 1882 | | m_maincpu->set_input_line(MIPS3_IRQ1, CLEAR_LINE); |
| 1916 | update_main_interrupts(m_main_irqcause & ~MAIN_SUBCPU_IRQ); |
| 1883 | 1917 | break; |
| 1884 | 1918 | |
| 1885 | 1919 | case 5: |
| r18693 | r18694 | |
| 2493 | 2527 | if(!m_ctl_vbl_active) |
| 2494 | 2528 | { |
| 2495 | 2529 | m_ctl_vbl_active = true; |
| 2496 | | device.execute().set_input_line(MIPS3_IRQ0, ASSERT_LINE); |
| 2530 | update_main_interrupts(m_main_irqcause | MAIN_VBLANK_IRQ); |
| 2497 | 2531 | } |
| 2498 | 2532 | |
| 2499 | 2533 | render.cur = !render.cur; |
| r18693 | r18694 | |
| 2629 | 2663 | { |
| 2630 | 2664 | if ((mem_mask == 0xffff) && (data == 0x3170)) |
| 2631 | 2665 | { |
| 2632 | | m_maincpu->set_input_line(MIPS3_IRQ1, ASSERT_LINE); |
| 2666 | update_main_interrupts(m_main_irqcause | MAIN_SUBCPU_IRQ); |
| 2633 | 2667 | } |
| 2634 | 2668 | else |
| 2635 | 2669 | { |
| r18693 | r18694 | |
| 3172 | 3206 | |
| 3173 | 3207 | m_mi_rd = m_mi_wr = m_im_rd = m_im_wr = 0; |
| 3174 | 3208 | m_jvssense = 1; |
| 3209 | m_main_irqcause = ~0; |
| 3175 | 3210 | m_ctl_vbl_active = false; |
| 3176 | 3211 | m_s23_lastpB = 0x50; |
| 3177 | 3212 | m_s23_setstate = 0; |