diff --git a/src/mame/drivers/chinsan.cpp b/src/mame/drivers/chinsan.cpp index 0ca869a58c5..827e036219a 100644 --- a/src/mame/drivers/chinsan.cpp +++ b/src/mame/drivers/chinsan.cpp @@ -85,7 +85,7 @@ public: DECLARE_PALETTE_INIT(chinsan); uint32_t screen_update_chinsan(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); DECLARE_WRITE_LINE_MEMBER(chin_adpcm_int); - required_device m_maincpu; + required_device m_maincpu; required_device m_adpcm; required_device m_gfxdecode; required_device m_palette; @@ -597,7 +597,7 @@ void chinsan_state::machine_reset() static MACHINE_CONFIG_START( chinsan, chinsan_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", Z80,10000000/2) /* ? MHz */ + MCFG_CPU_ADD("maincpu", MC8123, 10000000/2) /* ? MHz */ MCFG_CPU_PROGRAM_MAP(chinsan_map) MCFG_CPU_IO_MAP(chinsan_io) MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) @@ -650,7 +650,7 @@ ROM_START( chinsan ) ROM_CONTINUE( 0x00000, 0x08000 ) // first half is blank ROM_LOAD( "mm01.8d", 0x08000, 0x10000, CRC(c69ddbf5) SHA1(9533365c1761b113174d53a2e23ce6a7baca7dfe) ) - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-5012.key", 0x0000, 0x2000, CRC(2ecfb132) SHA1(3110ef82080dd7d908cc6bf34c6643f187f90b29) ) ROM_REGION( 0x30000, "gfx1", 0 ) @@ -680,7 +680,7 @@ ROM_END DRIVER_INIT_MEMBER(chinsan_state,chinsan) { m_decrypted_opcodes = std::make_unique(0x18000); - mc8123_decode(memregion("maincpu")->base(), m_decrypted_opcodes.get(), memregion("user1")->base(), 0x18000); + downcast(*m_maincpu).decode(memregion("maincpu")->base(), m_decrypted_opcodes.get(), 0x18000); } diff --git a/src/mame/drivers/freekick.cpp b/src/mame/drivers/freekick.cpp index 5e67ee8f78d..e5444f55b76 100644 --- a/src/mame/drivers/freekick.cpp +++ b/src/mame/drivers/freekick.cpp @@ -709,7 +709,7 @@ MACHINE_RESET_MEMBER(freekick_state,oigas) } static MACHINE_CONFIG_START( omega, freekick_state ) - MCFG_CPU_ADD("maincpu", Z80, XTAL_18_432MHz/6) // unknown divisor + MCFG_CPU_ADD("maincpu", MC8123, XTAL_18_432MHz/6) // unknown divisor MCFG_CPU_PROGRAM_MAP(omega_map) MCFG_CPU_IO_MAP(omega_io_map) MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) @@ -782,8 +782,11 @@ static MACHINE_CONFIG_DERIVED( pbillrd, base ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( pbillrdm, pbillrd ) - MCFG_CPU_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", MC8123, XTAL_12MHz/4) + MCFG_CPU_PROGRAM_MAP(pbillrd_map) MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + MCFG_CPU_PERIODIC_INT_DRIVER(freekick_state, irq0_line_hold, 120) // measured on PCB + MCFG_CPU_VBLANK_INT_DRIVER("screen", freekick_state, freekick_irqgen) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( freekickb, base ) @@ -827,6 +830,22 @@ static MACHINE_CONFIG_DERIVED( gigas, base ) MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_gigas) MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( gigasm, base ) + + /* basic machine hardware */ + MCFG_CPU_REPLACE("maincpu", MC8123, XTAL_12MHz/4) + MCFG_CPU_PROGRAM_MAP(gigas_map) + MCFG_CPU_IO_MAP(gigas_io_map) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) + + MCFG_MACHINE_START_OVERRIDE(freekick_state,freekick) + MCFG_MACHINE_RESET_OVERRIDE(freekick_state,freekick) + + /* video hardware */ + MCFG_SCREEN_MODIFY("screen") + MCFG_SCREEN_UPDATE_DRIVER(freekick_state, screen_update_gigas) +MACHINE_CONFIG_END + static MACHINE_CONFIG_DERIVED( oigas, gigas ) /* basic machine hardware */ @@ -876,7 +895,7 @@ ROM_START( pbillrds ) /* Encrytped with a Sega MC-8123 (317-0030) CPU module */ ROM_LOAD( "10625.8r", 0x4000, 0x8000, CRC(8977c724) SHA1(f00835a04dc6fa7d8c1e382dace515f2aa7d6f44) ) /* encrypted */ ROM_LOAD( "10627.10n", 0xc000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0030.key", 0x0000, 0x2000, CRC(9223f06d) SHA1(51a22a4c80fe273526bde68918c13c6476cec383) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ @@ -904,7 +923,7 @@ ROM_START( pbillrdsa ) /* all ROMs were HN4827128G-25, except 17, HN27256G-25, C ROM_LOAD( "17", 0x4000, 0x8000, CRC(9bb3d467) SHA1(5d61c80c920363cbcb548f4a08434e2a05b3d5f3) ) /* encrypted */ ROM_LOAD( "19", 0xc000, 0x4000, CRC(2335e6dd) SHA1(82352b6f4abea88aad3a96ca63cccccb6e278f48) ) /* encrypted */ - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0030.key", 0x0000, 0x2000, CRC(9223f06d) SHA1(51a22a4c80fe273526bde68918c13c6476cec383) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ @@ -1178,7 +1197,7 @@ ROM_START( gigas ) /* From an actual Sega board 834-6167 with mc-8123: 317-5002 ROM_LOAD( "8.8n", 0x00000, 0x4000, CRC(34ea8262) SHA1(a71c865ffccfc79455402c53639c4fa77a746cf1) ) ROM_LOAD( "7.8r", 0x04000, 0x8000, CRC(43653909) SHA1(30f6666ba5c0f016299f462c4c07c81ee4832808) ) /* 27256 */ - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-5002.key", 0x0000, 0x2000, CRC(86a7e5f6) SHA1(3ff3a17c02eb5610182b6febfada4e8eca0c5eea) ) ROM_REGION( 0xc000, "gfx1", 0 ) /* GFX */ @@ -1304,7 +1323,7 @@ ROM_START( omega ) ROM_LOAD("17.m10", 0x0000, 0x4000, CRC(c7de0993) SHA1(35ecd464935faba1dc7d0dbf48e1b17153626bfd)) // 27128 ROM_LOAD("8.n10", 0x4000, 0x8000, CRC(9bb61910) SHA1(f8a1210dbf93e901e246e6adf4cd905acc3ef376)) // 27256 - ROM_REGION(0x2000, "user1", 0) // MC8123 key + ROM_REGION(0x2000, "maincpu:key", 0) // MC8123 key ROM_LOAD("omega.key", 0x0000, 0x2000, CRC(0a63943f) SHA1(9e581ea0c5bf6c0ed5d402d3bab053766b8e44c2)) ROM_REGION(0xc000, "gfx1", 0) @@ -1350,7 +1369,7 @@ DRIVER_INIT_MEMBER(freekick_state,gigasb) DRIVER_INIT_MEMBER(freekick_state,pbillrds) { uint8_t *decrypted_opcodes = auto_alloc_array(machine(), uint8_t, 0x10000); - mc8123_decode(memregion("maincpu")->base(), decrypted_opcodes, memregion("user1")->base(), 0x10000); + downcast(*m_maincpu).decode(memregion("maincpu")->base(), decrypted_opcodes, 0x10000); membank("bank0d")->set_base(decrypted_opcodes); m_bank1d->configure_entries(0, 2, decrypted_opcodes + 0x8000, 0x4000); } @@ -1358,7 +1377,7 @@ DRIVER_INIT_MEMBER(freekick_state,pbillrds) DRIVER_INIT_MEMBER(freekick_state,gigas) { uint8_t *decrypted_opcodes = auto_alloc_array(machine(), uint8_t, 0xc000); - mc8123_decode(memregion("maincpu")->base(), decrypted_opcodes, memregion("user1")->base(), 0xc000); + downcast(*m_maincpu).decode(memregion("maincpu")->base(), decrypted_opcodes, 0xc000); membank("bank0d")->set_base(decrypted_opcodes); m_bank1d->set_base(decrypted_opcodes + 0x8000); } @@ -1371,7 +1390,7 @@ DRIVER_INIT_MEMBER(freekick_state,gigas) * *************************************/ /* YEAR NAME PARENT MACHINE INPUT STATE INIT ROT COMPANY FULLNAME FLAGS */ -GAME( 1986, gigas, 0, gigas, gigas, freekick_state, gigas, ROT270, "Sega", "Gigas (MC-8123, 317-5002)", MACHINE_SUPPORTS_SAVE ) +GAME( 1986, gigas, 0, gigasm, gigas, freekick_state, gigas, ROT270, "Sega", "Gigas (MC-8123, 317-5002)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, gigasb, gigas, gigas, gigas, freekick_state, gigasb, ROT270, "bootleg", "Gigas (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, oigas, gigas , oigas, gigas, freekick_state, gigasb, ROT270, "bootleg", "Oigas (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, gigasm2b, 0, gigas, gigasm2, freekick_state, gigasb, ROT270, "bootleg", "Gigas Mark II (bootleg)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/ninjakd2.cpp b/src/mame/drivers/ninjakd2.cpp index 2fb7af19de8..78972c598dc 100644 --- a/src/mame/drivers/ninjakd2.cpp +++ b/src/mame/drivers/ninjakd2.cpp @@ -977,7 +977,14 @@ static MACHINE_CONFIG_START( ninjakd2_core, ninjakd2_state ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( ninjakd2, ninjakd2_core ) + MCFG_CPU_REPLACE("soundcpu", MC8123, MAIN_CLOCK_5) /* verified */ + MCFG_CPU_PROGRAM_MAP(ninjakd2_sound_cpu) + MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( ninjakd2b, ninjakd2_core ) MCFG_CPU_MODIFY("soundcpu") + MCFG_CPU_PROGRAM_MAP(ninjakd2_sound_cpu) MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MACHINE_CONFIG_END @@ -1070,7 +1077,7 @@ ROM_START( ninjakd2 ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "nk2_06.rom", 0x00000, 0x10000, CRC(d3a18a79) SHA1(e4df713f89d8a8b43ef831b14864c50ec9b53f0b) ) // encrypted - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "soundcpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) ) ROM_REGION( 0x08000, "gfx1", 0 ) // fg tiles (need lineswapping) @@ -1153,7 +1160,7 @@ ROM_START( ninjakd2c ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "nk2_06.rom", 0x00000, 0x10000, CRC(d3a18a79) SHA1(e4df713f89d8a8b43ef831b14864c50ec9b53f0b) ) // encrypted - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "soundcpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) ) ROM_REGION( 0x08000, "gfx1", 0 ) // fg tiles (need lineswapping) @@ -1182,7 +1189,7 @@ ROM_START( rdaction ) ROM_REGION( 0x10000, "soundcpu", 0 ) ROM_LOAD( "nk2_06.rom", 0x0000, 0x10000, CRC(d3a18a79) SHA1(e4df713f89d8a8b43ef831b14864c50ec9b53f0b) ) // 6.3h encrypted - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "soundcpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) ) ROM_REGION( 0x08000, "gfx1", 0 ) // fg tiles (need lineswapping) @@ -1222,7 +1229,7 @@ ROM_START( jt104 ) // identical to radaction set with different gfx rom and decr ROM_LOAD( "nk2_06.bin", 0x10000, 0x8000, CRC(7bfe6c9e) SHA1(aef8cbeb0024939bf65f77113a5cf777f6613722) ) // decrypted opcodes ROM_CONTINUE( 0x00000, 0x8000 ) // decrypted data - ROM_REGION( 0x2000, "user1", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "soundcpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "ninjakd2.key", 0x0000, 0x2000, CRC(ec25318f) SHA1(619da3f69f9919e1457f79ee1d38e7ec80c4ebb0) ) ROM_REGION( 0x08000, "gfx1", 0 ) // fg tiles (need lineswapping) @@ -1628,7 +1635,7 @@ void ninjakd2_state::gfx_unscramble() DRIVER_INIT_MEMBER(ninjakd2_state,ninjakd2) { - mc8123_decode(memregion("soundcpu")->base(), m_decrypted_opcodes, memregion("user1")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_decrypted_opcodes, 0x8000); gfx_unscramble(); } @@ -1691,8 +1698,8 @@ DRIVER_INIT_MEMBER(ninjakd2_state,robokidj) // YEAR, NAME, PARENT, MACHINE, INPUT, INIT, MONITOR,COMPANY,FULLNAME,FLAGS GAME( 1987, ninjakd2, 0, ninjakd2, ninjakd2, ninjakd2_state, ninjakd2, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 1)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, ninjakd2a, ninjakd2, ninjakd2, ninjakd2, ninjakd2_state, bootleg, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 2, bootleg?)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, ninjakd2b, ninjakd2, ninjakd2, rdaction, ninjakd2_state, bootleg, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 3, bootleg?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, ninjakd2a, ninjakd2, ninjakd2b, ninjakd2, ninjakd2_state, bootleg, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 2, bootleg?)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, ninjakd2b, ninjakd2, ninjakd2b, rdaction, ninjakd2_state, bootleg, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 3, bootleg?)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, ninjakd2c, ninjakd2, ninjakd2, rdaction, ninjakd2_state, ninjakd2, ROT0, "UPL", "Ninja-Kid II / NinjaKun Ashura no Shou (set 4)", MACHINE_SUPPORTS_SAVE ) // close to set 3 GAME( 1987, rdaction, ninjakd2, ninjakd2, rdaction, ninjakd2_state, ninjakd2, ROT0, "UPL (World Games license)", "Rad Action / NinjaKun Ashura no Shou", MACHINE_SUPPORTS_SAVE ) GAME( 1987, jt104, ninjakd2, ninjakd2, rdaction, ninjakd2_state, bootleg, ROT0, "UPL (United Amusements license)", "JT-104 (title screen modification of Rad Action)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/drivers/segae.cpp b/src/mame/drivers/segae.cpp index 8e535474939..cf3b98cbd19 100644 --- a/src/mame/drivers/segae.cpp +++ b/src/mame/drivers/segae.cpp @@ -960,7 +960,7 @@ ROM_START( fantzn2 ) ROM_LOAD( "epr-11414.ic4", 0x30000, 0x10000, CRC(6f7a9f5f) SHA1(b53aa2eded781c80466a79b7d81383b9a875d0be) ) ROM_LOAD( "epr-11412.ic2", 0x40000, 0x10000, CRC(b14db5af) SHA1(04c7fb659385438b3d8f9fb66800eb7b6373bda9) ) - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0057.key", 0x0000, 0x2000, CRC(ee43d0f0) SHA1(72cb75a4d8352fe372db12046a59ea044360d5c3) ) ROM_END @@ -975,7 +975,7 @@ ROM_START( opaopa ) ROM_LOAD( "epr-11051.ic3", 0x20000, 0x08000, CRC(4ca132a2) SHA1(cb4e4c01b6ab070eef37c0603190caafe6236ccd) ) /* encrypted */ ROM_LOAD( "epr-11050.ic2", 0x28000, 0x08000, CRC(a165e2ef) SHA1(498ff4c5d3a2658567393378c56be6ed86ac0384) ) /* encrypted */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0042.key", 0x0000, 0x2000, CRC(d6312538) SHA1(494ac7f080775c21dc7d369e6ea78f3299e6975a) ) ROM_END @@ -1052,7 +1052,9 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( systemex, systeme ) - MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", MC8123, XTAL_10_738635MHz/2) /* Z80B @ 5.3693Mhz */ + MCFG_CPU_PROGRAM_MAP(systeme_map) + MCFG_CPU_IO_MAP(io_map) MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) MACHINE_CONFIG_END @@ -1065,7 +1067,9 @@ static MACHINE_CONFIG_DERIVED( systemex_315_5177, systeme ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( systemeb, systeme ) - MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", MC8123, XTAL_10_738635MHz/2) /* Z80B @ 5.3693Mhz */ + MCFG_CPU_PROGRAM_MAP(systeme_map) + MCFG_CPU_IO_MAP(io_map) MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) MACHINE_CONFIG_END @@ -1073,7 +1077,7 @@ MACHINE_CONFIG_END DRIVER_INIT_MEMBER(systeme_state, opaopa) { uint8_t *banked_decrypted_opcodes = auto_alloc_array(machine(), uint8_t, m_maincpu_region->bytes()); - mc8123_decode(m_maincpu_region->base(), banked_decrypted_opcodes, memregion("key")->base(), m_maincpu_region->bytes()); + downcast(*m_maincpu).decode(m_maincpu_region->base(), banked_decrypted_opcodes, m_maincpu_region->bytes()); m_bank0d->set_base(banked_decrypted_opcodes); m_bank1d->configure_entries(0, 16, banked_decrypted_opcodes + 0x10000, 0x4000); @@ -1082,7 +1086,7 @@ DRIVER_INIT_MEMBER(systeme_state, opaopa) DRIVER_INIT_MEMBER(systeme_state, fantzn2) { - mc8123_decode(m_maincpu_region->base(), m_decrypted_opcodes, memregion("key")->base(), 0x8000); + downcast(*m_maincpu).decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000); } diff --git a/src/mame/drivers/segas16b.cpp b/src/mame/drivers/segas16b.cpp index 5ce8c3737cc..1ae43e589c7 100644 --- a/src/mame/drivers/segas16b.cpp +++ b/src/mame/drivers/segas16b.cpp @@ -3638,7 +3638,9 @@ static MACHINE_CONFIG_START( system16b, segas16b_state ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( system16b_mc8123, system16b ) - MCFG_CPU_MODIFY("soundcpu") + MCFG_CPU_REPLACE("soundcpu", MC8123, MASTER_CLOCK_10MHz/2) + MCFG_CPU_PROGRAM_MAP(sound_map) + MCFG_CPU_IO_MAP(sound_portmap) MCFG_CPU_DECRYPTED_OPCODES_MAP(sound_decrypted_opcodes_map) MACHINE_CONFIG_END @@ -3987,7 +3989,7 @@ ROM_START( aliensyn7 ) ROM_LOAD( "epr-10725.a9", 0x20000, 0x8000, CRC(6a50e08f) SHA1(d34b2ccadb8b07d5ad99cab5c5b5b79642c65574) ) ROM_LOAD( "epr-10726.a10", 0x30000, 0x8000, CRC(d50b7736) SHA1(b1f8e3b0cf2ffee5382098100cfabe21b383cd51) ) - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "317-00xx.key", 0x0000, 0x2000, CRC(76b370cd) SHA1(996a4a24dec085caf93cbe614d3b0888379c91dd) ) ROM_END @@ -4279,7 +4281,7 @@ ROM_START( altbeast4 ) ROM_LOAD( "opr-11672.a11", 0x10000, 0x20000, CRC(bbd7f460) SHA1(bbc5c2219cb3a827d84062b19affd9780da2a3cf) ) ROM_LOAD( "opr-11673.a12", 0x30000, 0x20000, CRC(400c4a36) SHA1(de4bdfa91734410e0a7f6a16bf8336db172f458a) ) - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "317-0066.key", 0x0000, 0x2000, CRC(ed85a054) SHA1(dcc84ec077a8a489f45abfd2bf4a9ba377da28a5) ) ROM_END @@ -4395,7 +4397,7 @@ ROM_START( altbeast2 ) ROM_LOAD( "opr-11672.a11", 0x10000, 0x20000, CRC(bbd7f460) SHA1(bbc5c2219cb3a827d84062b19affd9780da2a3cf) ) ROM_LOAD( "opr-11673.a12", 0x30000, 0x20000, CRC(400c4a36) SHA1(de4bdfa91734410e0a7f6a16bf8336db172f458a) ) - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "317-0066.key", 0x0000, 0x2000, CRC(ed85a054) SHA1(dcc84ec077a8a489f45abfd2bf4a9ba377da28a5) ) ROM_END @@ -7055,7 +7057,7 @@ ROM_START( cencourt ) ROM_LOAD( "epr-a-10.a10", 0x30000, 0x08000, CRC(10263746) SHA1(1f981fb185c6a9795208ecdcfba36cf892a99ed5) ) // == epr-11860.a10 ROM_LOAD( "epr-a-11.a11", 0x40000, 0x08000, CRC(38b54a71) SHA1(68ec4ef5b115844214ff2213be1ce6678904fbd2) ) // == epr-11861.a11 - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "mc-8123b_center_court.key", 0x0000, 0x2000, CRC(2be5c90b) SHA1(e98d989237f2b001950b876efdb21c1507162830) ) // No official 317-xxxx number ROM_END @@ -7487,7 +7489,7 @@ ROM_START( shinobi4 ) ROM_LOAD( "epr-11377.a10", 0x00000, 0x08000, CRC(0fb6af34) SHA1(ae9da18bd2db317ed96c5f642f90cc1eba60ba99) ) // MC8123B (317-0054) encrypted version of epr-11361.a10 above ROM_LOAD( "epr-11362.a11", 0x10000, 0x20000, CRC(256af749) SHA1(041bd007ea7708c6d69f07865828b9bd17a139f5) ) - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "317-0054.key", 0x0000, 0x2000, CRC(39fd4535) SHA1(93bbb139d2d5acc6a1e338d92077e79a5e880b2e) ) ROM_END @@ -7525,7 +7527,7 @@ ROM_START( shinobi3 ) ROM_LOAD( "epr-11288.a8", 0x10000, 0x8000, CRC(c8df8460) SHA1(0aeb41a493df155edb5f600f53ec43b798927dff) ) ROM_LOAD( "epr-11289.a9", 0x20000, 0x8000, CRC(e5a4cf30) SHA1(d1982da7a550c11ab2253f5d64ac6ab847da0a04) ) - ROM_REGION( 0x2000, "mc8123", 0 ) // MC8123 key + ROM_REGION( 0x2000, "soundcpu:key", 0 ) // MC8123 key ROM_LOAD( "317-0054.key", 0x0000, 0x2000, CRC(39fd4535) SHA1(93bbb139d2d5acc6a1e338d92077e79a5e880b2e) ) ROM_END @@ -8631,7 +8633,7 @@ DRIVER_INIT_MEMBER(segas16b_state,aceattac_5358) DRIVER_INIT_MEMBER(segas16b_state,aliensyn7_5358_small) { DRIVER_INIT_CALL(generic_5358_small); - mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mc8123")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, 0x8000); } @@ -8650,7 +8652,7 @@ DRIVER_INIT_MEMBER(segas16b_state,altbeas5_5521) DRIVER_INIT_MEMBER(segas16b_state,altbeas4_5521) { DRIVER_INIT_CALL(generic_5521); - mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mc8123")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,ddux_5704) @@ -8699,7 +8701,7 @@ DRIVER_INIT_MEMBER(segas16b_state,passshtj_5358) DRIVER_INIT_MEMBER(segas16b_state,cencourt_5358) { DRIVER_INIT_CALL(passshtj_5358); - mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mc8123")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,sdi_5358_small) @@ -8724,13 +8726,13 @@ DRIVER_INIT_MEMBER(segas16b_state,defense_5358_small) DRIVER_INIT_MEMBER(segas16b_state,shinobi4_5521) { DRIVER_INIT_CALL(generic_5521); - mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mc8123")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,shinobi3_5358) { DRIVER_INIT_CALL(generic_5358); - mc8123_decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, memregion("mc8123")->base(), 0x8000); + downcast(*m_soundcpu).decode(memregion("soundcpu")->base(), m_sound_decrypted_opcodes, 0x8000); } DRIVER_INIT_MEMBER(segas16b_state,sjryuko_5358_small) diff --git a/src/mame/drivers/system1.cpp b/src/mame/drivers/system1.cpp index 47f623c9bbe..ce5237ce850 100644 --- a/src/mame/drivers/system1.cpp +++ b/src/mame/drivers/system1.cpp @@ -2215,11 +2215,6 @@ static MACHINE_CONFIG_DERIVED( sys1pio, sys1ppi ) MCFG_Z80PIO_OUT_PB_CB(WRITE8(system1_state, videomode_w)) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( sys1piox, sys1pio ) - MCFG_DEVICE_MODIFY("maincpu") - MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) -MACHINE_CONFIG_END - #define ENCRYPTED_SYS1PPI_MAPS \ MCFG_CPU_PROGRAM_MAP(system1_map) \ MCFG_CPU_DECRYPTED_OPCODES_MAP(decrypted_opcodes_map) \ @@ -2232,6 +2227,17 @@ MACHINE_CONFIG_END MCFG_CPU_IO_MAP(system1_pio_io_map) \ MCFG_CPU_VBLANK_INT_DRIVER("screen", system1_state, irq0_line_hold) +#define ENCRYPTED_SYS2_MC8123_MAPS \ + MCFG_CPU_PROGRAM_MAP(system1_map) \ + MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) \ + MCFG_CPU_IO_MAP(system1_ppi_io_map) \ + MCFG_CPU_VBLANK_INT_DRIVER("screen", system1_state, irq0_line_hold) + + +static MACHINE_CONFIG_DERIVED( sys1pioxb, sys1pio ) + MCFG_CPU_REPLACE("maincpu", MC8123, MASTER_CLOCK) + ENCRYPTED_SYS1PIO_MAPS +MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sys1ppix_315_5178, sys1ppi ) MCFG_CPU_REPLACE("maincpu", SEGA_315_5178, MASTER_CLOCK) @@ -2463,7 +2469,12 @@ MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sys2xb, sys2 ) - MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", MC8123, MASTER_CLOCK) + ENCRYPTED_SYS2_MC8123_MAPS +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( sys2xboot, sys2 ) + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) MACHINE_CONFIG_END @@ -2480,7 +2491,12 @@ static MACHINE_CONFIG_DERIVED( sys2row, sys2 ) MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( sys2rowxb, sys2row ) - MCFG_DEVICE_MODIFY("maincpu") + MCFG_CPU_REPLACE("maincpu", MC8123, MASTER_CLOCK) + ENCRYPTED_SYS2_MC8123_MAPS +MACHINE_CONFIG_END + +static MACHINE_CONFIG_DERIVED( sys2rowxboot, sys2row ) + MCFG_CPU_MODIFY("maincpu") MCFG_CPU_DECRYPTED_OPCODES_MAP(banked_decrypted_opcodes_map) MACHINE_CONFIG_END @@ -4533,7 +4549,7 @@ ROM_START( wbml ) ROM_LOAD( "epr11032.91", 0x10000, 0x8000, CRC(9d03bdb2) SHA1(7dbab23e7c7972d9b51a0d3d046374720b7d6af5) ) /* encrypted */ ROM_LOAD( "epr11033.92", 0x18000, 0x8000, CRC(7076905c) SHA1(562fbd9bd60851f7e4e60b725193395b4f193479) ) /* encrypted */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0043.key", 0x0000, 0x2000, CRC(e354abfc) SHA1(07b0d3c51301ebb25909234b6220a3ed20dbcc7d) ) ROM_REGION( 0x10000, "soundcpu", 0 ) @@ -4565,7 +4581,7 @@ ROM_START( wbmljo ) ROM_LOAD( "epr11032.91", 0x10000, 0x8000, CRC(9d03bdb2) SHA1(7dbab23e7c7972d9b51a0d3d046374720b7d6af5) ) /* encrypted */ ROM_LOAD( "epr11033.92", 0x18000, 0x8000, CRC(7076905c) SHA1(562fbd9bd60851f7e4e60b725193395b4f193479) ) /* encrypted */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0043.key", 0x0000, 0x2000, CRC(e354abfc) SHA1(07b0d3c51301ebb25909234b6220a3ed20dbcc7d) ) ROM_REGION( 0x10000, "soundcpu", 0 ) @@ -4847,7 +4863,7 @@ ROM_START( dakkochn ) ROM_LOAD( "epr-11225.ic91", 0x10000, 0x8000, CRC(c540f9e2) SHA1(dbda9355e8b796bcfaee2789714d248c4d7ad58c) ) /* encrypted */ /* 18000-1ffff empty */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123B key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123B key */ ROM_LOAD( "317-5014.key", 0x0000, 0x2000, CRC(bb9df5ad) SHA1(7e7b7255149ae01d19883ecf4a88989f8a9bf4c6) ) ROM_REGION( 0x10000, "soundcpu", 0 ) @@ -4883,7 +4899,7 @@ ROM_START( ufosensi ) ROM_LOAD( "epr11662.91", 0x10000, 0x8000, CRC(0c2e4120) SHA1(d81fbefa95868e3efd29ef3bacf108329781ca17) ) /* encrypted */ ROM_LOAD( "epr11663.92", 0x18000, 0x8000, CRC(4515ebae) SHA1(9b823f10999746292762c2f0a1ca9039efa22506) ) /* encrypted */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0064.key", 0x0000, 0x2000, CRC(da326f36) SHA1(0871b351379a094ac578e0eca5cb17797f9085aa) ) ROM_REGION( 0x10000, "soundcpu", 0 ) @@ -4959,7 +4975,7 @@ ROM_START( blockgal ) ROM_LOAD( "bg.109", 0x4000, 0x4000, CRC(a6b573d5) SHA1(33547a3895bbe65d5a6c40453eeb93e1fedad6de) ) /* encrypted */ /* 0x8000-0xbfff empty (was same as My Hero) */ - ROM_REGION( 0x2000, "key", 0 ) /* MC8123 key */ + ROM_REGION( 0x2000, "maincpu:key", 0 ) /* MC8123 key */ ROM_LOAD( "317-0029.key", 0x0000, 0x2000, CRC(350d7f93) SHA1(7ef12d63b2c7150f8e74f65ec8340471d72b1c03) ) ROM_REGION( 0x10000, "soundcpu", 0 ) @@ -5233,7 +5249,7 @@ DRIVER_INIT_MEMBER(system1_state,myherok) DRIVER_INIT_MEMBER(system1_state,blockgal) { DRIVER_INIT_CALL(bank00); - mc8123_decode(m_maincpu_region->base(), m_decrypted_opcodes, memregion("key")->base(), 0x8000); + downcast(*m_maincpu).decode(m_maincpu_region->base(), m_decrypted_opcodes, 0x8000); } @@ -5245,14 +5261,14 @@ DRIVER_INIT_MEMBER(system1_state,wbml) { DRIVER_INIT_CALL(bank0c); m_banked_decrypted_opcodes = std::make_unique(m_maincpu_region->bytes()); - mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), memregion("key")->base(), m_maincpu_region->bytes()); + downcast(*m_maincpu).decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), m_maincpu_region->bytes()); } DRIVER_INIT_MEMBER(system1_state,ufosensi) { DRIVER_INIT_CALL(bank0c); m_banked_decrypted_opcodes = std::make_unique(m_maincpu_region->bytes()); - mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), memregion("key")->base(), m_maincpu_region->bytes()); + downcast(*m_maincpu).decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), m_maincpu_region->bytes()); } @@ -5261,7 +5277,7 @@ DRIVER_INIT_MEMBER(system1_state,dakkochn) { m_videomode_custom = &system1_state::dakkochn_custom_w; m_banked_decrypted_opcodes = std::make_unique(m_maincpu_region->bytes()); - mc8123_decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), memregion("key")->base(), m_maincpu_region->bytes()); + downcast(*m_maincpu).decode(m_maincpu_region->base(), m_banked_decrypted_opcodes.get(), m_maincpu_region->bytes()); } @@ -5430,7 +5446,7 @@ GAME( 1986, wboy4, wboy, sys1piox_315_5162, wboy, system1_state, b GAME( 1986, wboyu, wboy, sys1pio, wboyu, system1_state, bank00, ROT0, "Escape (Sega license)", "Wonder Boy (prototype?)", MACHINE_SUPPORTS_SAVE ) // appears to be a very early / unfinished version. GAME( 1986, wboy5, wboy, sys1piox_315_5135, wboy3, system1_state, bank00, ROT0, "bootleg", "Wonder Boy (set 5, bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1986, wboyub, wboy, sys1piox_315_5177, wboy, system1_state, bank00, ROT0, "bootleg", "Wonder Boy (US bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, blockgal, 0, sys1piox, blockgal, system1_state, blockgal, ROT90, "Sega / Vic Tokai","Block Gal (MC-8123B, 317-0029)", MACHINE_SUPPORTS_SAVE) +GAME( 1987, blockgal, 0, sys1pioxb, blockgal, system1_state, blockgal, ROT90, "Sega / Vic Tokai","Block Gal (MC-8123B, 317-0029)", MACHINE_SUPPORTS_SAVE) /* PIO-based System 1 with ROM banking */ GAME( 1985, hvymetal, 0, sys1piox_315_5135, hvymetal, system1_state, bank44, ROT0, "Sega", "Heavy Metal (315-5135)", MACHINE_SUPPORTS_SAVE ) @@ -5450,15 +5466,15 @@ GAME( 1986, wboysys2a, wboy, sys2_315_5176, wboysys2, system1_state, b GAME( 1987, tokisens, 0, sys2, tokisens, system1_state, bank0c, ROT90, "Sega", "Toki no Senshi - Chrono Soldier", MACHINE_SUPPORTS_SAVE ) GAME( 1987, wbml, 0, sys2xb, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan New Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, wbmljo, wbml, sys2xb, wbml, system1_state, wbml, ROT0, "Sega / Westone", "Wonder Boy in Monster Land (Japan Old Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, wbmljb, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (Japan bootleg)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, wbmlb, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (English bootleg set 1)", MACHINE_SUPPORTS_SAVE) -GAME( 1987, wbmlbg, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg (Galaxy Electronics)", "Wonder Boy in Monster Land (English bootleg set 2)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, wbmlbge, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "bootleg (Gecas)", "Wonder Boy in Monster Land (English bootleg set 3)", MACHINE_SUPPORTS_SAVE ) -GAME( 2009, wbmlvc, wbml, sys2xb, wbml, system1_state, bootsys2, ROT0, "Sega", "Wonder Boy in Monster Land (English, Virtual Console)", MACHINE_SUPPORTS_SAVE ) -GAME( 2009, wbmlvcd, wbml, sys2xb, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of English, Virtual Console release)", MACHINE_SUPPORTS_SAVE ) // fully decrypted version -GAME( 1987, wbmld, wbml, sys2xb, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of Japan New Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) -GAME( 1987, wbmljod, wbml, sys2xb, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of Japan Old Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, wbmljb, wbml, sys2xboot, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (Japan bootleg)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, wbmlb, wbml, sys2xboot, wbml, system1_state, bootsys2, ROT0, "bootleg", "Wonder Boy in Monster Land (English bootleg set 1)", MACHINE_SUPPORTS_SAVE) +GAME( 1987, wbmlbg, wbml, sys2xboot, wbml, system1_state, bootsys2, ROT0, "bootleg (Galaxy Electronics)", "Wonder Boy in Monster Land (English bootleg set 2)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, wbmlbge, wbml, sys2xboot, wbml, system1_state, bootsys2, ROT0, "bootleg (Gecas)", "Wonder Boy in Monster Land (English bootleg set 3)", MACHINE_SUPPORTS_SAVE ) +GAME( 2009, wbmlvc, wbml, sys2xboot, wbml, system1_state, bootsys2, ROT0, "Sega", "Wonder Boy in Monster Land (English, Virtual Console)", MACHINE_SUPPORTS_SAVE ) +GAME( 2009, wbmlvcd, wbml, sys2xboot, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of English, Virtual Console release)", MACHINE_SUPPORTS_SAVE ) // fully decrypted version +GAME( 1987, wbmld, wbml, sys2xboot, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of Japan New Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) +GAME( 1987, wbmljod, wbml, sys2xboot, wbml, system1_state, bootsys2d, ROT0, "bootleg (mpatou)", "Wonder Boy in Monster Land (decrypted bootleg of Japan Old Ver., MC-8123, 317-0043)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, dakkochn, 0, sys2xb, dakkochn, system1_state, dakkochn, ROT0, "White Board", "DakkoChan House (MC-8123B, 317-5014)", MACHINE_SUPPORTS_SAVE ) GAME( 1987, blockgalb, blockgal, sys2x, blockgal, system1_state, bootleg, ROT90, "bootleg", "Block Gal (bootleg)", MACHINE_SUPPORTS_SAVE ) GAME( 1988, ufosensi, 0, sys2rowxb, ufosensi, system1_state, ufosensi, ROT0, "Sega", "Ufo Senshi Yohko Chan (MC-8123, 317-0064)", MACHINE_SUPPORTS_SAVE ) -GAME( 1988, ufosensib, ufosensi, sys2rowxb, ufosensi, system1_state, bootsys2, ROT0, "bootleg", "Ufo Senshi Yohko Chan (bootleg, not encrypted)", MACHINE_SUPPORTS_SAVE ) +GAME( 1988, ufosensib, ufosensi, sys2rowxboot, ufosensi, system1_state, bootsys2, ROT0, "bootleg", "Ufo Senshi Yohko Chan (bootleg, not encrypted)", MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/machine/mc8123.cpp b/src/mame/machine/mc8123.cpp index b11ec7880a0..10eb243cc25 100644 --- a/src/mame/machine/mc8123.cpp +++ b/src/mame/machine/mc8123.cpp @@ -80,12 +80,27 @@ CPU # Game Notes Seed Upper Limit #include "mc8123.h" +const device_type MC8123 = device_creator; + +//------------------------------------------------- +// mc8123_device - constructor +//------------------------------------------------- + +mc8123_device::mc8123_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : z80_device(mconfig, MC8123, "MC-8123", tag, owner, clock, "mc8123", __FILE__), + m_key(*this, "key", 0x2000) +{ +} + + namespace { template constexpr u8 BITS(T b) { return u8(1) << b; } template constexpr u8 BITS(T b, U... c) { return (u8(1) << b) | BITS(c...); } -u8 decrypt_type0(u8 val, u8 param, unsigned swap) +} // anonymous namespace + +u8 mc8123_device::decrypt_type0(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,7,5,3,1,2,0,6,4); if (swap == 1) val = BITSWAP8(val,5,3,7,2,1,0,4,6); @@ -117,7 +132,7 @@ u8 decrypt_type0(u8 val, u8 param, unsigned swap) } -u8 decrypt_type1a(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type1a(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,4,2,6,5,3,7,1,0); if (swap == 1) val = BITSWAP8(val,6,0,5,4,3,2,1,7); @@ -145,7 +160,7 @@ u8 decrypt_type1a(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt_type1b(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type1b(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,1,0,3,2,5,6,4,7); if (swap == 1) val = BITSWAP8(val,2,0,5,1,7,4,6,3); @@ -173,7 +188,7 @@ u8 decrypt_type1b(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt_type2a(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type2a(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,0,1,4,3,5,6,2,7); if (swap == 1) val = BITSWAP8(val,6,3,0,5,7,4,1,2); @@ -208,7 +223,7 @@ u8 decrypt_type2a(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt_type2b(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type2b(u8 val, u8 param, unsigned swap) { // only 0x20 possible encryptions for this method - all others have 0x40 // this happens because BIT(param,2) cancels the other three @@ -246,7 +261,7 @@ u8 decrypt_type2b(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt_type3a(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type3a(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,5,3,1,7,0,2,6,4); if (swap == 1) val = BITSWAP8(val,3,1,2,5,4,7,0,6); @@ -276,7 +291,7 @@ u8 decrypt_type3a(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt_type3b(u8 val, u8 param, unsigned swap) +u8 mc8123_device::decrypt_type3b(u8 val, u8 param, unsigned swap) { if (swap == 0) val = BITSWAP8(val,3,7,5,4,0,6,2,1); if (swap == 1) val = BITSWAP8(val,7,5,4,6,1,2,0,3); @@ -314,7 +329,7 @@ u8 decrypt_type3b(u8 val, u8 param, unsigned swap) return val; } -u8 decrypt(u8 val, u8 key, bool opcode) +u8 mc8123_device::decrypt_internal(u8 val, u8 key, bool opcode) { unsigned type = 0; unsigned swap = 0; @@ -372,18 +387,16 @@ u8 decrypt(u8 val, u8 key, bool opcode) } -u8 mc8123_decrypt(offs_t addr, u8 val, u8 const *key, bool opcode) +u8 mc8123_device::decrypt(offs_t addr, u8 val, bool opcode) { // pick the translation table from bits fd57 of the address offs_t const tbl_num = bitswap<12>(addr,15,14,13,12,11,10,8,6,4,2,1,0); - return decrypt(val, key[tbl_num | (opcode ? 0x0000 : 0x1000)], opcode); + return decrypt_internal(val, m_key[tbl_num | (opcode ? 0x0000 : 0x1000)], opcode); } -} // anonymous namespace - -void mc8123_decode(u8 *rom, u8 *opcodes, u8 const *key, unsigned length) +void mc8123_device::decode(u8 *rom, u8 *opcodes, unsigned length) { for (unsigned i = 0; i < length; i++) { @@ -391,9 +404,9 @@ void mc8123_decode(u8 *rom, u8 *opcodes, u8 const *key, unsigned length) u8 const src = rom[i]; // decode the opcodes - opcodes[i] = mc8123_decrypt(adr, src, key, true); + opcodes[i] = decrypt(adr, src, true); // decode the data - rom[i] = mc8123_decrypt(adr, src, key, false); + rom[i] = decrypt(adr, src, false); } } diff --git a/src/mame/machine/mc8123.h b/src/mame/machine/mc8123.h index b8b5c26ef32..0003e824a9b 100644 --- a/src/mame/machine/mc8123.h +++ b/src/mame/machine/mc8123.h @@ -6,7 +6,38 @@ ***************************************************************************/ -// this function assumes a fixed portion of ROM at 0000-7FFF, and -// an arbitrary amount of banks at 8000-BFFF. +#pragma once -void mc8123_decode(u8 *rom, u8 *opcodes, u8 const *key, unsigned length); +#ifndef MAME_MACHINE_MC8123 +#define MAME_MACHINE_MC8123 1 + +#include "cpu/z80/z80.h" + +class mc8123_device : public z80_device +{ +public: + // construction/destruction + mc8123_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + // this function assumes a fixed portion of ROM at 0000-7FFF, and + // an arbitrary amount of banks at 8000-BFFF. + void decode(u8 *rom, u8 *opcodes, unsigned length); + +private: + static u8 decrypt_type0(u8 val, u8 param, unsigned swap); + static u8 decrypt_type1a(u8 val, u8 param, unsigned swap); + static u8 decrypt_type1b(u8 val, u8 param, unsigned swap); + static u8 decrypt_type2a(u8 val, u8 param, unsigned swap); + static u8 decrypt_type2b(u8 val, u8 param, unsigned swap); + static u8 decrypt_type3a(u8 val, u8 param, unsigned swap); + static u8 decrypt_type3b(u8 val, u8 param, unsigned swap); + static u8 decrypt_internal(u8 val, u8 key, bool opcode); + + u8 decrypt(offs_t addr, u8 val, bool opcode); + + required_region_ptr m_key; +}; + +extern const device_type MC8123; + +#endif