mirror of
https://github.com/holub/mame
synced 2025-04-23 08:49:55 +03:00
Mega Drive cleanup:
mdconsole.cpp: Got rid of EXP port from Mega Drive II, Mega Jet and Nomad configurations, and made built-in Nomad controller fixed. puckpkmn.cpp: Cleaned up code, register local class member for save states, suppress side effects for debugger.
This commit is contained in:
parent
6f3f1b0306
commit
24ee444738
@ -36,8 +36,10 @@ void md_cons_state::md_ctrl_ports(machine_config &config)
|
||||
|
||||
m_ioports[1]->set_in_handler(m_ctrl_ports[1], FUNC(sms_control_port_device::in_r));
|
||||
m_ioports[1]->set_out_handler(m_ctrl_ports[1], FUNC(sms_control_port_device::out_w));
|
||||
}
|
||||
|
||||
// TODO: Mega Drive II, Mega Jet and Nomad lack EXP port
|
||||
void md_cons_state::md_exp_port(machine_config &config)
|
||||
{
|
||||
SMS_CONTROL_PORT(config, m_ctrl_ports[2], sms_control_port_devices, nullptr);
|
||||
m_ctrl_ports[2]->th_handler().set(m_ioports[2], FUNC(megadrive_io_port_device::th_w));
|
||||
m_ctrl_ports[2]->set_screen(m_screen);
|
||||
@ -69,9 +71,7 @@ static INPUT_PORTS_START( md )
|
||||
INPUT_PORTS_END
|
||||
|
||||
static INPUT_PORTS_START( gen_nomd )
|
||||
PORT_INCLUDE( md )
|
||||
|
||||
PORT_MODIFY("RESET") /* No reset button */
|
||||
PORT_START("RESET") // No reset button
|
||||
PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNUSED )
|
||||
INPUT_PORTS_END
|
||||
|
||||
@ -220,6 +220,7 @@ void md_cons_slot_state::ms_megadriv(machine_config &config)
|
||||
m_screen->screen_vblank().set(FUNC(md_cons_slot_state::screen_vblank_console));
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
MD_CART_SLOT(config, m_cart, md_cart, nullptr).set_must_be_loaded(true);
|
||||
SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
|
||||
@ -232,6 +233,7 @@ void md_cons_slot_state::ms_megadpal(machine_config &config)
|
||||
m_screen->screen_vblank().set(FUNC(md_cons_slot_state::screen_vblank_console));
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
MD_CART_SLOT(config, m_cart, md_cart, nullptr).set_must_be_loaded(true);
|
||||
SOFTWARE_LIST(config, "cart_list").set_original("megadriv");
|
||||
@ -479,6 +481,7 @@ void md_cons_state::genesis_32x(machine_config &config)
|
||||
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "_32x_cart", "32x,bin"));
|
||||
cartslot.set_must_be_loaded(true);
|
||||
@ -513,6 +516,7 @@ void md_cons_state::mdj_32x(machine_config &config)
|
||||
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "_32x_cart", "32x,bin"));
|
||||
cartslot.set_must_be_loaded(true);
|
||||
@ -547,6 +551,7 @@ void md_cons_state::md_32x(machine_config &config)
|
||||
m_ymsnd->add_route(1, "rspeaker", (0.50)/2);
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
generic_cartslot_device &cartslot(GENERIC_CARTSLOT(config, "cartslot", generic_plain_slot, "_32x_cart", "32x,bin"));
|
||||
cartslot.set_must_be_loaded(true);
|
||||
@ -602,6 +607,7 @@ void md_cons_cd_state::genesis_scd(machine_config &config)
|
||||
config.set_perfect_quantum("segacd:segacd_68k"); // perfect sync to the fastest cpu
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
CDROM(config, "cdrom").set_interface("scd_cdrom");
|
||||
|
||||
@ -642,6 +648,7 @@ void md_cons_cd_state::md_scd(machine_config &config)
|
||||
config.set_perfect_quantum("segacd:segacd_68k"); // perfect sync to the fastest cpu
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
CDROM(config, "cdrom").set_interface("scd_cdrom");
|
||||
|
||||
@ -682,6 +689,7 @@ void md_cons_cd_state::mdj_scd(machine_config &config)
|
||||
config.set_perfect_quantum("segacd:segacd_68k"); // perfect sync to the fastest cpu
|
||||
|
||||
md_ctrl_ports(config);
|
||||
md_exp_port(config);
|
||||
|
||||
CDROM(config, "cdrom").set_interface("scd_cdrom");
|
||||
|
||||
@ -1018,7 +1026,7 @@ CONS( 1995, 32x_mcd, 32x_scd, 0, md_32x_scd, md, md_cons_c
|
||||
CONS( 1994, 32x_mcdj, 32x_scd, 0, mdj_32x_scd, md, md_cons_cd_state, init_md_jpn, "Sega", "Mega-CD with 32X (Japan, NTSC)", MACHINE_NOT_WORKING )
|
||||
|
||||
// handheld hardware
|
||||
CONS( 1995, gen_nomd, 0, 0, ms_megadriv2, gen_nomd, md_cons_slot_state, init_genesis, "Sega", "Genesis Nomad (USA Genesis handheld)", MACHINE_SUPPORTS_SAVE )
|
||||
CONS( 1995, gen_nomd, 0, 0, ms_megajet, gen_nomd, md_cons_slot_state, init_genesis, "Sega", "Genesis Nomad (USA Genesis handheld)", MACHINE_SUPPORTS_SAVE )
|
||||
|
||||
// handheld without LCD
|
||||
CONS( 1993, megajet, gen_nomd, 0, ms_megajet, md, md_cons_slot_state, init_md_jpn, "Sega", "Mega Jet (Japan Mega Drive handheld)", MACHINE_SUPPORTS_SAVE )
|
||||
|
@ -48,6 +48,7 @@ protected:
|
||||
void install_tmss();
|
||||
|
||||
void md_ctrl_ports(machine_config &config);
|
||||
void md_exp_port(machine_config &config);
|
||||
|
||||
optional_device_array<sms_control_port_device, 3> m_ctrl_ports;
|
||||
optional_device<sega_32x_device> m_32x;
|
||||
|
@ -777,7 +777,7 @@ IRQ_CALLBACK_MEMBER(md_base_state::genesis_int_callback)
|
||||
|
||||
void md_base_state::megadriv_timers(machine_config &config)
|
||||
{
|
||||
TIMER(config, m_scan_timer).configure_generic("gen_vdp", FUNC(sega315_5313_device::megadriv_scanline_timer_callback));
|
||||
TIMER(config, m_scan_timer).configure_generic(m_vdp, FUNC(sega315_5313_device::megadriv_scanline_timer_callback));
|
||||
}
|
||||
|
||||
void md_base_state::megadriv_ioports(machine_config &config)
|
||||
|
@ -58,25 +58,39 @@ 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)
|
||||
{ }
|
||||
using md_base_state::md_base_state;
|
||||
|
||||
void puckpkmn(machine_config &config);
|
||||
void puckpkmna(machine_config &config);
|
||||
void jzth(machine_config &config);
|
||||
void puckpkmn(machine_config &config) ATTR_COLD;
|
||||
void puckpkmna(machine_config &config) ATTR_COLD;
|
||||
void puckpkmnb(machine_config &config) ATTR_COLD;
|
||||
|
||||
void init_puckpkmn();
|
||||
void init_puckpkmn() ATTR_COLD;
|
||||
|
||||
protected:
|
||||
void puckpkmn_base_map(address_map &map) ATTR_COLD;
|
||||
|
||||
private:
|
||||
void puckpkmn_map(address_map &map) ATTR_COLD;
|
||||
void puckpkmna_map(address_map &map) ATTR_COLD;
|
||||
void puckpkmnb_map(address_map &map) ATTR_COLD;
|
||||
};
|
||||
|
||||
|
||||
class jzth_state : public puckpkmn_state
|
||||
{
|
||||
public:
|
||||
using puckpkmn_state::puckpkmn_state;
|
||||
|
||||
void jzth(machine_config &config) ATTR_COLD;
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override ATTR_COLD;
|
||||
|
||||
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);
|
||||
void jzth_map(address_map &map) ATTR_COLD;
|
||||
|
||||
int m_protcount = 0;
|
||||
};
|
||||
@ -242,72 +256,68 @@ INPUT_PORTS_START( jzth )
|
||||
INPUT_PORTS_END
|
||||
|
||||
|
||||
void puckpkmn_state::puckpkmn_base_map(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x3fffff).rom(); // Main 68k Program ROMs
|
||||
|
||||
map(0x700010, 0x700011).portr("P2");
|
||||
map(0x700012, 0x700013).portr("P1");
|
||||
map(0x700014, 0x700015).portr("UNK");
|
||||
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(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);
|
||||
}
|
||||
|
||||
|
||||
void puckpkmn_state::puckpkmn_map(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x3fffff).rom(); /* Main 68k Program Roms */
|
||||
map(0x700010, 0x700011).portr("P2");
|
||||
map(0x700012, 0x700013).portr("P1");
|
||||
map(0x700014, 0x700015).portr("UNK");
|
||||
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(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));
|
||||
puckpkmn_base_map(map);
|
||||
|
||||
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
||||
// Unknown reads/writes:
|
||||
map(0xa00000, 0xa00551).nopw(); // ?
|
||||
// map(0xa10000, 0xa10001).nopr(); // ? once
|
||||
map(0xa10002, 0xa10005).noprw(); // ? alternative way of reading inputs ?
|
||||
map(0xa11100, 0xa11101).noprw(); // ?
|
||||
// map(0xa10008, 0xa1000d).nopw(); // ? once
|
||||
// map(0xa14000, 0xa14003).nopw(); // ? once
|
||||
map(0xa11200, 0xa11201).nopw(); // ?
|
||||
}
|
||||
|
||||
/* Unknown reads/writes: */
|
||||
map(0xa00000, 0xa00551).nopw(); /* ? */
|
||||
// map(0xa10000, 0xa10001).nopr(); /* ? once */
|
||||
map(0xa10002, 0xa10005).noprw(); /* ? alternative way of reading inputs ? */
|
||||
map(0xa11100, 0xa11101).noprw(); /* ? */
|
||||
// map(0xa10008, 0xa1000d).nopw(); /* ? once */
|
||||
// map(0xa14000, 0xa14003).nopw(); /* ? once */
|
||||
map(0xa11200, 0xa11201).nopw(); /* ? */
|
||||
void puckpkmn_state::puckpkmna_map(address_map &map)
|
||||
{
|
||||
puckpkmn_map(map);
|
||||
|
||||
map(0x4b2476, 0x4b2477).lr16(NAME([] () { return uint16_t(0x3400); }));
|
||||
map(0x70001c, 0x70001d).lr16(NAME([] () { return uint16_t(0x000e); }));
|
||||
}
|
||||
|
||||
void puckpkmn_state::puckpkmnb_map(address_map &map)
|
||||
{
|
||||
puckpkmn_map(map);
|
||||
|
||||
map(0x4b2476, 0x4b2477).lr16(NAME([] () { return uint16_t(0x3100); }));
|
||||
map(0x70001c, 0x70001d).lr16(NAME([] () { return uint16_t(0x000e); }));
|
||||
}
|
||||
|
||||
|
||||
void puckpkmn_state::jzth_map(address_map &map)
|
||||
void jzth_state::jzth_map(address_map &map)
|
||||
{
|
||||
map(0x000000, 0x3fffff).rom();
|
||||
map(0x700010, 0x700011).portr("P2");
|
||||
map(0x700012, 0x700013).portr("P1");
|
||||
map(0x700014, 0x700015).portr("UNK");
|
||||
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(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));
|
||||
puckpkmn_base_map(map);
|
||||
|
||||
map(0xe00000, 0xe0ffff).ram().mirror(0x1f0000);
|
||||
map(0x710000, 0x710001).rw(FUNC(jzth_state::bl_710000_r), FUNC(jzth_state::bl_710000_w)); // protection, will erase the VDP address causing writes to 0 unless this returns 0xe
|
||||
|
||||
map(0xa00000, 0xa00551).noprw();
|
||||
|
||||
map(0xA11100, 0xA11101).noprw();
|
||||
|
||||
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 puckpkmn_state::puckpkmna_70001c_r()
|
||||
{
|
||||
return 0x0e;
|
||||
}
|
||||
|
||||
uint16_t puckpkmn_state::puckpkmna_4b2476_r()
|
||||
{
|
||||
if (!strcmp(machine().system().name, "puckpkmnb")) return 0x3100;
|
||||
|
||||
return 0x3400;
|
||||
map(0xa11100, 0xa11101).noprw();
|
||||
}
|
||||
|
||||
|
||||
// jzth protection
|
||||
void puckpkmn_state::bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask)
|
||||
void jzth_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
|
||||
/*
|
||||
@ -351,34 +361,33 @@ void puckpkmn_state::bl_710000_w(offs_t offset, uint16_t data, uint16_t mem_mask
|
||||
059d04 writing to bl_710000_w 000f ffff
|
||||
059d1c writing to bl_710000_w ff09 ffff
|
||||
059d2a reading from bl_710000_r (wants 0xe)
|
||||
|
||||
*/
|
||||
|
||||
logerror("%s: writing to bl_710000_w %04x %04x\n", machine().describe_context(), data, mem_mask);
|
||||
|
||||
m_protcount++;
|
||||
}
|
||||
|
||||
uint16_t puckpkmn_state::bl_710000_r()
|
||||
uint16_t jzth_state::bl_710000_r()
|
||||
{
|
||||
logerror("%s: reading from bl_710000_r\n", machine().describe_context());
|
||||
|
||||
uint16_t ret;
|
||||
int pc = m_maincpu->pc();
|
||||
logerror("%06x reading from bl_710000_r\n", pc);
|
||||
switch (m_protcount)
|
||||
{
|
||||
case 4: ret = 0x4; break;
|
||||
case 5: ret = 0x5; break;
|
||||
case 6: ret = 0xe; break;
|
||||
default: ret = 0xf;
|
||||
}
|
||||
|
||||
if (m_protcount==6) { ret = 0xe; }
|
||||
else if (m_protcount==5) { ret = 0x5; }
|
||||
else if (m_protcount==4) { ret = 0x4; }
|
||||
else ret = 0xf;
|
||||
if (!machine().side_effects_disabled())
|
||||
m_protcount = 0;
|
||||
|
||||
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);
|
||||
@ -399,13 +408,32 @@ void puckpkmn_state::puckpkmna(machine_config &config)
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::puckpkmna_map);
|
||||
}
|
||||
|
||||
void puckpkmn_state::jzth(machine_config &config)
|
||||
void puckpkmn_state::puckpkmnb(machine_config &config)
|
||||
{
|
||||
puckpkmn(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::jzth_map);
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &puckpkmn_state::puckpkmnb_map);
|
||||
}
|
||||
|
||||
|
||||
void jzth_state::jzth(machine_config &config)
|
||||
{
|
||||
puckpkmn(config);
|
||||
|
||||
m_maincpu->set_addrmap(AS_PROGRAM, &jzth_state::jzth_map);
|
||||
}
|
||||
|
||||
|
||||
void jzth_state::machine_start()
|
||||
{
|
||||
puckpkmn_state::machine_start();
|
||||
|
||||
m_protcount = 0;
|
||||
|
||||
save_item(NAME(m_protcount));
|
||||
}
|
||||
|
||||
|
||||
/* Genie's Hardware (contains no real sega parts) */
|
||||
|
||||
/***************************************************************************
|
||||
@ -479,11 +507,11 @@ ROM sockets U63 & U64 empty
|
||||
|
||||
void puckpkmn_state::init_puckpkmn()
|
||||
{
|
||||
uint8_t *rom = memregion("maincpu")->base();
|
||||
const size_t len = memregion("maincpu")->bytes();
|
||||
uint8_t *const rom = memregion("maincpu")->base();
|
||||
size_t const len = memregion("maincpu")->bytes();
|
||||
|
||||
for (size_t i = 0; i < len; i++)
|
||||
rom[i] = bitswap<8>(rom[i],1,4,2,0,7,5,3,6);
|
||||
rom[i] = bitswap<8>(rom[i], 1, 4, 2, 0, 7, 5, 3, 6);
|
||||
|
||||
init_megadriv();
|
||||
}
|
||||
@ -588,8 +616,9 @@ 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, 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 )
|
||||
// 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, 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, puckpkmnb, puckpkmn, puckpkmn_state, init_puckpkmn, ROT0, "Sun Mixing", "Puckman Pockimon (set 3)", 0 )
|
||||
GAME( 2000, jzth, 0, jzth, jzth, jzth_state, init_puckpkmn, ROT0, "<unknown>", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND )
|
||||
|
Loading…
Reference in New Issue
Block a user