diff options
| author | 2025-08-26 18:46:11 +0200 | |
|---|---|---|
| committer | 2025-08-26 18:46:11 +0200 | |
| commit | 09416454ac9b2daa28eb03e5c8f556988c704a3a (patch) | |
| tree | d5cea8040aab27f58a9a49eef2ef230b67d4d113 | |
| parent | 443099f3c4a6f621d1568dacdfd27bd3d67c1bd2 (diff) | |
New systems marked not working
------------------------------
Bare Knuckle III (Conny bootleg of Mega Drive version) [Hammy, little0]
Contra (Conny bootleg of Mega Drive version) [Hammy, little0]
Gunstar Heroes / Snake Rattle n' Roll / Joe & Mac (Conny bootleg of Mega Drive versions) [Hammy, little0]
Side Pocket (Conny bootleg of Mega Drive version) [Hammy, little0]
Ultraman Club - Lucky Numbers [Hammy]
Systems promoted to working
---------------------------
Bio-Hazard Battle (scrambled bootleg of Mega Drive version) [Hammy, little0, IQ_132]
- nmk/quizpani.cpp: identified coinage-related DIPs for quizpanir [Hammy]
| -rw-r--r-- | src/mame/mame.lst | 8 | ||||
| -rw-r--r-- | src/mame/nmk/quizpani.cpp | 49 | ||||
| -rw-r--r-- | src/mame/sega/megadriv_acbl.cpp | 125 | ||||
| -rw-r--r-- | src/mame/skeleton/banpresto_bpsc68000.cpp | 223 |
4 files changed, 378 insertions, 27 deletions
diff --git a/src/mame/mame.lst b/src/mame/mame.lst index 4f760634979..1b946fa5403 100644 --- a/src/mame/mame.lst +++ b/src/mame/mame.lst @@ -40425,16 +40425,20 @@ wmegam2 xeye @source:sega/megadriv_acbl.cpp +3in1mbc aladmdb barekch barek2ch barek2mb barek3mb barek3mba +barek3mbc biohzdmb bk3ssrmb +contrambc jparkmb mk3mdb +sidepmbc sonic2mb sonic3mb srmdb @@ -43136,6 +43140,10 @@ attache816 @source:skeleton/ax20.cpp ax20 +@source:seibu/banpresto_bpsc68000.cpp +lnumbers + + @source:skeleton/banpresto_tomy_h8s.cpp cmcwa cscaoysd diff --git a/src/mame/nmk/quizpani.cpp b/src/mame/nmk/quizpani.cpp index 77de1ebf709..a32aa0eebbc 100644 --- a/src/mame/nmk/quizpani.cpp +++ b/src/mame/nmk/quizpani.cpp @@ -379,27 +379,32 @@ static INPUT_PORTS_START( quizpanir ) PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Flip_Screen ) ) // ok PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0002, DEF_STR( On ) ) - PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) - PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) - PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) - PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x001e, 0x001e, DEF_STR( Coin_A ) ) + PORT_DIPSETTING( 0x000e, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x000c, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x000a, DEF_STR( 1C_3C ) ) + PORT_DIPSETTING( 0x0008, DEF_STR( 1C_4C ) ) + PORT_DIPSETTING( 0x0006, DEF_STR( 1C_5C ) ) + PORT_DIPSETTING( 0x0004, DEF_STR( 1C_6C ) ) + PORT_DIPSETTING( 0x0002, DEF_STR( 1C_7C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( 1C_8C ) ) + PORT_DIPSETTING( 0x0012, DEF_STR( 1C_10C ) ) + PORT_DIPSETTING( 0x0010, "1 Coin/11 Credits" ) + PORT_DIPSETTING( 0x001e, DEF_STR( 1C_20C ) ) + PORT_DIPSETTING( 0x001c, "1 Coin/22 Credits" ) + PORT_DIPSETTING( 0x001a, "1 Coin/30 Credits" ) + PORT_DIPSETTING( 0x0018, "1 Coin/33 Credits" ) + PORT_DIPSETTING( 0x0016, "1 Coin/40 Credits" ) + PORT_DIPSETTING( 0x0014, "1 Coin/44 Credits" ) + PORT_DIPNAME( 0x00e0, 0x00e0, DEF_STR( Coin_B ) ) + PORT_DIPSETTING( 0x0020, DEF_STR( 5C_1C ) ) + PORT_DIPSETTING( 0x0040, DEF_STR( 4C_1C ) ) + PORT_DIPSETTING( 0x0060, DEF_STR( 3C_1C ) ) + PORT_DIPSETTING( 0x0080, DEF_STR( 2C_1C ) ) + PORT_DIPSETTING( 0x00c0, DEF_STR( 1C_1C ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( 2C_3C ) ) + PORT_DIPSETTING( 0x00e0, DEF_STR( 1C_2C ) ) + PORT_DIPSETTING( 0x00a0, DEF_STR( 1C_3C ) ) INPUT_PORTS_END @@ -491,4 +496,4 @@ ROM_END GAME( 1993, quizpani, 0, quizpani, quizpani, quizpani_state, empty_init, ROT0, "NMK", "Quiz Panicuru Fantasy", MACHINE_SUPPORTS_SAVE ) -GAME( 1994, quizpanir, 0, quizpani, quizpanir, quizpani_state, empty_init, ROT0, "NMK", "Medal Quiz Panicuru Roulette", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) +GAME( 1994, quizpanir, quizpani, quizpani, quizpanir, quizpani_state, empty_init, ROT0, "NMK", "Medal Quiz Panicuru Roulette", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE ) diff --git a/src/mame/sega/megadriv_acbl.cpp b/src/mame/sega/megadriv_acbl.cpp index 704399390b4..bae33ccc93b 100644 --- a/src/mame/sega/megadriv_acbl.cpp +++ b/src/mame/sega/megadriv_acbl.cpp @@ -182,6 +182,9 @@ public: void init_barek3() ATTR_COLD; void init_barek3a() ATTR_COLD; void init_biohzdmb() ATTR_COLD; + template <uint32_t Prot_addr> void init_conny_bit6() ATTR_COLD; + template <uint32_t Prot_addr> void init_conny_bit7() ATTR_COLD; + void init_contrambc() ATTR_COLD; void init_sonic2mb() ATTR_COLD; void init_twinktmb() ATTR_COLD; @@ -1089,6 +1092,46 @@ INPUT_PORTS_START( bk3ssrmb ) PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DSWC:8") INPUT_PORTS_END +INPUT_PORTS_START( biohzdmb ) + PORT_INCLUDE( md_common ) + + PORT_START("COINS") + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_COIN2 ) + + // only three of the four banks of 8 switches are populated + PORT_START("DSWA") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "DSWA:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "DSWA:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "DSWA:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSWA:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSWA:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSWA:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSWA:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DSWA:8") + + PORT_START("DSWB") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "DSWB:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "DSWB:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "DSWB:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSWB:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSWB:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSWB:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSWB:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DSWB:8") + + PORT_START("DSWC") + PORT_DIPUNKNOWN_DIPLOC(0x01, 0x01, "DSWC:1") + PORT_DIPUNKNOWN_DIPLOC(0x02, 0x02, "DSWC:2") + PORT_DIPUNKNOWN_DIPLOC(0x04, 0x04, "DSWC:3") + PORT_DIPUNKNOWN_DIPLOC(0x08, 0x08, "DSWC:4") + PORT_DIPUNKNOWN_DIPLOC(0x10, 0x10, "DSWC:5") + PORT_DIPUNKNOWN_DIPLOC(0x20, 0x20, "DSWC:6") + PORT_DIPUNKNOWN_DIPLOC(0x40, 0x40, "DSWC:7") + PORT_DIPUNKNOWN_DIPLOC(0x80, 0x80, "DSWC:8") +INPUT_PORTS_END + + /************************************* * * Machine Configuration @@ -1388,6 +1431,34 @@ void md_boot_state::init_biohzdmb() init_megadrij(); m_maincpu->space(AS_PROGRAM).install_read_handler(0x770070, 0x770075, read16sm_delegate(*this, FUNC(md_boot_state::dsw_r))); + m_maincpu->space(AS_PROGRAM).install_read_port(0x770078, 0x770079, "COINS"); +} + +template <uint32_t Prot_addr> +void md_boot_state::init_conny_bit6() +{ + init_megadrij(); + + // these games check that bit 6 is set, each game at a different address. Protection? + m_maincpu->space(AS_PROGRAM).install_read_handler(Prot_addr, Prot_addr + 1, read16smo_delegate(*this, NAME([] () { return 0x40; }))); +} + +// TODO: unify with above once the GAME macro is substituted with something that supports templated inits with 2 or more parameters +template <uint32_t Prot_addr> +void md_boot_state::init_conny_bit7() +{ + init_megadrij(); + + // these games check that bit 7 is set, each game at a different address. Protection? + m_maincpu->space(AS_PROGRAM).install_read_handler(Prot_addr, Prot_addr + 1, read16smo_delegate(*this, NAME([] () { return 0x80; }))); +} + +void md_boot_state::init_contrambc() +{ + init_conny_bit7<0x860000>(); + + // HACK: gross. The game dislikes megadriv_68k_check_z80_bus(), always expecting bit 8 to be 0. Hacked to boot for now. + m_maincpu->space(AS_PROGRAM).install_read_handler(0xa11100, 0xa11101, read16s_delegate(*this, NAME([this] (uint16_t data, uint16_t mem_mask) { return megadriv_68k_check_z80_bus(data, mem_mask) & 0xfeff; }))); } /************************************* @@ -1568,6 +1639,40 @@ ROM_START( biohzdmb ) ROM_LOAD16_BYTE( "u15", 0x000000, 0x080000, CRC(41a8eae8) SHA1(a9db565f4ca4d71c81fbb44fd429221951887bab) ) ROM_END +ROM_START( sidepmbc ) + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "rom1.bin", 0x000000, 0x080000, CRC(dcf02dc9) SHA1(310832183aa4fcafd434d15ee80cfb07e38fa1d2) ) + ROM_LOAD16_BYTE( "rom2.bin", 0x000001, 0x080000, CRC(b0b14bf5) SHA1(92a4f4346381ac21a0a31822df7e339d6f3207f8) ) +ROM_END + +ROM_START( contrambc ) + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "rom.m3", 0x000000, 0x080000, CRC(990f824d) SHA1(95f769a9f9263479ca74fdaee12a3eae16cae432) ) + ROM_LOAD16_BYTE( "rom.m6", 0x000001, 0x080000, CRC(ab83e795) SHA1(cd2da23ffd5e0ca954bcdfd2a9f48e16cdd587a0) ) + ROM_LOAD16_BYTE( "rom.m2", 0x100000, 0x080000, CRC(28b9d1a9) SHA1(0a7536088e61239c5c777847e57b282289b006f2) ) + ROM_LOAD16_BYTE( "rom.m5", 0x100001, 0x080000, CRC(1c92ebf1) SHA1(33e7aff01fa9db7900a4e1a834772e128c06b148) ) +ROM_END + +ROM_START( 3in1mbc ) + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "rom6.bin", 0x000000, 0x080000, CRC(7e333c36) SHA1(db2dc129d96a31bc1021cc7ce9538f3b2a9306bb) ) + ROM_LOAD16_BYTE( "rom3.bin", 0x000001, 0x080000, CRC(7e3bded6) SHA1(1073c73535e89211b3d329f1119cc95a9d522686) ) + ROM_LOAD16_BYTE( "rom5.bin", 0x100000, 0x080000, CRC(f869f746) SHA1(0a7ac33fd844732a5384f173f422213134211d75) ) + ROM_LOAD16_BYTE( "rom2.bin", 0x100001, 0x080000, CRC(de60da62) SHA1(62d811dda61390e8d89b52c4a77d94f209cfcc72) ) + ROM_LOAD16_BYTE( "rom4.bin", 0x200000, 0x080000, CRC(6faf99cd) SHA1(fa8960afd5200c230cdc19801114169fbb87cdea) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 + ROM_LOAD16_BYTE( "rom1.bin", 0x200001, 0x080000, CRC(a7d2adb9) SHA1(3b6a1c6fb26303594da166f3d5b8542da1e949cb) ) // 1xxxxxxxxxxxxxxxxxx = 0x00 +ROM_END + +ROM_START( barek3mbc ) + ROM_REGION( 0x400000, "maincpu", 0 ) + ROM_LOAD16_BYTE( "rom6.bin", 0x000000, 0x080000, CRC(a0f9cf5d) SHA1(94042fa0c49380dc5387fd6a24cfc4cbc13ff726) ) + ROM_LOAD16_BYTE( "rom3.bin", 0x000001, 0x080000, CRC(b6becf5f) SHA1(dd9e1ba398dc37c76d4a240904360d9342a10738) ) + ROM_LOAD16_BYTE( "rom5.bin", 0x100000, 0x080000, CRC(d4f52553) SHA1(3f6554cafef79c15362840e06269d3584f738426) ) + ROM_LOAD16_BYTE( "rom2.bin", 0x100001, 0x080000, CRC(0c6daeae) SHA1(7479be3e1ecaa4cf0ecf55b118a5f44f9159b8a9) ) + ROM_LOAD16_BYTE( "rom4.bin", 0x200000, 0x080000, CRC(4e91f0df) SHA1(119694402da11c882013d6ecd9c542eb1d1ec8ad) ) + ROM_LOAD16_BYTE( "rom1.bin", 0x200001, 0x080000, CRC(ade4166b) SHA1(c0c6603fea1c09af597084bcf61035339cd6a012) ) +ROM_END + } // anonymous namespace /************************************* @@ -1585,13 +1690,23 @@ GAME( 1994, barek3mba, barek3mb, megadrvb, barek3a, md_boot_state, init_ GAME( 1993, twinktmb, 0, md_bootleg, twinktmb, md_boot_state, init_twinktmb, ROT0, "bootleg / Sega", "Twinkle Tale (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC decap or simulation GAME( 1993, jparkmb, 0, md_boot_mcu, jparkmb, md_boot_mcu_state, init_megadrij, ROT0, "bootleg / Sega", "Jurassic Park (bootleg of Mega Drive version)", 0 ) // PCB labeled "JPA-028" -// Scrambled bootlegs with Actel for scrambling and Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. +// Scrambled bootlegs with Actel or Lattice for scrambling and Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. 3 DIP switch banks. GAME( 1994, barekch, 0, megadrvb_6b, barekch, md_boot_6button_state, init_barekch, ROT0, "bootleg", "Bare Knuckle (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, barek2ch, 0, md_bootleg, barek2ch, md_boot_state, init_barek2ch, ROT0, "bootleg", "Bare Knuckle II (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, barek3mb, 0, megadrvb, barek3, md_boot_state, init_barek3, ROT0, "bootleg / Sega", "Bare Knuckle III (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1994, bk3ssrmb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_bk3ssrmb, ROT0, "bootleg / Sega", "Bare Knuckle III / Sunset Riders (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) // Currently boots as Bare Knuckle III, mechanism to switch game not emulated yet +GAME( 1994, bk3ssrmb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_bk3ssrmb, ROT0, "bootleg / Sega", "Bare Knuckle III / Sunset Riders (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) // Currently boots as Bare Knuckle III, mechanism to switch game not emulated yet, a single game version of Bare Knuckle III on this board exists, but it's not dumped. GAME( 1994, srssf2mb, 0, megadrvb_6b, bk3ssrmb, md_boot_6button_state, init_srssf2mb, ROT0, "bootleg / Sega", "Sunset Riders / Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_6button_state, init_mk3mdb, ROT0, "bootleg / Midway", "Mortal Kombat 3 (scrambled bootleg of Mega Drive version)", 0 ) GAME( 1994, ssf2mdb, 0, ssf2mdb, ssf2mdb, md_boot_6button_state, init_megadrij, ROT0, "bootleg / Capcom", "Super Street Fighter II - The New Challengers (scrambled bootleg of Mega Drive version)", 0 ) GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (scrambled bootleg of Mega Drive version)", 0 ) -GAME( 1993, biohzdmb, 0, megadrvb, srmdb, md_boot_state, init_biohzdmb, ROT0, "bootleg / Sega", "Bio-Hazard Battle (scrambled bootleg of Mega Drive version)", MACHINE_NOT_WORKING ) // inputs + +// Scrambled bootlegs with 8 line connector, smaller Lattice for scrambling and Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. 4 DIP Switch banks. +// There should be 8 line games on this hardware too, but none have been spotted. +GAME( 1994, barek3mb, 0, megadrvb, barek3, md_boot_state, init_barek3, ROT0, "bootleg / Sega", "Bare Knuckle III (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1994, barek2ch, 0, md_bootleg, barek2ch, md_boot_state, init_barek2ch, ROT0, "bootleg", "Bare Knuckle II (scrambled bootleg of Mega Drive version)", 0 ) +GAME( 1995, biohzdmb, 0, megadrvb, biohzdmb, md_boot_state, init_biohzdmb, ROT0, "bootleg / Sega", "Bio-Hazard Battle (scrambled bootleg of Mega Drive version)", 0 ) + +// Conny bootlegs with Mega Drive bootleg chipset marked TA-04, TA-05 and TA-06. 1 DIP switch bank. +GAME( 1995, contrambc, 0, megadrvb, biohzdmb, md_boot_state, init_contrambc, ROT0, "bootleg / Konami", "Contra (Conny bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // doesn't seem to like megadriv_68k_check_z80_bus(), no coins +GAME( 1995, sidepmbc, 0, megadrvb, biohzdmb, md_boot_state, init_conny_bit7<0x8a0000>, ROT0, "bootleg / Data East", "Side Pocket (Conny bootleg of Mega Drive version)", MACHINE_NOT_WORKING ) // no coins +GAME( 1995, 3in1mbc, 0, megadrvb, biohzdmb, md_boot_state, init_conny_bit7<0x880000>, ROT0, "bootleg", "Gunstar Heroes / Snake Rattle n' Roll / Joe & Mac (Conny bootleg of Mega Drive versions)", MACHINE_NOT_WORKING ) // no coins, no game switching +GAME( 1995, barek3mbc, 0, megadrvb, biohzdmb, md_boot_state, init_conny_bit6<0x820000>, ROT0, "bootleg (Sega)", "Bare Knuckle III (Conny bootleg of Mega Drive version)", MACHINE_NOT_WORKING ) // no coins +// Samurai Spirits and Kuhga PCBs have also been seen diff --git a/src/mame/skeleton/banpresto_bpsc68000.cpp b/src/mame/skeleton/banpresto_bpsc68000.cpp new file mode 100644 index 00000000000..5a3196ed978 --- /dev/null +++ b/src/mame/skeleton/banpresto_bpsc68000.cpp @@ -0,0 +1,223 @@ +// license:BSD-3-Clause +// copyright-holders: + +/* +Banpresto M68K-based medal games with Banpresto customs + +BPSC68000 PCB (rev B) + +Main components: +- MC68EC000FN12 main CPU +- 2x LH52258AD-25 SRAM +- 24.000 MHz XTAL +- BPSPC 87F 9529 HAD3 Banpresto custom chip (208-pin, has the Banpresto logo) +- MFC68K 88F 9443 ABF3 Banpresto custom chip (100-pin, no Banpresto logo) +- SPMUX 89F 9531 ADG3 Banpresto custom chip (128-pin, no Banpresto logo) +- 2x HM514270CJ7 DRAM (between BPSPC and SPMUX customs) +- Sanyo LC89080Q high-speed current-output D/A converter +- 2x banks of 8 switches +- 2x LH528256D-70LL SRAM (near YMZ280 space) +- OKI M6295 +- 1066J resonator (near M6295) +- M 535 1026B 8-pin chip (probably an EEPROM like Microchip 24LC1026 or similar) + +The video section has an unpopulated space marked BPBG for a 160-pin (probably) custom chip. +The audio section also has unpopulated space marked for a YMZ280. + + +TODO: +- everything +*/ + +#include "emu.h" + +#include "cpu/m68000/m68000.h" +#include "machine/eepromser.h" +#include "machine/nvram.h" +#include "sound/okim6295.h" + +#include "emupal.h" +#include "screen.h" +#include "speaker.h" + + +namespace { + +class bpsc68000_state : public driver_device +{ +public: + bpsc68000_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_gfxdecode(*this, "gfxdecode") + { } + + void bpsc68000(machine_config &config) ATTR_COLD; + +protected: + virtual void video_start() override ATTR_COLD; + +private: + required_device<cpu_device> m_maincpu; + required_device<gfxdecode_device> m_gfxdecode; + + uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + + void prg_map(address_map &map) ATTR_COLD; +}; + + +void bpsc68000_state::video_start() +{ +} + +uint32_t bpsc68000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + return 0; +} + + +void bpsc68000_state::prg_map(address_map &map) +{ + map.unmap_value_high(); // TODO: remove once more about the hw is figured out + + map(0x000000, 0x01ffff).rom(); + map(0x200000, 0x20ffff).ram(); + // map(0xa00000, 0xa00001).r() // inputs? + // map(0xa00002, 0xa00003).r() // inputs?? + // map(0xc00000, 0xc0002b).rw(); // video regs? + map(0x800001, 0x800001).w("oki", FUNC(okim6295_device::write)); + map(0xe00000, 0xe07fff).ram(); +} + + +static INPUT_PORTS_START( lnumbers ) + PORT_START("IN0") + PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(3) + PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(3) + PORT_BIT( 0x0004, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(3) + PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(3) + PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(3) + PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(3) + PORT_BIT( 0x0040, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(3) + PORT_BIT( 0x0080, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(3) + PORT_BIT( 0x0100, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(4) + PORT_BIT( 0x0200, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(4) + PORT_BIT( 0x0400, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_PLAYER(4) + PORT_BIT( 0x0800, IP_ACTIVE_LOW, IPT_BUTTON4 ) PORT_PLAYER(4) + PORT_BIT( 0x1000, IP_ACTIVE_LOW, IPT_BUTTON5 ) PORT_PLAYER(4) + PORT_BIT( 0x2000, IP_ACTIVE_LOW, IPT_BUTTON6 ) PORT_PLAYER(4) + PORT_BIT( 0x4000, IP_ACTIVE_LOW, IPT_BUTTON7 ) PORT_PLAYER(4) + PORT_BIT( 0x8000, IP_ACTIVE_LOW, IPT_BUTTON8 ) PORT_PLAYER(4) + + PORT_START("DSW1") + PORT_DIPNAME( 0x0001, 0x0001, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:1") + PORT_DIPSETTING( 0x0001, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0002, 0x0002, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:2") + PORT_DIPSETTING( 0x0002, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0004, 0x0004, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:3") + PORT_DIPSETTING( 0x0004, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0008, 0x0008, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:4") + PORT_DIPSETTING( 0x0008, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0010, 0x0010, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:5") + PORT_DIPSETTING( 0x0010, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0020, 0x0020, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:6") + PORT_DIPSETTING( 0x0020, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0040, 0x0040, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:7") + PORT_DIPSETTING( 0x0040, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0080, 0x0080, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW1:8") + PORT_DIPSETTING( 0x0080, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0100, 0x0100, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:1") + PORT_DIPSETTING( 0x0100, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0200, 0x0200, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:2") + PORT_DIPSETTING( 0x0200, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0400, 0x0400, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:3") + PORT_DIPSETTING( 0x0400, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x0800, 0x0800, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:4") + PORT_DIPSETTING( 0x0800, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x1000, 0x1000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:5") + PORT_DIPSETTING( 0x1000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x2000, 0x2000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:6") + PORT_DIPSETTING( 0x2000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x4000, 0x4000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:7") + PORT_DIPSETTING( 0x4000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) + PORT_DIPNAME( 0x8000, 0x8000, DEF_STR( Unknown ) ) PORT_DIPLOCATION("DSW2:8") + PORT_DIPSETTING( 0x8000, DEF_STR( Off ) ) + PORT_DIPSETTING( 0x0000, DEF_STR( On ) ) +INPUT_PORTS_END + + +static GFXDECODE_START( gfx ) + GFXDECODE_ENTRY( "sprites", 0, gfx_16x16x4_packed_lsb, 0, 16 ) +GFXDECODE_END + + +void bpsc68000_state::bpsc68000(machine_config &config) +{ + // basic machine hardware + M68000(config, m_maincpu, 24_MHz_XTAL / 2); + m_maincpu->set_addrmap(AS_PROGRAM, &bpsc68000_state::prg_map); + m_maincpu->set_vblank_int("screen", FUNC(bpsc68000_state::irq4_line_hold)); + + // NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); + + // video hardware + screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER)); // TODO + screen.set_refresh_hz(60); + screen.set_vblank_time(ATTOSECONDS_IN_USEC(0)); + screen.set_size(64*8, 32*8); + screen.set_visarea(0, 320-1, 16, 240-1); + screen.set_screen_update(FUNC(bpsc68000_state::screen_update)); + screen.set_palette("palette"); + + GFXDECODE(config, m_gfxdecode, "palette", gfx); + + PALETTE(config, "palette").set_format(palette_device::xBGR_555, 0x400); + + // sound hardware + SPEAKER(config, "mono").front_center(); + + OKIM6295(config, "oki", 1'066'000, okim6295_device::PIN7_HIGH).add_route(ALL_OUTPUTS, "mono", 0.40); // TODO: check pin 7. +} + + +// ウルトラマン倶楽部 ラッキーナンバーズ +ROM_START( lnumbers ) + ROM_REGION( 0x20000, "maincpu", 0 ) + ROM_LOAD16_WORD_SWAP( "s197_a01.prog16b.u15", 0x00000, 0x20000, CRC(b824a0ed) SHA1(ea8ef81d17896205f89d330066a23c459ab5e668) ) + + ROM_REGION( 0x100000, "sprites", 0 ) + ROM_LOAD( "s197_a04.obj1.u24", 0x00000, 0x80000, CRC(e70f4f14) SHA1(030bbbe2da07a9b8c3a8c7055799e89113bad16b) ) + ROM_LOAD( "s197_a03_obj2.u25", 0x80000, 0x80000, CRC(5d5955e8) SHA1(aea84b08ed639b2bacada1c4ade9760b2599cfc7) ) + // unpopulated OBJ3 / OBJ4 space at u26 / u27 + + // unpopulated BG1 space at u31 + + ROM_REGION( 0x40000, "oki", 0 ) + ROM_LOAD( "s197_a02.sound2.u41", 0x00000, 0x40000, CRC(a1a67ead) SHA1(d4f0979c534a6d131025da474944e0d32f583693) ) + // PCB can accommodate bigger ROMs, too + + ROM_REGION( 0x200, "plds", ROMREGION_ERASE00 ) + ROM_LOAD( "peel18cv8p-10_u2.u2", 0x000, 0x155, NO_DUMP ) + // unpopulated spaces at u28 and u44 marked 18CV8 +ROM_END + +} // anonymous namespace + + +GAME( 1995, lnumbers, 0, bpsc68000, lnumbers, bpsc68000_state, empty_init, ROT0, "Banpresto", "Ultraman Club - Lucky Numbers", MACHINE_NOT_WORKING | MACHINE_NO_SOUND ) |
