trunk/src/mame/drivers/namcos12.c
| r29327 | r29328 | |
| 1053 | 1053 | public: |
| 1054 | 1054 | namcos12_state(const machine_config &mconfig, device_type type, const char *tag) |
| 1055 | 1055 | : driver_device(mconfig, type, tag), |
| 1056 | | m_rtc(*this, "rtc"), |
| 1057 | | m_settings(*this, "namco_settings"), |
| 1058 | | m_sharedram(*this, "sharedram"), |
| 1059 | 1056 | m_maincpu(*this, "maincpu"), |
| 1060 | 1057 | m_ram(*this, "maincpu:ram"), |
| 1061 | 1058 | m_sub(*this, "sub"), |
| 1062 | | m_adc(*this, "sub:adc") |
| 1063 | | { |
| 1064 | | } |
| 1059 | m_adc(*this, "sub:adc"), |
| 1060 | m_rtc(*this, "rtc"), |
| 1061 | m_settings(*this, "namco_settings"), |
| 1062 | m_sharedram(*this, "sharedram") |
| 1063 | { } |
| 1065 | 1064 | |
| 1065 | required_device<psxcpu_device> m_maincpu; |
| 1066 | required_device<ram_device> m_ram; |
| 1067 | required_device<h83002_device> m_sub; |
| 1068 | required_device<h8_adc_device> m_adc; |
| 1066 | 1069 | required_device<rtc4543_device> m_rtc; |
| 1067 | 1070 | required_device<namco_settings_device> m_settings; |
| 1068 | 1071 | required_shared_ptr<UINT16> m_sharedram; |
| 1072 | |
| 1069 | 1073 | UINT16 m_n_bankoffset; |
| 1070 | | |
| 1071 | 1074 | UINT32 m_n_dmaoffset; |
| 1072 | 1075 | UINT32 m_n_tektagdmaoffset; |
| 1073 | 1076 | int m_has_tektagt_dma; |
| 1074 | 1077 | |
| 1075 | 1078 | int m_ttt_cnt; |
| 1076 | 1079 | UINT32 m_ttt_val[2]; |
| 1077 | | |
| 1078 | 1080 | int m_s12_porta; |
| 1079 | 1081 | int m_s12_lastpB; |
| 1082 | |
| 1080 | 1083 | DECLARE_WRITE16_MEMBER(sharedram_w); |
| 1081 | 1084 | DECLARE_READ16_MEMBER(sharedram_r); |
| 1082 | 1085 | DECLARE_WRITE16_MEMBER(bankoffset_w); |
| r29327 | r29328 | |
| 1096 | 1099 | DECLARE_WRITE16_MEMBER(s12_mcu_portB_w); |
| 1097 | 1100 | DECLARE_READ16_MEMBER(s12_mcu_gun_h_r); |
| 1098 | 1101 | DECLARE_READ16_MEMBER(s12_mcu_gun_v_r); |
| 1102 | |
| 1099 | 1103 | DECLARE_DRIVER_INIT(namcos12); |
| 1100 | 1104 | DECLARE_DRIVER_INIT(ptblank2); |
| 1101 | | DECLARE_MACHINE_RESET(namcos12); |
| 1102 | 1105 | inline void ATTR_PRINTF(3,4) verboselog( int n_level, const char *s_fmt, ... ); |
| 1103 | 1106 | void namcos12_rom_read( UINT32 *p_n_psxram, UINT32 n_address, INT32 n_size ); |
| 1104 | 1107 | void namcos12_sub_irq( screen_device &screen, bool vblank_state ); |
| 1105 | | required_device<psxcpu_device> m_maincpu; |
| 1106 | | required_device<ram_device> m_ram; |
| 1107 | | required_device<h83002_device> m_sub; |
| 1108 | | required_device<h8_adc_device> m_adc; |
| 1108 | |
| 1109 | protected: |
| 1110 | virtual void machine_reset(); |
| 1109 | 1111 | }; |
| 1110 | 1112 | |
| 1111 | 1113 | inline void ATTR_PRINTF(3,4) namcos12_state::verboselog( int n_level, const char *s_fmt, ... ) |
| r29327 | r29328 | |
| 1262 | 1264 | |
| 1263 | 1265 | WRITE16_MEMBER(namcos12_state::system11gun_w) |
| 1264 | 1266 | { |
| 1265 | | switch( offset ) |
| 1267 | switch (offset) |
| 1266 | 1268 | { |
| 1267 | 1269 | case 0: |
| 1268 | 1270 | /* blowback 1 */ |
| r29327 | r29328 | |
| 1289 | 1291 | { |
| 1290 | 1292 | UINT16 data = 0; |
| 1291 | 1293 | |
| 1292 | | switch( offset ) |
| 1294 | switch (offset) |
| 1293 | 1295 | { |
| 1294 | 1296 | case 0: |
| 1295 | 1297 | data = ioport("LIGHT0_X")->read(); |
| r29327 | r29328 | |
| 1300 | 1302 | break; |
| 1301 | 1303 | |
| 1302 | 1304 | case 3: |
| 1303 | | data = ioport("LIGHT0_Y")->read() + 1; |
| 1305 | data = ioport("LIGHT0_Y")->read() + 1; |
| 1304 | 1306 | break; |
| 1305 | 1307 | |
| 1306 | 1308 | case 4: |
| r29327 | r29328 | |
| 1323 | 1325 | { |
| 1324 | 1326 | // Second dma offset or protection ref values write |
| 1325 | 1327 | |
| 1326 | | switch(offset) |
| 1328 | switch (offset) |
| 1327 | 1329 | { |
| 1328 | 1330 | case 0: |
| 1329 | 1331 | m_n_tektagdmaoffset = data; |
| r29327 | r29328 | |
| 1342 | 1344 | |
| 1343 | 1345 | READ16_MEMBER(namcos12_state::tektagt_protection_1_r) |
| 1344 | 1346 | { |
| 1345 | | switch(offset) |
| 1347 | switch (offset) |
| 1346 | 1348 | { |
| 1347 | 1349 | case 0: |
| 1348 | 1350 | // Reads are either ignored or bit 15 is tested for a busy flag |
| 1349 | 1351 | return 0x8000; |
| 1352 | case 1: |
| 1353 | break; |
| 1350 | 1354 | } |
| 1351 | 1355 | |
| 1352 | 1356 | return 0; |
| r29327 | r29328 | |
| 1354 | 1358 | |
| 1355 | 1359 | WRITE16_MEMBER(namcos12_state::tektagt_protection_2_w) |
| 1356 | 1360 | { |
| 1357 | | switch( offset ) |
| 1361 | switch (offset) |
| 1358 | 1362 | { |
| 1359 | 1363 | case 0: |
| 1360 | 1364 | // Writes are 0 or rand(), only used as a "start prot value write" trigger |
| 1361 | 1365 | m_ttt_cnt = 0; |
| 1366 | break; |
| 1367 | case 1: |
| 1368 | break; |
| 1362 | 1369 | } |
| 1363 | 1370 | } |
| 1364 | 1371 | |
| r29327 | r29328 | |
| 1403 | 1410 | return 0; |
| 1404 | 1411 | } |
| 1405 | 1412 | |
| 1406 | | MACHINE_RESET_MEMBER(namcos12_state,namcos12) |
| 1413 | void namcos12_state::machine_reset() |
| 1407 | 1414 | { |
| 1408 | 1415 | address_space &space = m_maincpu->space(AS_PROGRAM); |
| 1409 | 1416 | bankoffset_w(space,0,0,0xffff); |
| r29327 | r29328 | |
| 1489 | 1496 | m_settings->ce_w((m_s12_lastpB & 0x20) && !(m_s12_porta & 1)); |
| 1490 | 1497 | } |
| 1491 | 1498 | |
| 1499 | static ADDRESS_MAP_START( s12h8iomap, AS_IO, 16, namcos12_state ) |
| 1500 | AM_RANGE(h8_device::PORT_7, h8_device::PORT_7) AM_READ_PORT("DSW") |
| 1501 | AM_RANGE(h8_device::PORT_8, h8_device::PORT_8) AM_READ(s12_mcu_p8_r ) AM_WRITENOP |
| 1502 | AM_RANGE(h8_device::PORT_A, h8_device::PORT_A) AM_READWRITE(s12_mcu_pa_r, s12_mcu_pa_w ) |
| 1503 | AM_RANGE(h8_device::PORT_B, h8_device::PORT_B) AM_READWRITE(s12_mcu_portB_r, s12_mcu_portB_w ) |
| 1504 | AM_RANGE(h8_device::ADC_0, h8_device::ADC_0) AM_NOP |
| 1505 | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_NOP |
| 1506 | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_NOP |
| 1507 | AM_RANGE(h8_device::ADC_3, h8_device::ADC_3) AM_NOP |
| 1508 | ADDRESS_MAP_END |
| 1509 | |
| 1510 | |
| 1492 | 1511 | /* Golgo 13 lightgun inputs |
| 1493 | 1512 | * |
| 1494 | 1513 | * Note: The H8/3002's ADC is 10 bits wide, but |
| r29327 | r29328 | |
| 1498 | 1517 | |
| 1499 | 1518 | READ16_MEMBER(namcos12_state::s12_mcu_gun_h_r) |
| 1500 | 1519 | { |
| 1501 | | ioport_port *port = ioport("LIGHT0_X"); |
| 1502 | | if( port != NULL ) |
| 1503 | | return port->read() << 2; |
| 1504 | | |
| 1505 | | // if game has no lightgun ports, return 0 |
| 1506 | | return 0; |
| 1520 | return ioport("LIGHT0_X")->read() << 2; |
| 1507 | 1521 | } |
| 1508 | 1522 | |
| 1509 | 1523 | READ16_MEMBER(namcos12_state::s12_mcu_gun_v_r) |
| 1510 | 1524 | { |
| 1511 | | ioport_port *port = ioport("LIGHT0_Y"); |
| 1512 | | if( port != NULL ) |
| 1513 | | return port->read() << 2; |
| 1514 | | |
| 1515 | | // if game has no lightgun ports, return 0 |
| 1516 | | return 0; |
| 1525 | return ioport("LIGHT0_Y")->read() << 2; |
| 1517 | 1526 | } |
| 1518 | 1527 | |
| 1519 | | static ADDRESS_MAP_START( s12h8iomap, AS_IO, 16, namcos12_state ) |
| 1520 | | AM_RANGE(h8_device::PORT_7, h8_device::PORT_7) AM_READ_PORT("DSW") |
| 1521 | | AM_RANGE(h8_device::PORT_8, h8_device::PORT_8) AM_READ(s12_mcu_p8_r ) AM_WRITENOP |
| 1522 | | AM_RANGE(h8_device::PORT_A, h8_device::PORT_A) AM_READWRITE(s12_mcu_pa_r, s12_mcu_pa_w ) |
| 1523 | | AM_RANGE(h8_device::PORT_B, h8_device::PORT_B) AM_READWRITE(s12_mcu_portB_r, s12_mcu_portB_w ) |
| 1524 | | AM_RANGE(h8_device::ADC_0, h8_device::ADC_0) AM_NOP |
| 1525 | | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_READ(s12_mcu_gun_h_r ) // golgo 13 gun X-axis |
| 1526 | | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_READ(s12_mcu_gun_v_r ) // golgo 13 gun Y-axis |
| 1527 | | AM_RANGE(h8_device::ADC_3, h8_device::ADC_3) AM_NOP |
| 1528 | static ADDRESS_MAP_START( golgo13_h8iomap, AS_IO, 16, namcos12_state ) |
| 1529 | AM_RANGE(h8_device::ADC_1, h8_device::ADC_1) AM_READ(s12_mcu_gun_h_r ) |
| 1530 | AM_RANGE(h8_device::ADC_2, h8_device::ADC_2) AM_READ(s12_mcu_gun_v_r ) |
| 1531 | |
| 1532 | AM_IMPORT_FROM( s12h8iomap ) |
| 1528 | 1533 | ADDRESS_MAP_END |
| 1529 | 1534 | |
| 1535 | |
| 1530 | 1536 | DRIVER_INIT_MEMBER(namcos12_state,namcos12) |
| 1531 | 1537 | { |
| 1532 | 1538 | membank("bank1")->configure_entries(0, memregion( "user2" )->bytes() / 0x200000, memregion( "user2" )->base(), 0x200000 ); |
| r29327 | r29328 | |
| 1552 | 1558 | } |
| 1553 | 1559 | |
| 1554 | 1560 | static MACHINE_CONFIG_START( coh700, namcos12_state ) |
| 1561 | |
| 1555 | 1562 | /* basic machine hardware */ |
| 1556 | | MCFG_CPU_ADD( "maincpu", CXD8661R, XTAL_100MHz ) |
| 1563 | MCFG_CPU_ADD("maincpu", CXD8661R, XTAL_100MHz) |
| 1557 | 1564 | MCFG_CPU_PROGRAM_MAP( namcos12_map) |
| 1558 | 1565 | |
| 1559 | 1566 | MCFG_RAM_MODIFY("maincpu:ram") |
| r29327 | r29328 | |
| 1561 | 1568 | |
| 1562 | 1569 | MCFG_PSX_DMA_CHANNEL_READ( "maincpu", 5, psx_dma_read_delegate( FUNC( namcos12_state::namcos12_rom_read ), (namcos12_state *) owner ) ) |
| 1563 | 1570 | |
| 1564 | | MCFG_CPU_ADD("sub", H83002, 16737350 ) |
| 1571 | MCFG_CPU_ADD("sub", H83002, 16737350) |
| 1565 | 1572 | MCFG_CPU_PROGRAM_MAP(s12h8rwmap) |
| 1566 | 1573 | MCFG_CPU_IO_MAP(s12h8iomap) |
| 1567 | 1574 | |
| 1568 | | MCFG_MACHINE_RESET_OVERRIDE(namcos12_state, namcos12) |
| 1569 | | |
| 1570 | 1575 | MCFG_NAMCO_SETTINGS_ADD("namco_settings") |
| 1571 | 1576 | |
| 1572 | 1577 | MCFG_RTC4543_ADD("rtc", XTAL_32_768kHz) |
| r29327 | r29328 | |
| 1589 | 1594 | /* sound hardware */ |
| 1590 | 1595 | MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker") |
| 1591 | 1596 | |
| 1592 | | MCFG_C352_ADD("c352", 16737350*1.5 ) // measured at 29.168MHz, but that's too highpitched |
| 1597 | MCFG_C352_ADD("c352", 16737350*1.5) // measured at 29.168MHz, but that's too highpitched |
| 1593 | 1598 | MCFG_SOUND_ROUTE(0, "rspeaker", 1.00) |
| 1594 | 1599 | MCFG_SOUND_ROUTE(1, "lspeaker", 1.00) |
| 1595 | 1600 | MCFG_SOUND_ROUTE(2, "rspeaker", 1.00) |
| r29327 | r29328 | |
| 1597 | 1602 | MACHINE_CONFIG_END |
| 1598 | 1603 | |
| 1599 | 1604 | static MACHINE_CONFIG_DERIVED( ptblank2, coh700 ) |
| 1600 | | MCFG_CPU_MODIFY( "maincpu" ) |
| 1605 | |
| 1606 | /* basic machine hardware */ |
| 1607 | MCFG_CPU_MODIFY("maincpu") |
| 1601 | 1608 | MCFG_CPU_PROGRAM_MAP( ptblank2_map ) |
| 1602 | 1609 | MACHINE_CONFIG_END |
| 1603 | 1610 | |
| 1604 | 1611 | static MACHINE_CONFIG_DERIVED( tektagt, coh700 ) |
| 1605 | | MCFG_CPU_MODIFY( "maincpu" ) |
| 1612 | |
| 1613 | /* basic machine hardware */ |
| 1614 | MCFG_CPU_MODIFY("maincpu") |
| 1606 | 1615 | MCFG_CPU_PROGRAM_MAP( tektagt_map ) |
| 1607 | 1616 | MACHINE_CONFIG_END |
| 1608 | 1617 | |
| 1618 | static MACHINE_CONFIG_DERIVED( golgo13, coh700 ) |
| 1609 | 1619 | |
| 1620 | /* basic machine hardware */ |
| 1621 | MCFG_CPU_MODIFY("sub") |
| 1622 | MCFG_CPU_IO_MAP(golgo13_h8iomap) |
| 1623 | MACHINE_CONFIG_END |
| 1624 | |
| 1625 | |
| 1610 | 1626 | static INPUT_PORTS_START( namcos12 ) |
| 1611 | 1627 | PORT_START("DSW") |
| 1612 | 1628 | PORT_DIPNAME( 0x0080, 0x0080, DEF_STR(Service_Mode) ) PORT_DIPLOCATION( "DIP SW2:1" ) |
| r29327 | r29328 | |
| 2835 | 2851 | GAME( 1999, kaiunqz, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Namco", "Kaiun Quiz (Japan, KW1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC050 */ |
| 2836 | 2852 | GAME( 1999, pacappsp, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Produce / Namco", "Paca Paca Passion Special (Japan, PSP1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC052 */ |
| 2837 | 2853 | GAME( 1999, aquarush, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Namco", "Aqua Rush (Japan, AQ1/VER.A1)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC053 */ |
| 2838 | | GAME( 1999, golgo13, 0, coh700, golgo13, namcos12_state, namcos12, ROT0, "Eighting / Raizing / Namco", "Golgo 13 (Japan, GLG1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC054 */ |
| 2839 | | GAME( 1999, g13knd, 0, coh700, golgo13, namcos12_state, namcos12, ROT0, "Eighting / Raizing / Namco", "Golgo 13 Kiseki no Dandou (Japan, GLS1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC059 */ |
| 2854 | GAME( 1999, golgo13, 0, golgo13, golgo13, namcos12_state, namcos12, ROT0, "Eighting / Raizing / Namco", "Golgo 13 (Japan, GLG1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC054 */ |
| 2855 | GAME( 1999, g13knd, 0, golgo13, golgo13, namcos12_state, namcos12, ROT0, "Eighting / Raizing / Namco", "Golgo 13 Kiseki no Dandou (Japan, GLS1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND ) /* KC059 */ |
| 2840 | 2856 | GAME( 2000, sws2000, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Namco", "Super World Stadium 2000 (Japan, SS01/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC055 */ |
| 2841 | 2857 | GAME( 2000, truckk, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Metro / Namco", "Truck Kyosokyoku (Japan, TKK2/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC056 */ |
| 2842 | 2858 | GAME( 2000, kartduel, 0, coh700, namcos12, namcos12_state, namcos12, ROT0, "Namco", "Kart Duel (Japan, KTD1/VER.A)", GAME_IMPERFECT_GRAPHICS | GAME_IMPERFECT_SOUND | GAME_NOT_WORKING ) /* KC057 */ |