From 24ee444738aab2561a33df600cc84a6dc9712e72 Mon Sep 17 00:00:00 2001 From: Vas Crabb Date: Mon, 12 Dec 2022 07:09:53 +1100 Subject: [PATCH] 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. --- src/mame/sega/mdconsole.cpp | 18 +++- src/mame/sega/mdconsole.h | 1 + src/mame/sega/megadriv.cpp | 2 +- src/mame/sega/puckpkmn.cpp | 205 ++++++++++++++++++++---------------- 4 files changed, 132 insertions(+), 94 deletions(-) diff --git a/src/mame/sega/mdconsole.cpp b/src/mame/sega/mdconsole.cpp index 5b2b502686b..11993649305 100644 --- a/src/mame/sega/mdconsole.cpp +++ b/src/mame/sega/mdconsole.cpp @@ -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 ) diff --git a/src/mame/sega/mdconsole.h b/src/mame/sega/mdconsole.h index 21f04f6aa1e..e7e14af8bac 100644 --- a/src/mame/sega/mdconsole.h +++ b/src/mame/sega/mdconsole.h @@ -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 m_ctrl_ports; optional_device m_32x; diff --git a/src/mame/sega/megadriv.cpp b/src/mame/sega/megadriv.cpp index e3139b45e61..c012b265dd1 100644 --- a/src/mame/sega/megadriv.cpp +++ b/src/mame/sega/megadriv.cpp @@ -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) diff --git a/src/mame/sega/puckpkmn.cpp b/src/mame/sega/puckpkmn.cpp index ae1ccc04354..b71c7ded2ba 100644 --- a/src/mame/sega/puckpkmn.cpp +++ b/src/mame/sega/puckpkmn.cpp @@ -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, "", "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, "", "Juezhan Tianhuang", MACHINE_IMPERFECT_SOUND )