-tnzs: Added Taito M-Chip M-001 dump for extrmatn. Also works for drtoppel and plumppop. [Caps0ff]

This commit is contained in:
therealmogminer@gmail.com 2016-12-10 00:58:50 +01:00
parent 091b93238d
commit b043dc7a18
3 changed files with 235 additions and 513 deletions

View File

@ -413,7 +413,7 @@ TODO:
- Find out how the hardware credit-counter works (MPU)
- Fix MCU simulation errors :
* avoid credits to be increased when in "test mode" to avoid coin lockout
(needed to complete special test mode in 'extermatn' and 'arknoid2')
(needed to complete special test mode in 'extrmatn' and 'arknoid2')
* why are credits limited to 9 in some games ?
pressing SERVICE1 allows to go up to 100 and cause this :
. 'plumppop' : freeze
@ -770,7 +770,7 @@ static ADDRESS_MAP_START( sub_map, AS_PROGRAM, 8, tnzs_state )
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("subbank")
AM_RANGE(0xa000, 0xa000) AM_WRITE(tnzs_bankswitch1_w)
AM_RANGE(0xb000, 0xb001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0xc000, 0xc001) AM_READWRITE(tnzs_mcu_r, tnzs_mcu_w) /* not present in insectx */
AM_RANGE(0xc000, 0xc001) AM_READWRITE(mcu_r, mcu_w) /* not present in insectx */
AM_RANGE(0xd000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1")
AM_RANGE(0xf000, 0xf003) AM_READ(arknoid2_sh_f000_r) /* paddles in arkanoid2/plumppop. The ports are */
@ -778,6 +778,17 @@ static ADDRESS_MAP_START( sub_map, AS_PROGRAM, 8, tnzs_state )
/* all by insectx. */
ADDRESS_MAP_END
static ADDRESS_MAP_START( arknoid2_sub_map, AS_PROGRAM, 8, tnzs_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("subbank")
AM_RANGE(0xa000, 0xa000) AM_WRITE(arknoid2_mcu_reset_w)
AM_RANGE(0xb000, 0xb001) AM_DEVREADWRITE("ymsnd", ym2203_device, read, write)
AM_RANGE(0xc000, 0xc001) AM_READWRITE(arknoid2_mcu_r, arknoid2_mcu_w)
AM_RANGE(0xd000, 0xdfff) AM_RAM
AM_RANGE(0xe000, 0xefff) AM_RAM AM_SHARE("share1")
AM_RANGE(0xf000, 0xf003) AM_READ(arknoid2_sh_f000_r) /* paddles in arkanoid2/plumppop. The ports are */
ADDRESS_MAP_END
static ADDRESS_MAP_START( kageki_sub_map, AS_PROGRAM, 8, tnzs_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("subbank")
@ -846,14 +857,13 @@ static ADDRESS_MAP_START( tnzsb_io_map, AS_IO, 8, tnzs_state )
AM_RANGE(0x02, 0x02) AM_DEVREAD("soundlatch", generic_latch_8_device, read)
ADDRESS_MAP_END
static ADDRESS_MAP_START( i8742_io_map, AS_IO, 8, tnzs_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(tnzs_port1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(tnzs_port2_r, tnzs_port2_w)
static ADDRESS_MAP_START( i8742_map, AS_IO, 8, tnzs_state )
AM_RANGE(MCS48_PORT_P1, MCS48_PORT_P1) AM_READ(mcu_port1_r)
AM_RANGE(MCS48_PORT_P2, MCS48_PORT_P2) AM_READWRITE(mcu_port2_r, mcu_port2_w)
AM_RANGE(MCS48_PORT_T0, MCS48_PORT_T0) AM_READ_PORT("COIN1")
AM_RANGE(MCS48_PORT_T1, MCS48_PORT_T1) AM_READ_PORT("COIN2")
ADDRESS_MAP_END
static ADDRESS_MAP_START( jpopnics_main_map, AS_PROGRAM, 8, tnzs_state )
AM_RANGE(0x0000, 0x7fff) AM_ROM
AM_RANGE(0x8000, 0xbfff) AM_DEVICE("mainbank", address_map_bank_device, amap8)
@ -1538,101 +1548,7 @@ WRITE_LINE_MEMBER(tnzs_state::irqhandler)
m_audiocpu->set_input_line(INPUT_LINE_NMI, state ? ASSERT_LINE : CLEAR_LINE);
}
static MACHINE_CONFIG_START( arknoid2, tnzs_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80, XTAL_12MHz/2) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, arknoid2_interrupt)
MCFG_CPU_ADD("sub", Z80, XTAL_12MHz/2) /* verified on pcb */
MCFG_CPU_PROGRAM_MAP(sub_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, irq0_line_hold)
MCFG_FRAGMENT_ADD(tnzs_mainbank)
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_MACHINE_START_OVERRIDE(tnzs_state,tnzs)
MCFG_MACHINE_RESET_OVERRIDE(tnzs_state,tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode")
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(tnzs_state, screen_update_tnzs)
MCFG_SCREEN_VBLANK_DRIVER(tnzs_state, screen_eof_tnzs)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", tnzs)
MCFG_PALETTE_ADD("palette", 512)
MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB)
MCFG_PALETTE_INIT_OWNER(tnzs_state,arknoid2)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("speaker")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_12MHz/4) /* verified on pcb */
MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSWA"))
MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSWB"))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( drtoppel, tnzs_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,XTAL_12MHz/2) /* 6.0 MHz ??? - Main board Crystal is 12MHz */
MCFG_CPU_PROGRAM_MAP(main_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, arknoid2_interrupt)
MCFG_CPU_ADD("sub", Z80,XTAL_12MHz/2) /* 6.0 MHz ??? - Main board Crystal is 12MHz */
MCFG_CPU_PROGRAM_MAP(sub_map)
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, irq0_line_hold)
MCFG_FRAGMENT_ADD(tnzs_mainbank)
MCFG_QUANTUM_PERFECT_CPU("maincpu")
MCFG_MACHINE_START_OVERRIDE(tnzs_state,tnzs)
MCFG_MACHINE_RESET_OVERRIDE(tnzs_state,tnzs)
MCFG_DEVICE_ADD("spritegen", SETA001_SPRITE, 0)
MCFG_SETA001_SPRITE_GFXDECODE("gfxdecode")
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(0))
MCFG_SCREEN_SIZE(32*8, 32*8)
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 2*8, 30*8-1)
MCFG_SCREEN_UPDATE_DRIVER(tnzs_state, screen_update_tnzs)
MCFG_SCREEN_VBLANK_DRIVER(tnzs_state, screen_eof_tnzs)
MCFG_SCREEN_PALETTE("palette")
MCFG_GFXDECODE_ADD("gfxdecode", "palette", tnzs)
MCFG_PALETTE_ADD("palette", 512)
MCFG_PALETTE_FORMAT(xRRRRRGGGGGBBBBB)
MCFG_PALETTE_INIT_OWNER(tnzs_state,arknoid2)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("speaker")
MCFG_SOUND_ADD("ymsnd", YM2203, XTAL_12MHz/4)
MCFG_AY8910_PORT_A_READ_CB(IOPORT("DSWA"))
MCFG_AY8910_PORT_B_READ_CB(IOPORT("DSWB"))
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( tnzs, tnzs_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", Z80,XTAL_12MHz/2) /* 6.0 MHz ??? - Main board Crystal is 12MHz */
MCFG_CPU_PROGRAM_MAP(main_map)
@ -1643,7 +1559,7 @@ static MACHINE_CONFIG_START( tnzs, tnzs_state )
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, irq0_line_hold)
MCFG_CPU_ADD("mcu", I8742, 12000000/2) /* 400KHz ??? - Main board Crystal is 12MHz */
MCFG_CPU_IO_MAP(i8742_io_map)
MCFG_CPU_IO_MAP(i8742_map)
MCFG_FRAGMENT_ADD(tnzs_mainbank)
@ -1678,6 +1594,25 @@ static MACHINE_CONFIG_START( tnzs, tnzs_state )
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speaker", 0.3)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( extrmatn, tnzs )
MCFG_PALETTE_MODIFY("palette")
MCFG_PALETTE_INIT_OWNER(tnzs_state,arknoid2)
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( arknoid2, tnzs )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_VBLANK_INT_DRIVER("screen", tnzs_state, arknoid2_interrupt)
MCFG_CPU_MODIFY("sub")
MCFG_CPU_PROGRAM_MAP(arknoid2_sub_map)
MCFG_CPU_MODIFY("mcu")
MCFG_DEVICE_DISABLE()
MCFG_PALETTE_MODIFY("palette")
MCFG_PALETTE_INIT_OWNER(tnzs_state,arknoid2)
MACHINE_CONFIG_END
static MACHINE_CONFIG_START( insectx, tnzs_state )
@ -1907,8 +1842,8 @@ ROM_START( plumppop )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "a98-11.bin", 0x00000, 0x10000, CRC(bc56775c) SHA1(0c22c22c0e9d7ec0e34f8ab4bfe61068f65e8759) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "plmp8742.bin", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Chip label is a guess, also unknown if it actually uses the same MCU as drtoppel/extrmatn, but it appears to work fine */
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "a98-01.bin", 0x00000, 0x10000, CRC(f3033dca) SHA1(130744998f0531a82de2814231dddea3ad710f60) )
@ -1959,8 +1894,8 @@ ROM_START( extrmatn )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b06-19.4e", 0x00000, 0x10000, CRC(8de43ed9) SHA1(53e6d8fa93889c38733d169e983f2caf1da71f43) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "extr8742.4f", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14 */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "b06-01.13a", 0x00000, 0x20000, CRC(d2afbf7e) SHA1(28b4cf94798f049a9f8375464741dbef208d7290) )
@ -1981,8 +1916,8 @@ ROM_START( extrmatnu )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b06-22.4e", 0x00000, 0x10000, CRC(744f2c84) SHA1(7565c1594c2a3bae1ae45afcbf93363fe2b12d58) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "extr8742.4f", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14 */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "b06-01.13a", 0x00000, 0x20000, CRC(d2afbf7e) SHA1(28b4cf94798f049a9f8375464741dbef208d7290) )
@ -2004,8 +1939,8 @@ ROM_START( extrmatnur )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b06_17", 0x00000, 0x10000, CRC(744f2c84) SHA1(7565c1594c2a3bae1ae45afcbf93363fe2b12d58) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "extr8742.4f", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14 */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "b06-01.13a", 0x00000, 0x20000, CRC(d2afbf7e) SHA1(28b4cf94798f049a9f8375464741dbef208d7290) )
@ -2026,8 +1961,8 @@ ROM_START( extrmatnj )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b06-07.4e", 0x00000, 0x10000, CRC(b37fb8b3) SHA1(10696914b9e39d34d56069a69b9d641339ea2309) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "extr8742.4f", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14 */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x80000, "gfx1", 0 )
ROM_LOAD( "b06-01.13a", 0x00000, 0x20000, CRC(d2afbf7e) SHA1(28b4cf94798f049a9f8375464741dbef208d7290) )
@ -2048,7 +1983,7 @@ ROM_START( arknoid2 )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b08_13.3e", 0x00000, 0x10000, CRC(e8035ef1) SHA1(9a54e952cff0036c4b6affd9ffb1097cdccbe255) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "ark28742.3g", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x80000, "gfx1", 0 )
@ -2070,7 +2005,7 @@ ROM_START( arknoid2u )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b08_12.3e", 0x00000, 0x10000, CRC(dc84e27d) SHA1(d549d8c9fbec0521517f0c5f5cee763e27d48633) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "ark28742.3g", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x80000, "gfx1", 0 )
@ -2092,7 +2027,7 @@ ROM_START( arknoid2j )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b08_06.3e", 0x00000, 0x10000, CRC(adfcd40c) SHA1(f91299407ed21e2dd244c9b1a315b27ed32f5514) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "ark28742.3g", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x80000, "gfx1", 0 )
@ -2114,7 +2049,7 @@ ROM_START( arknoid2b )
ROM_REGION( 0x10000, "sub", 0 ) /* Region 2 - sound cpu */
ROM_LOAD( "b08_13.3e", 0x00000, 0x10000, CRC(e8035ef1) SHA1(9a54e952cff0036c4b6affd9ffb1097cdccbe255) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "ark28742.3g", 0x0000, 0x0800, NO_DUMP )
ROM_REGION( 0x80000, "gfx1", 0 )
@ -2136,8 +2071,8 @@ ROM_START( drtoppel )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b19-15.3e", 0x00000, 0x10000, CRC(37a0d3fb) SHA1(f65fb9382af5f5b09725c39b660c5138b3912f53) ) /* Hacked??, need correct Taito rom number */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "drt8742.3g", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14, reused from Extermination, under printed label "Taito M-001, 128P, 720100" */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "b19-01.13a", 0x00000, 0x20000, CRC(a7e8a0c1) SHA1(a2f017ae5b6472d4202f126d0247b3fe4b1321d1) )
@ -2162,8 +2097,8 @@ ROM_START( drtoppelu )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b19-14.3e", 0x00000, 0x10000, CRC(05565b22) SHA1(d1aa47b438d3b44c5177337809e38b50f6445c36) ) /* Hacked??, need correct Taito rom number */
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "drt8742.3g", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14, reused from Extermination, under printed label "Taito M-001, 128P, 720100" */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "b19-01.13a", 0x00000, 0x20000, CRC(a7e8a0c1) SHA1(a2f017ae5b6472d4202f126d0247b3fe4b1321d1) )
@ -2188,8 +2123,8 @@ ROM_START( drtoppelj )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b19-11.3e", 0x00000, 0x10000, CRC(524dc249) SHA1(158b2de0fcd17ad16ba72bb24888122bf704e216) )
ROM_REGION( 0x10000, "audiocpu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_LOAD( "drt8742.3g", 0x0000, 0x0800, NO_DUMP ) /* Labeled B06-14, reused from Extermination, under printed label "Taito M-001, 128P, 720100" */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b06-14.1g", 0x0000, 0x0800, CRC(28907072) SHA1(21c7017af8a8ceb8e43d7e798f48518b136fd45c) ) /* Labeled B06-14 and under printed label "Taito M-001, 128P, 720100", is a mask 8042 */
ROM_REGION( 0x100000, "gfx1", 0 )
ROM_LOAD( "b19-01.13a", 0x00000, 0x20000, CRC(a7e8a0c1) SHA1(a2f017ae5b6472d4202f126d0247b3fe4b1321d1) )
@ -2326,7 +2261,7 @@ ROM_START( chukatai )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b44-12w", 0x00000, 0x10000, CRC(e80ecdca) SHA1(cd96403ca97f18f630118dcb3dc2179c01147213) ) /* Hacked??, need correct Taito rom number */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b44-8742.mcu", 0x0000, 0x0800, CRC(7dff3f9f) SHA1(bbf4e036d025fe8179b053d639f9b8ad401e6e68) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2348,7 +2283,7 @@ ROM_START( chukataiu )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b44-12u", 0x00000, 0x10000, CRC(9f09fd5c) SHA1(ae92f2e893e1e666dcabbd793f1a778c5e3d7bab) ) /* Hacked??, need correct Taito rom number */
ROM_REGION( 0x1000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x1000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b44-8742.mcu", 0x0000, 0x0800, CRC(7dff3f9f) SHA1(bbf4e036d025fe8179b053d639f9b8ad401e6e68) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2370,7 +2305,7 @@ ROM_START( chukataij )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b44-12", 0x00000, 0x10000, CRC(0600ace6) SHA1(3d5767b91ea63128bfbff3527ddcf90fcf43af2e) )
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b44-8742.mcu", 0x0000, 0x0800, CRC(7dff3f9f) SHA1(bbf4e036d025fe8179b053d639f9b8ad401e6e68) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2517,7 +2452,7 @@ Taito ID: K1100356A
Seta ID: P0-041A
*/
/* This pcb is similar but not identical to the Chuka Taisen pcb;
There is an M-chip i8742 (with Taito silkscreen) and no 3rd z80.
There is an M-chip i8x42 (with Taito silkscreen) and no 3rd z80.
There is no daughter-pcb like the later TNZS pcb has. */
ROM_START( tnzsjo )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k + bankswitch areas for the first CPU */
@ -2526,7 +2461,7 @@ ROM_START( tnzsjo )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b53-11.27c512.u38", 0x00000, 0x10000, CRC(9784d443) SHA1(bc3647aac9974031dbe4898417fbaa99841f9548) )
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b53-09.u46", 0x0000, 0x0800, CRC(a4bfce19) SHA1(9340862d5bdc1ad4799dc92cae9bce1428b47478) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2554,7 +2489,7 @@ ROM_START( tnzsuo )
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b53-13.27c512.u38", 0x00000, 0x10000, CRC(c09f4d28) SHA1(f1fd3202869738e17abcbb757f9ce7260707dd3d) )
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b53-09.u46", 0x0000, 0x0800, CRC(a4bfce19) SHA1(9340862d5bdc1ad4799dc92cae9bce1428b47478) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2574,14 +2509,14 @@ ROM_START( tnzsuo )
ROM_LOAD( "b06-101.pal16l8a.u36.jed", 0x03000, 0x01000, NO_DUMP)
ROM_END
ROM_START( tnzso )
ROM_START( tnzso )
ROM_REGION( 0x20000, "maincpu", 0 ) /* 64k + bankswitch areas for the first CPU */
ROM_LOAD( "b53-unknown.27c1001d.u32", 0x00000, 0x20000, CRC(edf3b39e) SHA1(be221c99e50795d569611dba454c3954a259a859) ) // ROM LABEL FOR THIS SET IS UNKNOWN
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "b53-unknown.27c512.u38", 0x00000, 0x10000, CRC(60340d63) SHA1(12a26d19dc8e407e502f25617a5a4c9cea131ce2) ) // ROM LABEL FOR THIS SET IS UNKNOWN
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b53-09.u46", 0x0000, 0x0800, CRC(a4bfce19) SHA1(9340862d5bdc1ad4799dc92cae9bce1428b47478) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2610,7 +2545,7 @@ ROM_START( tnzsop ) // prototype/location test version?
ROM_REGION( 0x10000, "sub", 0 ) /* 64k for the second CPU */
ROM_LOAD( "ns_e-3.27c512.u38", 0x00000, 0x10000, CRC(c7662e96) SHA1(be28298bfde4e3867cfe75633ffb0f8611dbbd8b) )
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8742 internal ROM) */
ROM_REGION( 0x10000, "mcu", 0 ) /* M-Chip (i8x42 internal ROM) */
ROM_LOAD( "b53-09.u46", 0x0000, 0x0800, CRC(a4bfce19) SHA1(9340862d5bdc1ad4799dc92cae9bce1428b47478) )
ROM_REGION( 0x100000, "gfx1", 0 )
@ -2737,22 +2672,22 @@ ROM_END
// YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS
GAME( 1987, plumppop, 0, drtoppel, plumppop, tnzs_state, plumpop, ROT0, "Taito Corporation", "Plump Pop (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, plumppop, 0, extrmatn, plumppop, tnzs_state, plumpop, ROT0, "Taito Corporation", "Plump Pop (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1992, jpopnics, 0, jpopnics, jpopnics, driver_device, 0, ROT0, "Nics", "Jumping Pop (Nics, Korean hack of Plump Pop)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatn, 0, arknoid2, extrmatn, tnzs_state, extrmatn, ROT270, "Taito Corporation Japan", "Extermination (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnu, extrmatn, arknoid2, extrmatn, tnzs_state, extrmatn, ROT270, "Taito (World Games license)", "Extermination (US, World Games)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnur,extrmatn, arknoid2, extrmatn, tnzs_state, extrmatn, ROT270, "Taito America Corporation (Romstar license)", "Extermination (US, Romstar)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnj, extrmatn, arknoid2, extrmatn, tnzs_state, extrmatn, ROT270, "Taito Corporation", "Extermination (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatn, 0, extrmatn, extrmatn, tnzs_state, extrmatn, ROT270, "Taito Corporation Japan", "Extermination (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnu, extrmatn, extrmatn, extrmatn, tnzs_state, extrmatn, ROT270, "Taito (World Games license)", "Extermination (US, World Games)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnur,extrmatn, extrmatn, extrmatn, tnzs_state, extrmatn, ROT270, "Taito America Corporation (Romstar license)", "Extermination (US, Romstar)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, extrmatnj, extrmatn, extrmatn, extrmatn, tnzs_state, extrmatn, ROT270, "Taito Corporation", "Extermination (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, arknoid2, 0, arknoid2, arknoid2, tnzs_state, arknoid2, ROT270, "Taito Corporation Japan", "Arkanoid - Revenge of DOH (World)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, arknoid2u, arknoid2, arknoid2, arknid2u, tnzs_state, arknoid2, ROT270, "Taito America Corporation (Romstar license)", "Arkanoid - Revenge of DOH (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, arknoid2j, arknoid2, arknoid2, arknid2u, tnzs_state, arknoid2, ROT270, "Taito Corporation", "Arkanoid - Revenge of DOH (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, arknoid2b, arknoid2, arknoid2, arknid2u, tnzs_state, arknoid2, ROT270, "bootleg", "Arkanoid - Revenge of DOH (Japan bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, drtoppel, 0, drtoppel, drtoppel, tnzs_state, drtoppel, ROT90, "Kaneko / Taito Corporation Japan", "Dr. Toppel's Adventure (World)", MACHINE_SUPPORTS_SAVE ) /* Possible region hack */
GAME( 1987, drtoppelu, drtoppel, drtoppel, drtopplu, tnzs_state, drtoppel, ROT90, "Kaneko / Taito America Corporation", "Dr. Toppel's Adventure (US)", MACHINE_SUPPORTS_SAVE ) /* Possible region hack */
GAME( 1987, drtoppelj, drtoppel, drtoppel, drtopplu, tnzs_state, drtoppel, ROT90, "Kaneko / Taito Corporation", "Dr. Toppel's Tankentai (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1987, drtoppel, 0, extrmatn, drtoppel, tnzs_state, drtoppel, ROT90, "Kaneko / Taito Corporation Japan", "Dr. Toppel's Adventure (World)", MACHINE_SUPPORTS_SAVE ) /* Possible region hack */
GAME( 1987, drtoppelu, drtoppel, extrmatn, drtopplu, tnzs_state, drtoppel, ROT90, "Kaneko / Taito America Corporation", "Dr. Toppel's Adventure (US)", MACHINE_SUPPORTS_SAVE ) /* Possible region hack */
GAME( 1987, drtoppelj, drtoppel, extrmatn, drtopplu, tnzs_state, drtoppel, ROT90, "Kaneko / Taito Corporation", "Dr. Toppel's Tankentai (Japan)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, kageki, 0, kageki, kageki, tnzs_state, kageki, ROT90, "Kaneko / Taito America Corporation (Romstar license)", "Kageki (US)", MACHINE_SUPPORTS_SAVE )
GAME( 1988, kagekij, kageki, kageki, kagekij, tnzs_state, kageki, ROT90, "Kaneko / Taito Corporation", "Kageki (Japan)", MACHINE_SUPPORTS_SAVE )

View File

@ -12,16 +12,12 @@
enum
{
MCU_NONE_INSECTX = 0,
MCU_ARKANOID_SIM = 0,
MCU_MCHIP_LLE,
MCU_NONE_INSECTX,
MCU_NONE_KAGEKI,
MCU_NONE_TNZSB,
MCU_NONE_KABUKIZ,
MCU_EXTRMATN,
MCU_ARKANOID,
MCU_PLUMPOP,
MCU_DRTOPPEL,
MCU_CHUKATAI,
MCU_TNZS
MCU_NONE_KABUKIZ
};
class tnzs_state : public driver_device
@ -48,7 +44,8 @@ public:
m_coin1(*this, "COIN1"),
m_coin2(*this, "COIN2"),
m_an1(*this, "AN1"),
m_an2(*this, "AN2")
m_an2(*this, "AN2"),
m_lockout_level(false)
{ }
/* devices */
@ -92,23 +89,26 @@ public:
uint8_t m_mcu_coins_b;
uint8_t m_mcu_credits;
int m_bank2;
bool m_lockout_level;
DECLARE_READ8_MEMBER(mcu_port1_r);
DECLARE_READ8_MEMBER(mcu_port2_r);
DECLARE_WRITE8_MEMBER(mcu_port2_w );
DECLARE_READ8_MEMBER(mcu_r);
DECLARE_WRITE8_MEMBER(mcu_w);
DECLARE_WRITE8_MEMBER(tnzsb_sound_command_w);
DECLARE_WRITE8_MEMBER(jpopnics_subbankswitch_w);
DECLARE_READ8_MEMBER(tnzs_port1_r);
DECLARE_READ8_MEMBER(tnzs_port2_r);
DECLARE_WRITE8_MEMBER(tnzs_port2_w);
DECLARE_WRITE8_MEMBER(extrmatn_port2_w);
DECLARE_READ8_MEMBER(arknoid2_sh_f000_r);
DECLARE_READ8_MEMBER(tnzs_mcu_r);
DECLARE_WRITE8_MEMBER(tnzs_mcu_w);
DECLARE_WRITE8_MEMBER(tnzs_ramrom_bankswitch_w);
DECLARE_WRITE8_MEMBER(tnzs_bankswitch1_w);
DECLARE_READ8_MEMBER(mcu_tnzs_r);
DECLARE_WRITE8_MEMBER(mcu_tnzs_w);
DECLARE_READ8_MEMBER(mcu_arknoid2_r);
DECLARE_WRITE8_MEMBER(mcu_arknoid2_w);
DECLARE_READ8_MEMBER(mcu_extrmatn_r);
DECLARE_WRITE8_MEMBER(mcu_extrmatn_w);
DECLARE_READ8_MEMBER(arknoid2_mcu_r);
DECLARE_WRITE8_MEMBER(arknoid2_mcu_w);
DECLARE_WRITE8_MEMBER(arknoid2_mcu_reset_w);
DECLARE_READ8_MEMBER(kageki_csport_r);
DECLARE_WRITE8_MEMBER(kageki_csport_w);
DECLARE_WRITE8_MEMBER(kabukiz_sound_bank_w);
@ -137,6 +137,6 @@ public:
INTERRUPT_GEN_MEMBER(arknoid2_interrupt);
void mcu_reset();
void arknoid2_mcu_reset();
void mcu_handle_coins(int coin);
};

View File

@ -18,13 +18,9 @@
#include "cpu/mcs48/mcs48.h"
#include "includes/tnzs.h"
READ8_MEMBER(tnzs_state::mcu_tnzs_r)
READ8_MEMBER(tnzs_state::mcu_r)
{
uint8_t data;
data = m_mcu->upi41_master_r(space, offset & 1);
uint8_t data = m_mcu->upi41_master_r(space, offset & 1);
space.device().execute().yield();
// logerror("PC %04x: read %02x from mcu $c00%01x\n", space.device().safe_pcbase(), data, offset);
@ -32,19 +28,18 @@ READ8_MEMBER(tnzs_state::mcu_tnzs_r)
return data;
}
WRITE8_MEMBER(tnzs_state::mcu_tnzs_w)
WRITE8_MEMBER(tnzs_state::mcu_w)
{
// logerror("PC %04x: write %02x to mcu $c00%01x\n", space.device().safe_pcbase(), data, offset);
m_mcu->upi41_master_w(space, offset & 1, data);
}
READ8_MEMBER(tnzs_state::tnzs_port1_r)
READ8_MEMBER(tnzs_state::mcu_port1_r)
{
int data = 0;
switch (m_input_select & 0x0f)
switch (m_input_select)
{
case 0x0a: data = m_in2->read(); break;
case 0x0c: data = m_in0->read(); break;
@ -57,29 +52,21 @@ READ8_MEMBER(tnzs_state::tnzs_port1_r)
return data;
}
READ8_MEMBER(tnzs_state::tnzs_port2_r)
READ8_MEMBER(tnzs_state::mcu_port2_r)
{
int data = m_in2->read();
// logerror("I8742:%04x Read %02x from port 2\n", space.device().safe_pcbase(), data);
return data;
return m_in2->read();
}
WRITE8_MEMBER(tnzs_state::tnzs_port2_w)
WRITE8_MEMBER(tnzs_state::mcu_port2_w)
{
// logerror("I8742:%04x Write %02x to port 2\n", space.device().safe_pcbase(), data);
machine().bookkeeping().coin_lockout_w(0, (data & 0x40));
machine().bookkeeping().coin_lockout_w(1, (data & 0x80));
machine().bookkeeping().coin_lockout_w(0, (data & 0x40) != 0 ? m_lockout_level : !m_lockout_level);
machine().bookkeeping().coin_lockout_w(1, (data & 0x80) != 0 ? m_lockout_level : !m_lockout_level);
machine().bookkeeping().coin_counter_w(0, (~data & 0x10));
machine().bookkeeping().coin_counter_w(1, (~data & 0x20));
m_input_select = data;
m_input_select = data & 0xf;
}
READ8_MEMBER(tnzs_state::arknoid2_sh_f000_r)
{
// logerror("PC %04x: read input %04x\n", space.device().safe_pc(), 0xf000 + offset);
@ -93,7 +80,7 @@ READ8_MEMBER(tnzs_state::arknoid2_sh_f000_r)
}
void tnzs_state::mcu_reset( )
void tnzs_state::arknoid2_mcu_reset()
{
m_mcu_initializing = 3;
m_mcu_coinage_init = 0;
@ -179,248 +166,6 @@ void tnzs_state::mcu_handle_coins( int coin )
m_insertcoin = coin;
}
READ8_MEMBER(tnzs_state::mcu_arknoid2_r)
{
static const char mcu_startup[] = "\x55\xaa\x5a";
// logerror("PC %04x: read mcu %04x\n", space.device().safe_pc(), 0xc000 + offset);
if (offset == 0)
{
/* if the mcu has just been reset, return startup code */
if (m_mcu_initializing)
{
m_mcu_initializing--;
return mcu_startup[2 - m_mcu_initializing];
}
switch (m_mcu_command)
{
case 0x41:
return m_mcu_credits;
case 0xc1:
/* Read the credit counter or the inputs */
if (m_mcu_readcredits == 0)
{
m_mcu_readcredits = 1;
if (m_mcu_reportcoin & 0x08)
{
m_mcu_initializing = 3;
return 0xee; /* tilt */
}
else return m_mcu_credits;
}
else return m_in0->read(); /* buttons */
default:
logerror("error, unknown mcu command\n");
/* should not happen */
return 0xff;
}
}
else
{
/*
status bits:
0 = mcu is ready to send data (read from c000)
1 = mcu has read data (from c000)
2 = unused
3 = unused
4-7 = coin code
0 = nothing
1,2,3 = coin switch pressed
e = tilt
*/
if (m_mcu_reportcoin & 0x08) return 0xe1; /* tilt */
if (m_mcu_reportcoin & 0x01) return 0x11; /* coin 1 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x02) return 0x21; /* coin 2 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x04) return 0x31; /* coin 3 (will trigger "coin inserted" sound) */
return 0x01;
}
}
WRITE8_MEMBER(tnzs_state::mcu_arknoid2_w)
{
if (offset == 0)
{
// logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_command == 0x41)
{
m_mcu_credits = (m_mcu_credits + data) & 0xff;
}
}
else
{
/*
0xc1: read number of credits, then buttons
0x54+0x41: add value to number of credits
0x15: sub 1 credit (when "Continue Play" only)
0x84: coin 1 lockout (issued only in test mode)
0x88: coin 2 lockout (issued only in test mode)
0x80: release coin lockout (issued only in test mode)
during initialization, a sequence of 4 bytes sets coin/credit settings
*/
// logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_initializing)
{
/* set up coin/credit settings */
m_mcu_coinage[m_mcu_coinage_init++] = data;
if (m_mcu_coinage_init == 4)
m_mcu_coinage_init = 0; /* must not happen */
}
if (data == 0xc1)
m_mcu_readcredits = 0; /* reset input port number */
if (data == 0x15)
{
m_mcu_credits = (m_mcu_credits - 1) & 0xff;
if (m_mcu_credits == 0xff)
m_mcu_credits = 0;
}
m_mcu_command = data;
}
}
READ8_MEMBER(tnzs_state::mcu_extrmatn_r)
{
static const char mcu_startup[] = "\x5a\xa5\x55";
// logerror("PC %04x: read mcu %04x\n", space.device().safe_pc(), 0xc000 + offset);
if (offset == 0)
{
/* if the mcu has just been reset, return startup code */
if (m_mcu_initializing)
{
m_mcu_initializing--;
return mcu_startup[2 - m_mcu_initializing];
}
switch (m_mcu_command)
{
case 0x01:
return m_in0->read() ^ 0xff; /* player 1 joystick + buttons */
case 0x02:
return m_in1->read() ^ 0xff; /* player 2 joystick + buttons */
case 0x1a:
return (m_coin1->read() | (m_coin2->read() << 1));
case 0x21:
return m_in2->read() & 0x0f;
case 0x41:
return m_mcu_credits;
case 0xa0:
/* Read the credit counter */
if (m_mcu_reportcoin & 0x08)
{
m_mcu_initializing = 3;
return 0xee; /* tilt */
}
else return m_mcu_credits;
case 0xa1:
/* Read the credit counter or the inputs */
if (m_mcu_readcredits == 0)
{
m_mcu_readcredits = 1;
if (m_mcu_reportcoin & 0x08)
{
m_mcu_initializing = 3;
return 0xee; /* tilt */
// return 0x64; /* theres a reset input somewhere */
}
else return m_mcu_credits;
}
/* buttons */
else return ((m_in0->read() & 0xf0) | (m_in1->read() >> 4)) ^ 0xff;
default:
logerror("error, unknown mcu command\n");
/* should not happen */
return 0xff;
}
}
else
{
/*
status bits:
0 = mcu is ready to send data (read from c000)
1 = mcu has read data (from c000)
2 = unused
3 = unused
4-7 = coin code
0 = nothing
1,2,3 = coin switch pressed
e = tilt
*/
if (m_mcu_reportcoin & 0x08) return 0xe1; /* tilt */
if (m_mcu_reportcoin & 0x01) return 0x11; /* coin 1 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x02) return 0x21; /* coin 2 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x04) return 0x31; /* coin 3 (will trigger "coin inserted" sound) */
return 0x01;
}
}
WRITE8_MEMBER(tnzs_state::mcu_extrmatn_w)
{
if (offset == 0)
{
// logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_command == 0x41)
{
m_mcu_credits = (m_mcu_credits + data) & 0xff;
}
}
else
{
/*
0xa0: read number of credits
0xa1: read number of credits, then buttons
0x01: read player 1 joystick + buttons
0x02: read player 2 joystick + buttons
0x1a: read coin switches
0x21: read service & tilt switches
0x4a+0x41: add value to number of credits
0x84: coin 1 lockout (issued only in test mode)
0x88: coin 2 lockout (issued only in test mode)
0x80: release coin lockout (issued only in test mode)
during initialization, a sequence of 4 bytes sets coin/credit settings
*/
// logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_initializing)
{
/* set up coin/credit settings */
m_mcu_coinage[m_mcu_coinage_init++] = data;
if (m_mcu_coinage_init == 4)
m_mcu_coinage_init = 0; /* must not happen */
}
if (data == 0xa1)
m_mcu_readcredits = 0; /* reset input port number */
/* Dr Toppel decrements credits differently. So handle it */
if ((data == 0x09) && (m_mcu_type == MCU_DRTOPPEL || m_mcu_type == MCU_PLUMPOP))
m_mcu_credits = (m_mcu_credits - 1) & 0xff; /* Player 1 start */
if ((data == 0x18) && (m_mcu_type == MCU_DRTOPPEL || m_mcu_type == MCU_PLUMPOP))
m_mcu_credits = (m_mcu_credits - 2) & 0xff; /* Player 2 start */
m_mcu_command = data;
}
}
/*********************************
TNZS sync bug kludge
@ -482,37 +227,41 @@ WRITE8_MEMBER(tnzs_state::tnzs_sync_kludge_w)
DRIVER_INIT_MEMBER(tnzs_state,plumpop)
{
m_mcu_type = MCU_PLUMPOP;
m_mcu_type = MCU_MCHIP_LLE;
m_lockout_level = false;
}
DRIVER_INIT_MEMBER(tnzs_state,extrmatn)
{
m_mcu_type = MCU_EXTRMATN;
m_mcu_type = MCU_MCHIP_LLE;
m_lockout_level = false;
}
DRIVER_INIT_MEMBER(tnzs_state,arknoid2)
{
m_mcu_type = MCU_ARKANOID;
m_mcu_type = MCU_ARKANOID_SIM;
}
DRIVER_INIT_MEMBER(tnzs_state,drtoppel)
{
m_mcu_type = MCU_DRTOPPEL;
/* drtoppel writes to the palette RAM area even if it has PROMs! We have to patch it out. */
m_maincpu->space(AS_PROGRAM).nop_write(0xf800, 0xfbff);
m_lockout_level = false;
m_mcu_type = MCU_MCHIP_LLE;
}
DRIVER_INIT_MEMBER(tnzs_state,chukatai)
{
m_mcu_type = MCU_CHUKATAI;
m_lockout_level = true;
m_mcu_type = MCU_MCHIP_LLE;
}
DRIVER_INIT_MEMBER(tnzs_state,tnzs)
{
m_mcu_type = MCU_TNZS;
/* we need to install a kludge to avoid problems with a bug in the original code */
// m_maincpu->space(AS_PROGRAM).install_write_handler(0xef10, 0xef10, write8_delegate(FUNC(tnzs_state::tnzs_sync_kludge_w), this));
m_lockout_level = true;
m_mcu_type = MCU_MCHIP_LLE;
}
DRIVER_INIT_MEMBER(tnzs_state,tnzsb)
@ -547,65 +296,118 @@ DRIVER_INIT_MEMBER(tnzs_state,kageki)
}
READ8_MEMBER(tnzs_state::tnzs_mcu_r)
READ8_MEMBER(tnzs_state::arknoid2_mcu_r)
{
switch (m_mcu_type)
static const char mcu_startup[] = "\x55\xaa\x5a";
//logerror("PC %04x: read mcu %04x\n", space.device().safe_pc(), 0xc000 + offset);
if (offset == 0)
{
case MCU_TNZS:
case MCU_CHUKATAI:
return mcu_tnzs_r(space, offset);
case MCU_ARKANOID:
return mcu_arknoid2_r(space, offset);
case MCU_EXTRMATN:
case MCU_DRTOPPEL:
case MCU_PLUMPOP:
return mcu_extrmatn_r(space, offset);
/* if the mcu has just been reset, return startup code */
if (m_mcu_initializing)
{
m_mcu_initializing--;
return mcu_startup[2 - m_mcu_initializing];
}
switch (m_mcu_command)
{
case 0x41:
return m_mcu_credits;
case 0xc1:
/* Read the credit counter or the inputs */
if (m_mcu_readcredits == 0)
{
m_mcu_readcredits = 1;
if (m_mcu_reportcoin & 0x08)
{
m_mcu_initializing = 3;
return 0xee; /* tilt */
}
else return m_mcu_credits;
}
else return m_in0->read(); /* buttons */
default:
logerror("error, unknown mcu command\n");
/* should not happen */
return 0xff;
}
}
else
{
/*
status bits:
0 = mcu is ready to send data (read from c000)
1 = mcu has read data (from c000)
2 = unused
3 = unused
4-7 = coin code
0 = nothing
1,2,3 = coin switch pressed
e = tilt
*/
if (m_mcu_reportcoin & 0x08) return 0xe1; /* tilt */
if (m_mcu_reportcoin & 0x01) return 0x11; /* coin 1 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x02) return 0x21; /* coin 2 (will trigger "coin inserted" sound) */
if (m_mcu_reportcoin & 0x04) return 0x31; /* coin 3 (will trigger "coin inserted" sound) */
return 0x01;
}
}
WRITE8_MEMBER(tnzs_state::tnzs_mcu_w)
WRITE8_MEMBER(tnzs_state::arknoid2_mcu_w)
{
switch (m_mcu_type)
if (offset == 0)
{
case MCU_TNZS:
case MCU_CHUKATAI:
mcu_tnzs_w(space, offset, data);
break;
case MCU_ARKANOID:
mcu_arknoid2_w(space, offset, data);
break;
case MCU_EXTRMATN:
case MCU_DRTOPPEL:
case MCU_PLUMPOP:
mcu_extrmatn_w(space, offset, data);
break;
default:
break;
//logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_command == 0x41)
{
m_mcu_credits = (m_mcu_credits + data) & 0xff;
}
}
else
{
/*
0xc1: read number of credits, then buttons
0x54+0x41: add value to number of credits
0x15: sub 1 credit (when "Continue Play" only)
0x84: coin 1 lockout (issued only in test mode)
0x88: coin 2 lockout (issued only in test mode)
0x80: release coin lockout (issued only in test mode)
during initialization, a sequence of 4 bytes sets coin/credit settings
*/
//logerror("PC %04x: write %02x to mcu %04x\n", space.device().safe_pc(), data, 0xc000 + offset);
if (m_mcu_initializing)
{
/* set up coin/credit settings */
m_mcu_coinage[m_mcu_coinage_init++] = data;
if (m_mcu_coinage_init == 4)
m_mcu_coinage_init = 0; /* must not happen */
}
if (data == 0xc1)
m_mcu_readcredits = 0; /* reset input port number */
if (data == 0x15)
{
m_mcu_credits = (m_mcu_credits - 1) & 0xff;
if (m_mcu_credits == 0xff)
m_mcu_credits = 0;
}
m_mcu_command = data;
}
}
INTERRUPT_GEN_MEMBER(tnzs_state::arknoid2_interrupt)
{
int coin;
switch (m_mcu_type)
{
case MCU_ARKANOID:
case MCU_EXTRMATN:
case MCU_DRTOPPEL:
case MCU_PLUMPOP:
coin = 0;
coin |= ((m_coin1->read() & 1) << 0);
int coin = ((m_coin1->read() & 1) << 0);
coin |= ((m_coin2->read() & 1) << 1);
coin |= ((m_in2->read() & 3) << 2);
coin ^= 0x0c;
mcu_handle_coins(coin);
break;
default:
break;
}
device.execute().set_input_line(0, HOLD_LINE);
}
@ -613,22 +415,12 @@ INTERRUPT_GEN_MEMBER(tnzs_state::arknoid2_interrupt)
MACHINE_RESET_MEMBER(tnzs_state,tnzs)
{
/* initialize the mcu simulation */
switch (m_mcu_type)
{
case MCU_ARKANOID:
case MCU_EXTRMATN:
case MCU_DRTOPPEL:
case MCU_PLUMPOP:
mcu_reset();
break;
default:
break;
}
if (m_mcu_type == MCU_ARKANOID_SIM)
arknoid2_mcu_reset();
m_kageki_csport_sel = 0;
m_input_select = 0;
m_mcu_readcredits = 0; // this might belong to mcu_reset
m_insertcoin = 0; // this might belong to mcu_reset
m_mcu_readcredits = 0; // this might belong to arknoid2_mcu_reset
m_insertcoin = 0; // this might belong to arknoid2_mcu_reset
}
MACHINE_RESET_MEMBER(tnzs_state,jpopnics)
@ -655,7 +447,6 @@ MACHINE_START_MEMBER(tnzs_state,tnzs)
MACHINE_START_CALL_MEMBER( tnzs_common );
save_item(NAME(m_kageki_csport_sel));
save_item(NAME(m_input_select));
save_item(NAME(m_mcu_readcredits));
save_item(NAME(m_insertcoin));
save_item(NAME(m_mcu_initializing));
@ -684,21 +475,25 @@ WRITE8_MEMBER(tnzs_state::tnzs_ramrom_bankswitch_w)
m_mainbank->set_bank(data & 0x07);
}
WRITE8_MEMBER(tnzs_state::arknoid2_mcu_reset_w)
{
if (data & 0x04)
arknoid2_mcu_reset();
/* bits 0-1 select ROM bank */
m_bank2 = data & 0x03;
m_subbank->set_entry(m_bank2);
}
WRITE8_MEMBER(tnzs_state::tnzs_bankswitch1_w)
{
// logerror("PC %04x: writing %02x to bankswitch 1\n", space.device().safe_pc(),data);
switch (m_mcu_type)
{
case MCU_TNZS:
case MCU_CHUKATAI:
/* bit 2 resets the mcu */
if (data & 0x04)
{
if (m_mcu != nullptr && m_mcu->type() == I8742)
case MCU_MCHIP_LLE:
if ((data & 0x04) != 0 && m_mcu != nullptr)
m_mcu->set_input_line(INPUT_LINE_RESET, PULSE_LINE);
}
/* Coin count and lockout is handled by the i8742 */
break;
case MCU_NONE_INSECTX:
machine().bookkeeping().coin_lockout_w(0, (~data & 0x04));
@ -718,14 +513,6 @@ WRITE8_MEMBER(tnzs_state::tnzs_bankswitch1_w)
machine().bookkeeping().coin_counter_w(0, (data & 0x04));
machine().bookkeeping().coin_counter_w(1, (data & 0x08));
break;
case MCU_ARKANOID:
case MCU_EXTRMATN:
case MCU_DRTOPPEL:
case MCU_PLUMPOP:
/* bit 2 resets the mcu */
if (data & 0x04)
mcu_reset();
break;
default:
break;
}