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:
Vas Crabb 2022-12-12 07:09:53 +11:00
parent 6f3f1b0306
commit 24ee444738
4 changed files with 132 additions and 94 deletions

View File

@ -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 )

View File

@ -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;

View File

@ -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)

View File

@ -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 )