bus/nes: Updated code and dump for mc_mario. (#9686)

- Switched mc_mario to use BMC-GOLD-7IN1 board and removed emulation for variant BMC-MARIOPARTY-7IN1. Replaced its CHR ROM with bank swapped dump.
- BMC-GOLD-7IN1: Fixed crash when carts with no WRAM are loaded.
This commit is contained in:
0kmg 2022-05-04 12:56:14 -08:00 committed by GitHub
parent 26582b9f1a
commit 9d040f801d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 26 additions and 125 deletions

View File

@ -66990,7 +66990,7 @@ We don't include these hacks because they were not burned into real carts nor so
<rom name="wukong douju.prg" size="262144" crc="8638454c" sha1="3c7c91c552104c9c24153c00fd603c740715ff51" status="baddump" />
</dataarea>
<dataarea name="chr" size="524288">
<rom name="wukong douju.prg" size="524288" crc="72137bc5" sha1="1533ecf77b9bbc6864a2c62b463dfab34e017797" status="baddump" />
<rom name="wukong douju.chr" size="524288" crc="72137bc5" sha1="1533ecf77b9bbc6864a2c62b463dfab34e017797" status="baddump" />
</dataarea>
<!-- 8k VRAM on cartridge? -->
<dataarea name="vram" size="8192">
@ -85638,16 +85638,16 @@ be better to redump them properly. -->
</part>
</software>
<!-- This dump is supposed to be bad: all other carts with the same PCB have switched CHR bank order, redump needed to check why this is different -->
<!-- A dump with swapped 256K CHR pages exists (CRC f1310012). It's not clear if this has been properly redumped to determine which is the correct order. -->
<software name="mc_mario">
<description>Mario 7 in 1 (Bad Dump)</description>
<description>Mario 7 in 1</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_mario7in1" />
<feature name="pcb" value="BMC-MARIOPARTY-7IN1" />
<feature name="slot" value="bmc_gold7in1" />
<feature name="pcb" value="BMC-GOLD-7IN1" />
<dataarea name="chr" size="1048576">
<rom name="mario 7-in-1 [p1].chr" size="1048576" crc="f1310012" sha1="42378af64fc6356ec7d85b6e49b934287d2b6f15" offset="00000" status="baddump" />
<rom name="mario 7-in-1 [p1].chr" size="1048576" crc="29fa219f" sha1="28a77600426a6be233717ec60b84e9eb8a4ba637" offset="00000" status="baddump" />
</dataarea>
<dataarea name="prg" size="1048576">
<rom name="mario 7-in-1 [p1].prg" size="1048576" crc="c021a8b9" sha1="4fe43bef9d9217881b7c8ece0007dc4cd830fbec" offset="00000" status="baddump" />

View File

@ -73,7 +73,6 @@ DEFINE_DEVICE_TYPE(NES_BMC_JY302, nes_bmc_jy302_device, "nes_bmc_jy302",
DEFINE_DEVICE_TYPE(NES_BMC_KC885, nes_bmc_kc885_device, "nes_bmc_kc885", "NES Cart BMC KC885 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_SFC12, nes_bmc_sfc12_device, "nes_bmc_sfc12", "NES Cart BMC SFC-12 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_HIK4, nes_bmc_hik4_device, "nes_bmc_hik4", "NES Cart BMC HIK 4 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_MARIO7IN1, nes_bmc_mario7in1_device, "nes_bmc_mario7in1", "NES Cart BMC Mario 7 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_F15, nes_bmc_f15_device, "nes_bmc_f15", "NES Cart BMC F-15 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_F600, nes_bmc_f600_device, "nes_bmc_f600", "NES Cart BMC F600 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GN45, nes_bmc_gn45_device, "nes_bmc_gn45", "NES Cart BMC GN-45 PCB")
@ -407,11 +406,6 @@ nes_bmc_hik4_device::nes_bmc_hik4_device(const machine_config &mconfig, const ch
{
}
nes_bmc_mario7in1_device::nes_bmc_mario7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_txrom_device(mconfig, NES_BMC_MARIO7IN1, tag, owner, clock), m_reg_written(0)
{
}
nes_bmc_f15_device::nes_bmc_f15_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_BMC_F15, tag, owner, clock)
{
@ -429,8 +423,8 @@ nes_bmc_gn45_device::nes_bmc_gn45_device(const machine_config &mconfig, const ch
{
}
nes_bmc_gold7in1_device::nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_txrom_device(mconfig, NES_BMC_GOLD7IN1, tag, owner, clock), m_reg_written(0)
nes_bmc_gold7in1_device::nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_BMC_GOLD7IN1, tag, owner, clock), m_lock(false)
{
}
@ -899,20 +893,6 @@ void nes_bmc_hik4_device::pcb_reset()
mmc3_common_initialize(0x0f, 0x7f, 0);
}
void nes_bmc_mario7in1_device::device_start()
{
mmc3_start();
save_item(NAME(m_reg_written));
}
void nes_bmc_mario7in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
m_reg_written = 0;
mmc3_common_initialize(0x1f, 0xff, 0);
}
void nes_bmc_f15_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
@ -950,14 +930,12 @@ void nes_bmc_gn45_device::pcb_reset()
void nes_bmc_gold7in1_device::device_start()
{
mmc3_start();
save_item(NAME(m_reg_written));
save_item(NAME(m_lock));
}
void nes_bmc_gold7in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
m_reg_written = 0;
m_lock = false;
mmc3_common_initialize(0x1f, 0xff, 0);
}
@ -2886,47 +2864,6 @@ void nes_bmc_hik4_device::write_m(offs_t offset, u8 data)
}
}
/*-------------------------------------------------
BMC-MARIOPARTY-7IN1
Known Boards: Unknown Multigame Bootleg Board
Games: Mario 7 in 1
MMC3 clone
iNES: mapper 52
In MESS: Supported.
-------------------------------------------------*/
void nes_bmc_mario7in1_device::write_m(offs_t offset, uint8_t data)
{
uint8_t helper1, helper2;
LOG_MMC(("bmc_mario7in1 write_m, offset: %04x, data: %02x\n", offset, data));
/* mid writes only work when WRAM is enabled. not sure if I should
change the condition to m_map52_reg_written == 0x80 (i.e. what is the effect of
the read-only bit?) and it only can happen once! */
if ((m_wram_protect & 0x80) && !m_reg_written)
{
helper1 = (data & 0x08);
helper2 = (data & 0x40);
m_prg_base = helper1 ? ((data & 0x07) << 4) : ((data & 0x06) << 4);
m_prg_mask = helper1 ? 0x0f : 0x1f;
m_chr_base = ((data & 0x20) << 4) | ((data & 0x04) << 6) | (helper2 ? ((data & 0x10) << 3) : 0);
m_chr_mask = helper2 ? 0x7f : 0xff;
set_prg(m_prg_base, m_prg_mask);
set_chr(m_chr_source, m_chr_base, m_chr_mask);
m_reg_written = 1;
}
else
m_prgram[offset] = data;
}
/*-------------------------------------------------
BMC-A88S-1
@ -3152,36 +3089,34 @@ void nes_bmc_gn45_device::write_m(offs_t offset, u8 data)
Known Boards: Unknown Multigame Bootleg Board
Games: Super HIK Gold 7 in 1, Golden 7 in 1 and many more
MMC3 clone, same as BMC-MARIOPARTY-7IN1 but with switched CHR
bank lines
MMC3 clone with banking for multigame menu.
iNES: mapper 52
In MESS: Supported.
In MAME: Supported.
-------------------------------------------------*/
void nes_bmc_gold7in1_device::write_m(offs_t offset, uint8_t data)
void nes_bmc_gold7in1_device::write_m(offs_t offset, u8 data)
{
uint8_t helper1, helper2;
LOG_MMC(("bmc_gold7in1 write_m, offset: %04x, data: %02x\n", offset, data));
if ((m_wram_protect & 0x80) && !m_reg_written)
if ((m_wram_protect & 0xc0) == 0x80 && !m_lock)
{
helper1 = (data & 0x08);
helper2 = (data & 0x40);
u8 prg128k = BIT(data, 3);
u8 chr128k = BIT(data, 6);
m_prg_base = helper1 ? ((data & 0x07) << 4) : ((data & 0x06) << 4);
m_prg_mask = helper1 ? 0x0f : 0x1f;
m_chr_base = ((data & 0x20) << 3) | ((data & 0x04) << 7) | (helper2 ? ((data & 0x10) << 3) : 0);
m_chr_mask = helper2 ? 0x7f : 0xff;
m_prg_base = (data & (0x06 | prg128k)) << 4;
m_prg_mask = 0x1f >> prg128k;
m_chr_base = (bitswap<3>(data, 2, 5, 4) & (0x06 | chr128k)) << 7;
m_chr_mask = 0xff >> chr128k;
set_prg(m_prg_base, m_prg_mask);
set_chr(m_chr_source, m_chr_base, m_chr_mask);
m_reg_written = BIT(data, 7); // mc_2hikg & mc_s3nt3 write here multiple time
m_lock = BIT(data, 7); // mc_2hikg & mc_s3nt3 write here multiple time
}
else
m_prgram[offset] = data;
nes_txrom_device::write_m(offset, data); // write WRAM
}
/*-------------------------------------------------

View File

@ -846,27 +846,6 @@ private:
};
// ======================> nes_bmc_mario7in1_device
class nes_bmc_mario7in1_device : public nes_txrom_device
{
public:
// construction/destruction
nes_bmc_mario7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
virtual void write_m(offs_t offset, uint8_t data) override;
virtual void pcb_reset() override;
protected:
// device-level overrides
virtual void device_start() override;
private:
uint8_t m_reg_written;
};
// ======================> nes_bmc_f15_device
class nes_bmc_f15_device : public nes_txrom_device
@ -936,9 +915,9 @@ class nes_bmc_gold7in1_device : public nes_txrom_device
{
public:
// construction/destruction
nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
nes_bmc_gold7in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_m(offs_t offset, uint8_t data) override;
virtual void write_m(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
@ -947,7 +926,7 @@ protected:
virtual void device_start() override;
private:
uint8_t m_reg_written;
bool m_lock;
};
@ -1266,7 +1245,6 @@ DECLARE_DEVICE_TYPE(NES_BMC_JY302, nes_bmc_jy302_device)
DECLARE_DEVICE_TYPE(NES_BMC_KC885, nes_bmc_kc885_device)
DECLARE_DEVICE_TYPE(NES_BMC_SFC12, nes_bmc_sfc12_device)
DECLARE_DEVICE_TYPE(NES_BMC_HIK4, nes_bmc_hik4_device)
DECLARE_DEVICE_TYPE(NES_BMC_MARIO7IN1, nes_bmc_mario7in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_F15, nes_bmc_f15_device)
DECLARE_DEVICE_TYPE(NES_BMC_F600, nes_bmc_f600_device)
DECLARE_DEVICE_TYPE(NES_BMC_GN45, nes_bmc_gn45_device)

View File

@ -474,7 +474,6 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_kc885", NES_BMC_KC885);
device.option_add_internal("bmc_sfc12", NES_BMC_SFC12);
device.option_add_internal("bmc_hik4in1", NES_BMC_HIK4);
device.option_add_internal("bmc_mario7in1", NES_BMC_MARIO7IN1);
device.option_add_internal("bmc_f15", NES_BMC_F15);
device.option_add_internal("bmc_f600", NES_BMC_F600);
device.option_add_internal("bmc_gn45", NES_BMC_GN45);

View File

@ -1037,11 +1037,6 @@ void nes_cart_slot_device::call_load_ines()
m_pcb_id = WAIXING_DQ8; // Mapper 242 is used for 2 diff boards
break;
case BMC_GOLD_7IN1:
if (crc_hack)
m_pcb_id = BMC_MARIOPARTY_7IN1; // Mapper 52 is used for 2 diff boards
break;
case BTL_MARIOBABY:
if (crc_hack)
m_pcb_id = BTL_AISENSHINICOL; // Mapper 42 is used for 2 diff boards
@ -1328,11 +1323,6 @@ const char * nes_cart_slot_device::get_default_card_ines(get_default_card_softwa
pcb_id = WAIXING_DQ8; // Mapper 242 is used for 2 diff boards
break;
case BMC_GOLD_7IN1:
if (crc_hack)
pcb_id = BMC_MARIOPARTY_7IN1; // Mapper 52 is used for 2 diff boards
break;
case BTL_MARIOBABY:
if (crc_hack)
pcb_id = BTL_AISENSHINICOL; // Mapper 42 is used for 2 diff boards

View File

@ -350,7 +350,6 @@ static const nes_pcb pcb_list[] =
{ "bmc_kc885", BMC_KC885 },
{ "bmc_sfc12", BMC_SFC12 },
{ "bmc_hik4in1", BMC_SUPERHIK_4IN1 },
{ "bmc_mario7in1", BMC_MARIOPARTY_7IN1 },
{ "bmc_f15", BMC_F15 },
{ "bmc_f600", BMC_F600 },
{ "bmc_gn45", BMC_GN45 },

View File

@ -89,7 +89,7 @@ enum
BMC_GN45, BMC_HIK8IN1, BMC_SFC12, BMC_JY208, BMC_JY302, BMC_KC885, BMC_KL06,
BMC_S24IN1SC03, BMC_T262, BMC_TELETUBBIES,
BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1,
BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646,
BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646,
BMC_36IN1, BMC_21IN1, BMC_150IN1, BMC_35IN1, BMC_64IN1,
BMC_8IN1, BMC_15IN1, BMC_SUPERHIK_300IN1, BMC_SUPERGUN_20IN1,
BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1,