mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
Untangled Mega Drive bootlegs a little.
sega/puckpkmn.cpp: Eliminated dependency on other Mega Drive arcade bootlegs. sega/megadriv_acbl.cpp: Use more derived memory maps, and fewer driver init functions.
This commit is contained in:
parent
98e4d427ac
commit
019d763cf1
@ -64,7 +64,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
static INPUT_PORTS_START( hshavoc )
|
INPUT_PORTS_START( hshavoc )
|
||||||
PORT_START("IN0") // 16 bit
|
PORT_START("IN0") // 16 bit
|
||||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) )
|
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) )
|
||||||
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
PORT_DIPSETTING( 0x0001, DEF_STR( Off ) )
|
||||||
|
@ -274,13 +274,69 @@ void md_boot_state::md_bootleg_map(address_map &map)
|
|||||||
map(0x200000, 0x2023ff).ram(); // Tested
|
map(0x200000, 0x2023ff).ram(); // Tested
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::md_bootleg(machine_config &config)
|
void md_boot_state::topshoot_68k_map(address_map &map)
|
||||||
|
{
|
||||||
|
md_bootleg_map(map);
|
||||||
|
|
||||||
|
// these are shared RAM, MCU puts the inputs here
|
||||||
|
map(0x200042, 0x200043).portr("IN0");
|
||||||
|
map(0x200044, 0x200045).portr("IN1");
|
||||||
|
map(0x200046, 0x200047).portr("IN2");
|
||||||
|
map(0x200048, 0x200049).portr("IN3");
|
||||||
|
map(0x200050, 0x200051).r(FUNC(md_boot_state::topshoot_200051_r));
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_boot_state::sbubsm_68k_map(address_map &map)
|
||||||
|
{
|
||||||
|
topshoot_68k_map(map);
|
||||||
|
|
||||||
|
// these are shared RAM, MCU puts the inputs here
|
||||||
|
map(0x20007e, 0x20007f).portr("IN4");
|
||||||
|
|
||||||
|
// needed to boot, somme kind of hardware ident?
|
||||||
|
map(0x400000, 0x400001).r(FUNC(md_boot_state::sbubsm_400000_r));
|
||||||
|
map(0x400002, 0x400003).r(FUNC(md_boot_state::sbubsm_400002_r));
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_boot_6button_state::ssf2mdb_68k_map(address_map &map)
|
||||||
|
{
|
||||||
|
megadriv_68k_map(map);
|
||||||
|
|
||||||
|
map(0x400000, 0x5fffff).rom().region("maincpu", 0x400000).unmapw();
|
||||||
|
map(0x770070, 0x770075).r(FUNC(md_boot_6button_state::dsw_r));
|
||||||
|
map(0xa130f0, 0xa130ff).nopw(); // custom banking is disabled (!)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void md_boot_state::megadrvb(machine_config &config)
|
||||||
{
|
{
|
||||||
md_ntsc(config);
|
md_ntsc(config);
|
||||||
|
|
||||||
|
m_ioports[2]->set_in_handler(NAME([this] () { return m_io_exp.read_safe(0x3f); }));
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_boot_state::md_bootleg(machine_config &config)
|
||||||
|
{
|
||||||
|
megadrvb(config);
|
||||||
|
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::md_bootleg_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::md_bootleg_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void md_boot_state::topshoot(machine_config &config)
|
||||||
|
{
|
||||||
|
megadrvb(config);
|
||||||
|
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::topshoot_68k_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
void md_boot_state::sbubsm(machine_config &config)
|
||||||
|
{
|
||||||
|
megadrvb(config);
|
||||||
|
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::sbubsm_68k_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
* Games memory handlers
|
* Games memory handlers
|
||||||
@ -411,77 +467,6 @@ uint16_t md_boot_state::sbubsm_400002_r()
|
|||||||
return 0x0f00;
|
return 0x0f00;
|
||||||
}
|
}
|
||||||
|
|
||||||
// jzth protection
|
|
||||||
void md_boot_state::bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
|
||||||
{
|
|
||||||
int pc = m_maincpu->pc();
|
|
||||||
|
|
||||||
logerror("%06x writing to bl_710000_w %04x %04x\n", pc, data, mem_mask);
|
|
||||||
|
|
||||||
// protection value is read from 0x710000 after a series of writes.. and stored at ff0007
|
|
||||||
// startup
|
|
||||||
/*
|
|
||||||
059ce0 writing to bl_710000_w ff08 ffff
|
|
||||||
059d04 writing to bl_710000_w 000a ffff
|
|
||||||
059d04 writing to bl_710000_w 000b ffff
|
|
||||||
059d04 writing to bl_710000_w 000c ffff
|
|
||||||
059d04 writing to bl_710000_w 000f ffff
|
|
||||||
059d1c writing to bl_710000_w ff09 ffff
|
|
||||||
059d2a reading from bl_710000_r (wants 0xe)
|
|
||||||
059ce0 writing to bl_710000_w ff08 ffff
|
|
||||||
059d04 writing to bl_710000_w 000a ffff
|
|
||||||
059d04 writing to bl_710000_w 000b ffff
|
|
||||||
059d04 writing to bl_710000_w 000c ffff
|
|
||||||
059d04 writing to bl_710000_w 000f ffff
|
|
||||||
059d1c writing to bl_710000_w ff09 ffff
|
|
||||||
059d2a reading from bl_710000_r (wants 0xe)
|
|
||||||
*/
|
|
||||||
// before lv stage 3
|
|
||||||
/*
|
|
||||||
059ce0 writing to bl_710000_w 0008 ffff
|
|
||||||
059d04 writing to bl_710000_w 000b ffff
|
|
||||||
059d04 writing to bl_710000_w 000f ffff
|
|
||||||
059d1c writing to bl_710000_w ff09 ffff
|
|
||||||
059d2a reading from bl_710000_r (wants 0x4)
|
|
||||||
*/
|
|
||||||
// start level 3
|
|
||||||
/*
|
|
||||||
059ce0 writing to bl_710000_w ff08 ffff
|
|
||||||
059d04 writing to bl_710000_w 000b ffff
|
|
||||||
059d04 writing to bl_710000_w 000c ffff
|
|
||||||
059d04 writing to bl_710000_w 000e ffff
|
|
||||||
059d1c writing to bl_710000_w ff09 ffff
|
|
||||||
059d2a reading from bl_710000_r (wants 0x5)
|
|
||||||
|
|
||||||
// after end sequence
|
|
||||||
059ce0 writing to bl_710000_w 0008 ffff
|
|
||||||
059d04 writing to bl_710000_w 000a ffff
|
|
||||||
059d04 writing to bl_710000_w 000b ffff
|
|
||||||
059d04 writing to bl_710000_w 000c ffff
|
|
||||||
059d04 writing to bl_710000_w 000f ffff
|
|
||||||
059d1c writing to bl_710000_w ff09 ffff
|
|
||||||
059d2a reading from bl_710000_r (wants 0xe)
|
|
||||||
|
|
||||||
*/
|
|
||||||
m_protcount++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
uint16_t md_boot_state::bl_710000_r()
|
|
||||||
{
|
|
||||||
uint16_t ret;
|
|
||||||
int pc = m_maincpu->pc();
|
|
||||||
logerror("%06x reading from bl_710000_r\n", pc);
|
|
||||||
|
|
||||||
if (m_protcount==6) { ret = 0xe; }
|
|
||||||
else if (m_protcount==5) { ret = 0x5; }
|
|
||||||
else if (m_protcount==4) { ret = 0x4; }
|
|
||||||
else ret = 0xf;
|
|
||||||
|
|
||||||
m_protcount = 0;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
*
|
*
|
||||||
@ -1115,14 +1100,6 @@ INPUT_PORTS_END
|
|||||||
*
|
*
|
||||||
*************************************/
|
*************************************/
|
||||||
|
|
||||||
void md_boot_state::megadrvb(machine_config &config)
|
|
||||||
{
|
|
||||||
md_ntsc(config);
|
|
||||||
|
|
||||||
m_ioports[2]->set_in_handler(NAME([this] () { return m_io_exp.read_safe(0x3f); }));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void md_boot_6button_state::machine_start()
|
void md_boot_6button_state::machine_start()
|
||||||
{
|
{
|
||||||
md_boot_state::machine_start();
|
md_boot_state::machine_start();
|
||||||
@ -1140,6 +1117,13 @@ void md_boot_6button_state::megadrvb_6b(machine_config &config)
|
|||||||
m_ioports[1]->set_out_handler(FUNC(md_boot_6button_state::ioport_out_6button<1>));
|
m_ioports[1]->set_out_handler(FUNC(md_boot_6button_state::ioport_out_6button<1>));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void md_boot_6button_state::ssf2mdb(machine_config &config)
|
||||||
|
{
|
||||||
|
megadrvb_6b(config);
|
||||||
|
|
||||||
|
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_6button_state::ssf2mdb_68k_map);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************************
|
/*************************************
|
||||||
@ -1153,10 +1137,10 @@ void md_boot_6button_state::megadrvb_6b(machine_config &config)
|
|||||||
void md_boot_state::init_aladmdb()
|
void md_boot_state::init_aladmdb()
|
||||||
{
|
{
|
||||||
// Game does a check @ 1afc00 with work RAM fff57c that makes it play like the original console version (i.e. 8 energy hits instead of 2)
|
// Game does a check @ 1afc00 with work RAM fff57c that makes it play like the original console version (i.e. 8 energy hits instead of 2)
|
||||||
#if ENERGY_CONSOLE_MODE
|
#if ENERGY_CONSOLE_MODE
|
||||||
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
|
uint16_t *rom = (uint16_t *)memregion("maincpu")->base();
|
||||||
rom[0x1afc08/2] = 0x6600;
|
rom[0x1afc08/2] = 0x6600;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// 220000 = writes to mcu? 330000 = reads?
|
// 220000 = writes to mcu? 330000 = reads?
|
||||||
m_maincpu->space(AS_PROGRAM).install_write_handler(0x220000, 0x220001, write16smo_delegate(*this, FUNC(md_boot_state::aladmdb_w)));
|
m_maincpu->space(AS_PROGRAM).install_write_handler(0x220000, 0x220001, write16smo_delegate(*this, FUNC(md_boot_state::aladmdb_w)));
|
||||||
@ -1213,16 +1197,6 @@ void md_boot_6button_state::init_mk3mdb()
|
|||||||
init_megadriv();
|
init_megadriv();
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_6button_state::init_ssf2mdb()
|
|
||||||
{
|
|
||||||
m_maincpu->space(AS_PROGRAM).nop_write(0xa130f0, 0xa130ff); // custom banking is disabled (!)
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_rom(0x400000, 0x5fffff, memregion( "maincpu" )->base() + 0x400000);
|
|
||||||
m_maincpu->space(AS_PROGRAM).unmap_write(0x400000, 0x5fffff);
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x770070, 0x770075, read16sm_delegate(*this, FUNC(md_boot_6button_state::dsw_r)));
|
|
||||||
|
|
||||||
init_megadrij();
|
|
||||||
}
|
|
||||||
|
|
||||||
void md_boot_state::init_srmdb()
|
void md_boot_state::init_srmdb()
|
||||||
{
|
{
|
||||||
uint8_t* rom = memregion("maincpu")->base();
|
uint8_t* rom = memregion("maincpu")->base();
|
||||||
@ -1251,37 +1225,6 @@ void md_boot_state::init_srmdb()
|
|||||||
init_megadriv();
|
init_megadriv();
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::init_topshoot()
|
|
||||||
{
|
|
||||||
|
|
||||||
// these are shared RAM, MCU puts the inputs here
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200050, 0x200051, read16smo_delegate(*this, FUNC(md_boot_state::topshoot_200051_r)));
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200042, 0x200043, "IN0");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200044, 0x200045, "IN1");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200046, 0x200047, "IN2");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200048, 0x200049, "IN3");
|
|
||||||
|
|
||||||
init_megadriv();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void md_boot_state::init_sbubsm()
|
|
||||||
{
|
|
||||||
// needed to boot, somme kind of hardware ident?
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x400000, 0x400001, read16smo_delegate(*this, FUNC(md_boot_state::sbubsm_400000_r)));
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x400002, 0x400003, read16smo_delegate(*this, FUNC(md_boot_state::sbubsm_400002_r)));
|
|
||||||
|
|
||||||
// these are shared RAM, MCU puts the inputs here
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_handler(0x200050, 0x200051, read16smo_delegate(*this, FUNC(md_boot_state::topshoot_200051_r))); // needed for coins to work
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200042, 0x200043, "IN0");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200044, 0x200045, "IN1");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200046, 0x200047, "IN2");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x200048, 0x200049, "IN3");
|
|
||||||
m_maincpu->space(AS_PROGRAM).install_read_port(0x20007e, 0x20007f, "IN4");
|
|
||||||
|
|
||||||
init_megadriv();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void md_boot_state::init_barek2()
|
void md_boot_state::init_barek2()
|
||||||
{
|
{
|
||||||
@ -1578,10 +1521,10 @@ ROM_END
|
|||||||
|
|
||||||
GAME( 1993, aladmdb, 0, megadrvb, aladmdb, md_boot_state, init_aladmdb, ROT0, "bootleg / Sega", "Aladdin (bootleg of Japanese Mega Drive version)", 0 )
|
GAME( 1993, aladmdb, 0, megadrvb, aladmdb, md_boot_state, init_aladmdb, ROT0, "bootleg / Sega", "Aladdin (bootleg of Japanese Mega Drive version)", 0 )
|
||||||
GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_6button_state, init_mk3mdb, ROT0, "bootleg / Midway", "Mortal Kombat 3 (bootleg of Mega Drive version)", 0 )
|
GAME( 1996, mk3mdb, 0, megadrvb_6b, mk3mdb, md_boot_6button_state, init_mk3mdb, ROT0, "bootleg / Midway", "Mortal Kombat 3 (bootleg of Mega Drive version)", 0 )
|
||||||
GAME( 1994, ssf2mdb, 0, megadrvb_6b, ssf2mdb, md_boot_6button_state, init_ssf2mdb, ROT0, "bootleg / Capcom", "Super Street Fighter II - The New Challengers (bootleg of Japanese 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 (bootleg of Japanese Mega Drive version)", 0 )
|
||||||
GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (bootleg of Mega Drive version)", 0 )
|
GAME( 1993, srmdb, 0, megadrvb, srmdb, md_boot_state, init_srmdb, ROT0, "bootleg / Konami", "Sunset Riders (bootleg of Mega Drive version)", 0 )
|
||||||
GAME( 1995, topshoot, 0, md_bootleg, topshoot, md_boot_state, init_topshoot, ROT0, "Sun Mixing", "Top Shooter", 0 )
|
GAME( 1995, topshoot, 0, topshoot, topshoot, md_boot_state, init_megadriv, ROT0, "Sun Mixing", "Top Shooter", 0 )
|
||||||
GAME( 1996, sbubsm, 0, md_bootleg, sbubsm, md_boot_state, init_sbubsm, ROT0, "Sun Mixing", "Super Bubble Bobble (Sun Mixing, Mega Drive clone hardware)", 0 )
|
GAME( 1996, sbubsm, 0, sbubsm, sbubsm, md_boot_state, init_megadriv, ROT0, "Sun Mixing", "Super Bubble Bobble (Sun Mixing, Mega Drive clone hardware)", 0 )
|
||||||
GAME( 1993, sonic2mb, 0, md_bootleg, sonic2mb, md_boot_state, init_sonic2mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Mega Drive version)", 0 ) // Flying wires going through the empty PIC space aren't completely understood
|
GAME( 1993, sonic2mb, 0, md_bootleg, sonic2mb, md_boot_state, init_sonic2mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 2 (bootleg of Mega Drive version)", 0 ) // Flying wires going through the empty PIC space aren't completely understood
|
||||||
GAME( 1993, sonic3mb, 0, md_bootleg, sonic3mb, md_sonic3bl_state, init_sonic3mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 3 (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC
|
GAME( 1993, sonic3mb, 0, md_bootleg, sonic3mb, md_sonic3bl_state, init_sonic3mb, ROT0, "bootleg / Sega", "Sonic The Hedgehog 3 (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // undumped PIC
|
||||||
GAME( 1994, barek2mb, 0, md_bootleg, barek2, md_boot_state, init_barek2, ROT0, "bootleg / Sega", "Bare Knuckle II (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC hook up
|
GAME( 1994, barek2mb, 0, md_bootleg, barek2, md_boot_state, init_barek2, ROT0, "bootleg / Sega", "Bare Knuckle II (bootleg of Mega Drive version)", MACHINE_UNEMULATED_PROTECTION | MACHINE_NOT_WORKING ) // Needs PIC hook up
|
||||||
|
@ -16,28 +16,24 @@ public:
|
|||||||
|
|
||||||
void megadrvb(machine_config &config);
|
void megadrvb(machine_config &config);
|
||||||
void md_bootleg(machine_config &config);
|
void md_bootleg(machine_config &config);
|
||||||
void puckpkmn(machine_config &config);
|
void topshoot(machine_config &config);
|
||||||
void jzth(machine_config &config);
|
void sbubsm(machine_config &config);
|
||||||
void puckpkmna(machine_config &config);
|
|
||||||
|
|
||||||
void init_aladmdb();
|
void init_aladmdb();
|
||||||
void init_srmdb();
|
void init_srmdb();
|
||||||
void init_topshoot();
|
|
||||||
void init_puckpkmn();
|
|
||||||
void init_barek2();
|
void init_barek2();
|
||||||
void init_barek2ch();
|
void init_barek2ch();
|
||||||
void init_barek3();
|
void init_barek3();
|
||||||
void init_sonic2mb();
|
void init_sonic2mb();
|
||||||
void init_twinktmb();
|
void init_twinktmb();
|
||||||
void init_jparkmb();
|
void init_jparkmb();
|
||||||
void init_sbubsm();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint16_t dsw_r(offs_t offset);
|
uint16_t dsw_r(offs_t offset);
|
||||||
|
|
||||||
|
void md_bootleg_map(address_map &map);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
|
||||||
uint16_t bl_710000_r();
|
|
||||||
void aladmdb_w(uint16_t data);
|
void aladmdb_w(uint16_t data);
|
||||||
uint16_t aladmdb_r();
|
uint16_t aladmdb_r();
|
||||||
uint16_t barek2mb_r();
|
uint16_t barek2mb_r();
|
||||||
@ -46,20 +42,14 @@ private:
|
|||||||
uint16_t topshoot_200051_r();
|
uint16_t topshoot_200051_r();
|
||||||
uint16_t sbubsm_400000_r();
|
uint16_t sbubsm_400000_r();
|
||||||
uint16_t sbubsm_400002_r();
|
uint16_t sbubsm_400002_r();
|
||||||
uint16_t puckpkmna_70001c_r();
|
|
||||||
uint16_t puckpkmna_4b2476_r();
|
|
||||||
|
|
||||||
void jzth_map(address_map &map);
|
void topshoot_68k_map(address_map &map);
|
||||||
void md_bootleg_map(address_map &map);
|
void sbubsm_68k_map(address_map &map);
|
||||||
void puckpkmn_map(address_map &map);
|
|
||||||
void puckpkmna_map(address_map &map);
|
|
||||||
|
|
||||||
optional_ioport m_io_exp;
|
optional_ioport m_io_exp;
|
||||||
|
|
||||||
// bootleg specific
|
// bootleg specific
|
||||||
int m_aladmdb_mcu_port = 0;
|
int m_aladmdb_mcu_port = 0;
|
||||||
|
|
||||||
int m_protcount = 0;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class md_sonic3bl_state : public md_boot_state
|
class md_sonic3bl_state : public md_boot_state
|
||||||
@ -92,14 +82,17 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
void megadrvb_6b(machine_config &config);
|
void megadrvb_6b(machine_config &config);
|
||||||
|
void ssf2mdb(machine_config &config);
|
||||||
|
|
||||||
void init_mk3mdb();
|
void init_mk3mdb();
|
||||||
void init_ssf2mdb();
|
|
||||||
void init_bk3ssrmb();
|
void init_bk3ssrmb();
|
||||||
void init_barekch();
|
void init_barekch();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void machine_start() override;
|
virtual void machine_start() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void ssf2mdb_68k_map(address_map &map);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAME_INCLUDES_MEGADRIV_ACBL_H
|
#endif // MAME_INCLUDES_MEGADRIV_ACBL_H
|
||||||
|
@ -45,7 +45,7 @@ Notes:
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "emu.h"
|
#include "emu.h"
|
||||||
#include "megadriv_acbl.h"
|
#include "megadriv.h"
|
||||||
|
|
||||||
#include "cpu/m68000/m68000.h"
|
#include "cpu/m68000/m68000.h"
|
||||||
#include "sound/okim6295.h"
|
#include "sound/okim6295.h"
|
||||||
@ -53,8 +53,37 @@ Notes:
|
|||||||
#include "sound/ymopn.h"
|
#include "sound/ymopn.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
class puckpkmn_state : public md_base_state
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
puckpkmn_state(const machine_config &mconfig, device_type type, const char *tag) :
|
||||||
|
md_base_state(mconfig, type, tag)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void puckpkmn(machine_config &config);
|
||||||
|
void puckpkmna(machine_config &config);
|
||||||
|
void jzth(machine_config &config);
|
||||||
|
|
||||||
|
void init_puckpkmn();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint16_t puckpkmna_70001c_r();
|
||||||
|
uint16_t puckpkmna_4b2476_r();
|
||||||
|
void bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask = ~0);
|
||||||
|
uint16_t bl_710000_r();
|
||||||
|
|
||||||
|
void jzth_map(address_map &map);
|
||||||
|
void puckpkmn_map(address_map &map);
|
||||||
|
void puckpkmna_map(address_map &map);
|
||||||
|
|
||||||
|
int m_protcount = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/* Puckman Pockimon Input Ports */
|
/* Puckman Pockimon Input Ports */
|
||||||
static INPUT_PORTS_START( puckpkmn )
|
INPUT_PORTS_START( puckpkmn )
|
||||||
PORT_START("P2") /* $700011.b */
|
PORT_START("P2") /* $700011.b */
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||||
@ -130,7 +159,7 @@ INPUT_PORTS_END
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
static INPUT_PORTS_START( jzth )
|
INPUT_PORTS_START( jzth )
|
||||||
PORT_START("P2") /* $700011.b */
|
PORT_START("P2") /* $700011.b */
|
||||||
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||||
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
|
||||||
@ -213,7 +242,7 @@ static INPUT_PORTS_START( jzth )
|
|||||||
INPUT_PORTS_END
|
INPUT_PORTS_END
|
||||||
|
|
||||||
|
|
||||||
void md_boot_state::puckpkmn_map(address_map &map)
|
void puckpkmn_state::puckpkmn_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x000000, 0x3fffff).rom(); /* Main 68k Program Roms */
|
map(0x000000, 0x3fffff).rom(); /* Main 68k Program Roms */
|
||||||
map(0x700010, 0x700011).portr("P2");
|
map(0x700010, 0x700011).portr("P2");
|
||||||
@ -222,7 +251,7 @@ void md_boot_state::puckpkmn_map(address_map &map)
|
|||||||
map(0x700016, 0x700017).portr("DSW1");
|
map(0x700016, 0x700017).portr("DSW1");
|
||||||
map(0x700018, 0x700019).portr("DSW2");
|
map(0x700018, 0x700019).portr("DSW2");
|
||||||
map(0x700023, 0x700023).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
map(0x700023, 0x700023).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||||
map(0xa04000, 0xa04003).rw(FUNC(md_boot_state::megadriv_68k_YM2612_read), FUNC(md_boot_state::megadriv_68k_YM2612_write));
|
map(0xa04000, 0xa04003).rw(FUNC(puckpkmn_state::megadriv_68k_YM2612_read), FUNC(puckpkmn_state::megadriv_68k_YM2612_write));
|
||||||
map(0xc00000, 0xc0001f).rw(m_vdp, FUNC(sega315_5313_device::vdp_r), FUNC(sega315_5313_device::vdp_w));
|
map(0xc00000, 0xc0001f).rw(m_vdp, FUNC(sega315_5313_device::vdp_r), FUNC(sega315_5313_device::vdp_w));
|
||||||
|
|
||||||
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
||||||
@ -238,7 +267,7 @@ void md_boot_state::puckpkmn_map(address_map &map)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void md_boot_state::jzth_map(address_map &map)
|
void puckpkmn_state::jzth_map(address_map &map)
|
||||||
{
|
{
|
||||||
map(0x000000, 0x3fffff).rom();
|
map(0x000000, 0x3fffff).rom();
|
||||||
map(0x700010, 0x700011).portr("P2");
|
map(0x700010, 0x700011).portr("P2");
|
||||||
@ -247,7 +276,7 @@ void md_boot_state::jzth_map(address_map &map)
|
|||||||
map(0x700016, 0x700017).portr("DSW1");
|
map(0x700016, 0x700017).portr("DSW1");
|
||||||
map(0x700018, 0x700019).portr("DSW2");
|
map(0x700018, 0x700019).portr("DSW2");
|
||||||
map(0x700023, 0x700023).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
map(0x700023, 0x700023).rw("oki", FUNC(okim6295_device::read), FUNC(okim6295_device::write));
|
||||||
map(0xa04000, 0xa04003).rw(FUNC(md_boot_state::megadriv_68k_YM2612_read), FUNC(md_boot_state::megadriv_68k_YM2612_write));
|
map(0xa04000, 0xa04003).rw(FUNC(puckpkmn_state::megadriv_68k_YM2612_read), FUNC(puckpkmn_state::megadriv_68k_YM2612_write));
|
||||||
map(0xc00000, 0xc0001f).rw(m_vdp, FUNC(sega315_5313_device::vdp_r), FUNC(sega315_5313_device::vdp_w));
|
map(0xc00000, 0xc0001f).rw(m_vdp, FUNC(sega315_5313_device::vdp_r), FUNC(sega315_5313_device::vdp_w));
|
||||||
|
|
||||||
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
||||||
@ -256,33 +285,105 @@ void md_boot_state::jzth_map(address_map &map)
|
|||||||
|
|
||||||
map(0xA11100, 0xA11101).noprw();
|
map(0xA11100, 0xA11101).noprw();
|
||||||
|
|
||||||
map(0x710000, 0x710001).rw(FUNC(md_boot_state::bl_710000_r), FUNC(md_boot_state::bl_710000_w)); // protection, will erase the VDP address causing writes to 0 unless this returns 0xe
|
map(0x710000, 0x710001).rw(FUNC(puckpkmn_state::bl_710000_r), FUNC(puckpkmn_state::bl_710000_w)); // protection, will erase the VDP address causing writes to 0 unless this returns 0xe
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t md_boot_state::puckpkmna_70001c_r()
|
uint16_t puckpkmn_state::puckpkmna_70001c_r()
|
||||||
{
|
{
|
||||||
return 0x0e;
|
return 0x0e;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t md_boot_state::puckpkmna_4b2476_r()
|
uint16_t puckpkmn_state::puckpkmna_4b2476_r()
|
||||||
{
|
{
|
||||||
if (!strcmp(machine().system().name, "puckpkmnb")) return 0x3100;
|
if (!strcmp(machine().system().name, "puckpkmnb")) return 0x3100;
|
||||||
|
|
||||||
return 0x3400;
|
return 0x3400;
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::puckpkmna_map(address_map &map)
|
|
||||||
|
// jzth protection
|
||||||
|
void puckpkmn_state::bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||||
{
|
{
|
||||||
puckpkmn_map(map);
|
int pc = m_maincpu->pc();
|
||||||
map(0x4b2476, 0x4b2477).r(FUNC(md_boot_state::puckpkmna_4b2476_r));
|
|
||||||
map(0x70001c, 0x70001d).r(FUNC(md_boot_state::puckpkmna_70001c_r));
|
logerror("%06x writing to bl_710000_w %04x %04x\n", pc, data, mem_mask);
|
||||||
|
|
||||||
|
// protection value is read from 0x710000 after a series of writes.. and stored at ff0007
|
||||||
|
// startup
|
||||||
|
/*
|
||||||
|
059ce0 writing to bl_710000_w ff08 ffff
|
||||||
|
059d04 writing to bl_710000_w 000a ffff
|
||||||
|
059d04 writing to bl_710000_w 000b ffff
|
||||||
|
059d04 writing to bl_710000_w 000c ffff
|
||||||
|
059d04 writing to bl_710000_w 000f ffff
|
||||||
|
059d1c writing to bl_710000_w ff09 ffff
|
||||||
|
059d2a reading from bl_710000_r (wants 0xe)
|
||||||
|
059ce0 writing to bl_710000_w ff08 ffff
|
||||||
|
059d04 writing to bl_710000_w 000a ffff
|
||||||
|
059d04 writing to bl_710000_w 000b ffff
|
||||||
|
059d04 writing to bl_710000_w 000c ffff
|
||||||
|
059d04 writing to bl_710000_w 000f ffff
|
||||||
|
059d1c writing to bl_710000_w ff09 ffff
|
||||||
|
059d2a reading from bl_710000_r (wants 0xe)
|
||||||
|
*/
|
||||||
|
// before lv stage 3
|
||||||
|
/*
|
||||||
|
059ce0 writing to bl_710000_w 0008 ffff
|
||||||
|
059d04 writing to bl_710000_w 000b ffff
|
||||||
|
059d04 writing to bl_710000_w 000f ffff
|
||||||
|
059d1c writing to bl_710000_w ff09 ffff
|
||||||
|
059d2a reading from bl_710000_r (wants 0x4)
|
||||||
|
*/
|
||||||
|
// start level 3
|
||||||
|
/*
|
||||||
|
059ce0 writing to bl_710000_w ff08 ffff
|
||||||
|
059d04 writing to bl_710000_w 000b ffff
|
||||||
|
059d04 writing to bl_710000_w 000c ffff
|
||||||
|
059d04 writing to bl_710000_w 000e ffff
|
||||||
|
059d1c writing to bl_710000_w ff09 ffff
|
||||||
|
059d2a reading from bl_710000_r (wants 0x5)
|
||||||
|
|
||||||
|
// after end sequence
|
||||||
|
059ce0 writing to bl_710000_w 0008 ffff
|
||||||
|
059d04 writing to bl_710000_w 000a ffff
|
||||||
|
059d04 writing to bl_710000_w 000b ffff
|
||||||
|
059d04 writing to bl_710000_w 000c ffff
|
||||||
|
059d04 writing to bl_710000_w 000f ffff
|
||||||
|
059d1c writing to bl_710000_w ff09 ffff
|
||||||
|
059d2a reading from bl_710000_r (wants 0xe)
|
||||||
|
|
||||||
|
*/
|
||||||
|
m_protcount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::puckpkmn(machine_config &config)
|
uint16_t puckpkmn_state::bl_710000_r()
|
||||||
|
{
|
||||||
|
uint16_t ret;
|
||||||
|
int pc = m_maincpu->pc();
|
||||||
|
logerror("%06x reading from bl_710000_r\n", pc);
|
||||||
|
|
||||||
|
if (m_protcount==6) { ret = 0xe; }
|
||||||
|
else if (m_protcount==5) { ret = 0x5; }
|
||||||
|
else if (m_protcount==4) { ret = 0x4; }
|
||||||
|
else ret = 0xf;
|
||||||
|
|
||||||
|
m_protcount = 0;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void puckpkmn_state::puckpkmna_map(address_map &map)
|
||||||
|
{
|
||||||
|
puckpkmn_map(map);
|
||||||
|
map(0x4b2476, 0x4b2477).r(FUNC(puckpkmn_state::puckpkmna_4b2476_r));
|
||||||
|
map(0x70001c, 0x70001d).r(FUNC(puckpkmn_state::puckpkmna_70001c_r));
|
||||||
|
}
|
||||||
|
|
||||||
|
void puckpkmn_state::puckpkmn(machine_config &config)
|
||||||
{
|
{
|
||||||
md_ntsc(config);
|
md_ntsc(config);
|
||||||
|
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::puckpkmn_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::puckpkmn_map);
|
||||||
|
|
||||||
config.device_remove("genesis_snd_z80");
|
config.device_remove("genesis_snd_z80");
|
||||||
|
|
||||||
@ -291,18 +392,18 @@ void md_boot_state::puckpkmn(machine_config &config)
|
|||||||
oki.add_route(ALL_OUTPUTS, "rspeaker", 0.25);
|
oki.add_route(ALL_OUTPUTS, "rspeaker", 0.25);
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::puckpkmna(machine_config &config)
|
void puckpkmn_state::puckpkmna(machine_config &config)
|
||||||
{
|
{
|
||||||
puckpkmn(config);
|
puckpkmn(config);
|
||||||
|
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::puckpkmna_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::puckpkmna_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
void md_boot_state::jzth(machine_config &config)
|
void puckpkmn_state::jzth(machine_config &config)
|
||||||
{
|
{
|
||||||
puckpkmn(config);
|
puckpkmn(config);
|
||||||
|
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &md_boot_state::jzth_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::jzth_map);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Genie's Hardware (contains no real sega parts) */
|
/* Genie's Hardware (contains no real sega parts) */
|
||||||
@ -376,7 +477,7 @@ ROM sockets U63 & U64 empty
|
|||||||
|
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void md_boot_state::init_puckpkmn()
|
void puckpkmn_state::init_puckpkmn()
|
||||||
{
|
{
|
||||||
uint8_t *rom = memregion("maincpu")->base();
|
uint8_t *rom = memregion("maincpu")->base();
|
||||||
const size_t len = memregion("maincpu")->bytes();
|
const size_t len = memregion("maincpu")->bytes();
|
||||||
@ -484,8 +585,11 @@ ROM_START( jzth )
|
|||||||
ROM_CONTINUE(0x40000,0x40000)
|
ROM_CONTINUE(0x40000,0x40000)
|
||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
} // anonymous namespace
|
||||||
|
|
||||||
|
|
||||||
/* Genie Hardware (uses Genesis VDP) also has 'Sun Mixing Co' put into tile ram */ // is 'Genie 2000' part of the title, and the parent set a bootleg?
|
/* Genie Hardware (uses Genesis VDP) also has 'Sun Mixing Co' put into tile ram */ // is 'Genie 2000' part of the title, and the parent set a bootleg?
|
||||||
GAME( 2000, puckpkmn, 0, puckpkmn, puckpkmn, md_boot_state, init_puckpkmn, ROT0, "Genie", "Puckman Pockimon (set 1)", 0 )
|
GAME( 2000, puckpkmn, 0, puckpkmn, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Genie", "Puckman Pockimon (set 1)", 0 )
|
||||||
GAME( 2000, puckpkmna, puckpkmn, puckpkmna, puckpkmn, md_boot_state, init_puckpkmn, ROT0, "IBS", "Puckman Pockimon (set 2)", 0 )
|
GAME( 2000, puckpkmna, puckpkmn, puckpkmna, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "IBS", "Puckman Pockimon (set 2)", 0 )
|
||||||
GAME( 2000, puckpkmnb, puckpkmn, puckpkmna, puckpkmn, md_boot_state, init_puckpkmn, ROT0, "Sun Mixing", "Puckman Pockimon (set 3)", 0 )
|
GAME( 2000, puckpkmnb, puckpkmn, puckpkmna, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Sun Mixing", "Puckman Pockimon (set 3)", 0 )
|
||||||
GAME( 2000, jzth, 0, jzth, jzth, md_boot_state, init_puckpkmn, ROT0, "<unknown>", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND )
|
GAME( 2000, jzth, 0, jzth, jzth, puckpkmn_state, init_puckpkmn, ROT0, "<unknown>", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND )
|
||||||
|
Loading…
Reference in New Issue
Block a user