mirror of
https://github.com/mamedev/mame.git
synced 2024-11-16 07:48:32 +01: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
4 changed files with 209 additions and 169 deletions
|
@ -64,7 +64,7 @@ public:
|
|||
};
|
||||
|
||||
|
||||
static INPUT_PORTS_START( hshavoc )
|
||||
INPUT_PORTS_START( hshavoc )
|
||||
PORT_START("IN0") // 16 bit
|
||||
PORT_DIPNAME( 0x0001, 0x0000, DEF_STR( Unknown ) )
|
||||
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
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
|
@ -411,77 +467,6 @@ uint16_t md_boot_state::sbubsm_400002_r()
|
|||
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()
|
||||
{
|
||||
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>));
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
// 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();
|
||||
rom[0x1afc08/2] = 0x6600;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// 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)));
|
||||
|
@ -1213,16 +1197,6 @@ void md_boot_6button_state::init_mk3mdb()
|
|||
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()
|
||||
{
|
||||
uint8_t* rom = memregion("maincpu")->base();
|
||||
|
@ -1251,37 +1225,6 @@ void md_boot_state::init_srmdb()
|
|||
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()
|
||||
{
|
||||
|
@ -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( 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( 1995, topshoot, 0, md_bootleg, topshoot, md_boot_state, init_topshoot, 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( 1995, topshoot, 0, topshoot, topshoot, md_boot_state, init_megadriv, ROT0, "Sun Mixing", "Top Shooter", 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, 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
|
||||
|
|
|
@ -16,28 +16,24 @@ public:
|
|||
|
||||
void megadrvb(machine_config &config);
|
||||
void md_bootleg(machine_config &config);
|
||||
void puckpkmn(machine_config &config);
|
||||
void jzth(machine_config &config);
|
||||
void puckpkmna(machine_config &config);
|
||||
void topshoot(machine_config &config);
|
||||
void sbubsm(machine_config &config);
|
||||
|
||||
void init_aladmdb();
|
||||
void init_srmdb();
|
||||
void init_topshoot();
|
||||
void init_puckpkmn();
|
||||
void init_barek2();
|
||||
void init_barek2ch();
|
||||
void init_barek3();
|
||||
void init_sonic2mb();
|
||||
void init_twinktmb();
|
||||
void init_jparkmb();
|
||||
void init_sbubsm();
|
||||
|
||||
protected:
|
||||
uint16_t dsw_r(offs_t offset);
|
||||
|
||||
void md_bootleg_map(address_map &map);
|
||||
|
||||
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);
|
||||
uint16_t aladmdb_r();
|
||||
uint16_t barek2mb_r();
|
||||
|
@ -46,20 +42,14 @@ private:
|
|||
uint16_t topshoot_200051_r();
|
||||
uint16_t sbubsm_400000_r();
|
||||
uint16_t sbubsm_400002_r();
|
||||
uint16_t puckpkmna_70001c_r();
|
||||
uint16_t puckpkmna_4b2476_r();
|
||||
|
||||
void jzth_map(address_map &map);
|
||||
void md_bootleg_map(address_map &map);
|
||||
void puckpkmn_map(address_map &map);
|
||||
void puckpkmna_map(address_map &map);
|
||||
void topshoot_68k_map(address_map &map);
|
||||
void sbubsm_68k_map(address_map &map);
|
||||
|
||||
optional_ioport m_io_exp;
|
||||
|
||||
// bootleg specific
|
||||
int m_aladmdb_mcu_port = 0;
|
||||
|
||||
int m_protcount = 0;
|
||||
};
|
||||
|
||||
class md_sonic3bl_state : public md_boot_state
|
||||
|
@ -92,14 +82,17 @@ public:
|
|||
}
|
||||
|
||||
void megadrvb_6b(machine_config &config);
|
||||
void ssf2mdb(machine_config &config);
|
||||
|
||||
void init_mk3mdb();
|
||||
void init_ssf2mdb();
|
||||
void init_bk3ssrmb();
|
||||
void init_barekch();
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
|
||||
private:
|
||||
void ssf2mdb_68k_map(address_map &map);
|
||||
};
|
||||
|
||||
#endif // MAME_INCLUDES_MEGADRIV_ACBL_H
|
||||
|
|
|
@ -45,7 +45,7 @@ Notes:
|
|||
*/
|
||||
|
||||
#include "emu.h"
|
||||
#include "megadriv_acbl.h"
|
||||
#include "megadriv.h"
|
||||
|
||||
#include "cpu/m68000/m68000.h"
|
||||
#include "sound/okim6295.h"
|
||||
|
@ -53,8 +53,37 @@ Notes:
|
|||
#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 */
|
||||
static INPUT_PORTS_START( puckpkmn )
|
||||
INPUT_PORTS_START( puckpkmn )
|
||||
PORT_START("P2") /* $700011.b */
|
||||
PORT_BIT( 0x01, 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_BIT( 0x01, 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
|
||||
|
||||
|
||||
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(0x700010, 0x700011).portr("P2");
|
||||
|
@ -222,7 +251,7 @@ void md_boot_state::puckpkmn_map(address_map &map)
|
|||
map(0x700016, 0x700017).portr("DSW1");
|
||||
map(0x700018, 0x700019).portr("DSW2");
|
||||
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(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(0x700010, 0x700011).portr("P2");
|
||||
|
@ -247,7 +276,7 @@ void md_boot_state::jzth_map(address_map &map)
|
|||
map(0x700016, 0x700017).portr("DSW1");
|
||||
map(0x700018, 0x700019).portr("DSW2");
|
||||
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(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
||||
|
@ -256,33 +285,105 @@ void md_boot_state::jzth_map(address_map &map)
|
|||
|
||||
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;
|
||||
}
|
||||
|
||||
uint16_t md_boot_state::puckpkmna_4b2476_r()
|
||||
uint16_t puckpkmn_state::puckpkmna_4b2476_r()
|
||||
{
|
||||
if (!strcmp(machine().system().name, "puckpkmnb")) return 0x3100;
|
||||
|
||||
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);
|
||||
map(0x4b2476, 0x4b2477).r(FUNC(md_boot_state::puckpkmna_4b2476_r));
|
||||
map(0x70001c, 0x70001d).r(FUNC(md_boot_state::puckpkmna_70001c_r));
|
||||
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++;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
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");
|
||||
|
||||
|
@ -291,18 +392,18 @@ void md_boot_state::puckpkmn(machine_config &config)
|
|||
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);
|
||||
|
||||
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);
|
||||
|
||||
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) */
|
||||
|
@ -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();
|
||||
const size_t len = memregion("maincpu")->bytes();
|
||||
|
@ -484,8 +585,11 @@ ROM_START( jzth )
|
|||
ROM_CONTINUE(0x40000,0x40000)
|
||||
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?
|
||||
GAME( 2000, puckpkmn, 0, puckpkmn, puckpkmn, md_boot_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, puckpkmnb, puckpkmn, puckpkmna, puckpkmn, md_boot_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, puckpkmn, 0, puckpkmn, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Genie", "Puckman Pockimon (set 1)", 0 )
|
||||
GAME( 2000, puckpkmna, puckpkmn, puckpkmna, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "IBS", "Puckman Pockimon (set 2)", 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, puckpkmn_state, init_puckpkmn, ROT0, "<unknown>", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND )
|
||||
|
|
Loading…
Reference in a new issue