bus/nes: Added support for 21-in-1 and 35-in-1 multicarts. (#8401)

New working software list additions (nes.xml)
-----------------------------------
21 in 1 (K-3006) [anonymous]
35 in 1 (K-3036) [anonymous]
This commit is contained in:
0kmg 2021-08-08 08:48:40 -08:00 committed by GitHub
parent 50fc3edb0c
commit 3da6dd410f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 152 additions and 3 deletions

View File

@ -78391,6 +78391,21 @@ be better to redump them properly. -->
</part>
</software>
<software name="mc_21k6">
<description>21 in 1 (K-3006)</description>
<year>199?</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_k3006" />
<dataarea name="prg" size="524288">
<rom name="21-in-1 (k-3006).prg" size="524288" crc="0efb3c8f" sha1="079e862ec83fc54d6a99b0dc63d85a15262f3e6b" status="baddump" />
</dataarea>
<dataarea name="chr" size="524288">
<rom name="21-in-1 (k-3006).chr" size="524288" crc="b7833591" sha1="782a8a77afdc15e16663ea5fe984d1776e2e2a2b" status="baddump" />
</dataarea>
</part>
</software>
<software name="mc_22rb" supported="partial">
<description>22 in 1 (Reset Based)</description>
<year>19??</year>
@ -78677,6 +78692,21 @@ be better to redump them properly. -->
</part>
</software>
<software name="mc_35k36">
<description>35 in 1 (K-3036)</description>
<year>19??</year>
<publisher>&lt;pirate&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="bmc_k3036" />
<dataarea name="prg" size="524288">
<rom name="35-in-1 (k-3036).prg" size="524288" crc="df2a71c7" sha1="ff04533c60ad0d2c0005577068b629d90053e1fc" status="baddump" />
</dataarea>
<!-- 8k VRAM on cartridge -->
<dataarea name="vram" size="8192">
</dataarea>
</part>
</software>
<software name="mc_36">
<description>36 in 1</description>
<year>19??</year>

View File

@ -61,6 +61,7 @@ DEFINE_DEVICE_TYPE(NES_BMC_HIK4, nes_bmc_hik4_device, "nes_bmc_hik4",
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_GOLD7IN1, nes_bmc_gold7in1_device, "nes_bmc_gold7in1", "NES Cart BMC Golden 7 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GC6IN1, nes_bmc_gc6in1_device, "nes_bmc_gc6in1", "NES Cart BMC Golden Card 6 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3006, nes_bmc_k3006_device, "nes_bmc_k3006", "NES Cart BMC K-3006 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_411120C, nes_bmc_411120c_device, "nes_bmc_411120c", "NES Cart BMC 411120C PCB")
DEFINE_DEVICE_TYPE(NES_BMC_830118C, nes_bmc_830118c_device, "nes_bmc_830118c", "NES Cart BMC 830118C PCB")
DEFINE_DEVICE_TYPE(NES_BMC_841101C, nes_bmc_841101c_device, "nes_bmc_841101c", "NES Cart BMC 841101C PCB")
@ -233,6 +234,11 @@ nes_bmc_gc6in1_device::nes_bmc_gc6in1_device(const machine_config &mconfig, cons
{
}
nes_bmc_k3006_device::nes_bmc_k3006_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_BMC_K3006, tag, owner, clock)
{
}
nes_bmc_411120c_device::nes_bmc_411120c_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_txrom_device(mconfig, NES_BMC_411120C, tag, owner, clock), m_reg(0)
{
@ -590,6 +596,15 @@ void nes_bmc_gc6in1_device::pcb_reset()
set_chr(m_chr_source, m_chr_base, m_chr_mask);
}
void nes_bmc_k3006_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
mmc3_common_initialize(0x0f, 0x7f, 0);
prg16_89ab(0);
prg16_cdef(0);
chr8(0, m_chr_source);
}
void nes_bmc_411120c_device::device_start()
{
mmc3_start();
@ -2405,6 +2420,42 @@ void nes_bmc_gc6in1_device::write_h(offs_t offset, uint8_t data)
}
}
/*-------------------------------------------------
BMC-K-3006
Games: 21 in 1
MMC3 clone with banking for multigame menu.
NES 2.0: mapper 339
In MAME: Supported.
-------------------------------------------------*/
void nes_bmc_k3006_device::write_m(offs_t offset, u8 data)
{
LOG_MMC(("bmc_k3006 write_m, offset: %04x, data: %02x\n", offset, data));
if ((m_wram_protect & 0xc0) == 0x80)
{
if (BIT(offset, 5)) // MMC3 mode
{
m_prg_base = (offset & 0x18) << 1;
set_prg(m_prg_base, m_prg_mask);
m_chr_base = m_prg_base << 3;
set_chr(m_chr_source, m_chr_base, m_chr_mask);
}
else // NROM mode
{
u8 bank = offset & 0x1f;
u8 mode = (offset & 0x06) == 0x06;
prg16_89ab(bank & ~mode);
prg16_cdef(bank | mode);
}
}
}
/*-------------------------------------------------
BMC-411120C

View File

@ -643,6 +643,20 @@ private:
};
// ======================> nes_bmc_k3006_device
class nes_bmc_k3006_device : public nes_txrom_device
{
public:
// construction/destruction
nes_bmc_k3006_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_m(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
};
// ======================> nes_bmc_411120c_device
class nes_bmc_411120c_device : public nes_txrom_device
@ -780,6 +794,7 @@ 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_GOLD7IN1, nes_bmc_gold7in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_GC6IN1, nes_bmc_gc6in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3006, nes_bmc_k3006_device)
DECLARE_DEVICE_TYPE(NES_BMC_411120C, nes_bmc_411120c_device)
DECLARE_DEVICE_TYPE(NES_BMC_830118C, nes_bmc_830118c_device)
DECLARE_DEVICE_TYPE(NES_BMC_841101C, nes_bmc_841101c_device)

View File

@ -49,6 +49,7 @@ DEFINE_DEVICE_TYPE(NES_BMC_CTC09, nes_bmc_ctc09_device, "nes_bmc_ctc09
DEFINE_DEVICE_TYPE(NES_BMC_GB63, nes_bmc_gb63_device, "nes_bmc_gb63", "NES Cart BMC Ghostbusters 63 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GKA, nes_bmc_gka_device, "nes_bmc_gka", "NES Cart BMC GK-A PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GKB, nes_bmc_gkb_device, "nes_bmc_gkb", "NES Cart BMC GK-B PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3036, nes_bmc_k3036_device, "nes_bmc_k3036", "NES Cart BMC K-3036 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_K3046, nes_bmc_k3046_device, "nes_bmc_k3046", "NES Cart BMC K-3046 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_SA005A, nes_bmc_sa005a_device, "nes_bmc_sa005a", "NES Cart BMC SA005-A PCB")
DEFINE_DEVICE_TYPE(NES_BMC_TJ03, nes_bmc_tj03_device, "nes_bmc_tj03", "NES Cart BMC TJ-03 PCB")
@ -191,6 +192,11 @@ nes_bmc_gkb_device::nes_bmc_gkb_device(const machine_config &mconfig, const char
{
}
nes_bmc_k3036_device::nes_bmc_k3036_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_BMC_K3036, tag, owner, clock)
{
}
nes_bmc_k3046_device::nes_bmc_k3046_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_BMC_K3046, tag, owner, clock)
{
@ -682,6 +688,13 @@ void nes_bmc_gkb_device::pcb_reset()
chr8(0, m_chr_source);
}
void nes_bmc_k3036_device::pcb_reset()
{
prg16_89ab(0);
prg16_cdef(7);
chr8(0, CHRRAM);
}
void nes_bmc_k3046_device::pcb_reset()
{
prg16_89ab(0);
@ -1810,6 +1823,27 @@ void nes_bmc_gkb_device::write_h(offs_t offset, uint8_t data)
set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
/*-------------------------------------------------
BMC-K-3036
Games: 35 in 1
NES 2.0: mapper 340
In MAME: Supported.
-------------------------------------------------*/
void nes_bmc_k3036_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("bmc_k3036 write_h, offset: %04x, data: %02x\n", offset, data));
u8 bank = offset & 0x1f;
prg16_89ab(bank);
prg16_cdef(bank | (BIT(offset, 5) ? 0 : 7));
set_nt_mirroring((offset & 0x25) == 0x25 ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
/*-------------------------------------------------
BMC-K-3046

View File

@ -429,6 +429,20 @@ protected:
};
// ======================> nes_bmc_k3036_device
class nes_bmc_k3036_device : public nes_nrom_device
{
public:
// construction/destruction
nes_bmc_k3036_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
virtual void write_h(offs_t offset, u8 data) override;
virtual void pcb_reset() override;
};
// ======================> nes_bmc_k3046_device
class nes_bmc_k3046_device : public nes_nrom_device
@ -1113,6 +1127,7 @@ DECLARE_DEVICE_TYPE(NES_BMC_CTC09, nes_bmc_ctc09_device)
DECLARE_DEVICE_TYPE(NES_BMC_GB63, nes_bmc_gb63_device)
DECLARE_DEVICE_TYPE(NES_BMC_GKA, nes_bmc_gka_device)
DECLARE_DEVICE_TYPE(NES_BMC_GKB, nes_bmc_gkb_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3036, nes_bmc_k3036_device)
DECLARE_DEVICE_TYPE(NES_BMC_K3046, nes_bmc_k3046_device)
DECLARE_DEVICE_TYPE(NES_BMC_SA005A, nes_bmc_sa005a_device)
DECLARE_DEVICE_TYPE(NES_BMC_TJ03, nes_bmc_tj03_device)

View File

@ -372,6 +372,8 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_gb63", NES_BMC_GB63);
device.option_add_internal("bmc_gka", NES_BMC_GKA);
device.option_add_internal("bmc_gkb", NES_BMC_GKB);
device.option_add_internal("bmc_k3006", NES_BMC_K3006);
device.option_add_internal("bmc_k3036", NES_BMC_K3036);
device.option_add_internal("bmc_k3046", NES_BMC_K3046);
device.option_add_internal("bmc_sa005a", NES_BMC_SA005A);
device.option_add_internal("bmc_tj03", NES_BMC_TJ03);

View File

@ -374,8 +374,8 @@ static const nes_mmc mmc_list[] =
{ 336, BMC_K3046 },
// { 337, BMC_CTC_12IN1 }, not in nes.xml
{ 338, BMC_SA005A },
// 339 BMC-K-3006 21-in-1, not in nes.xml?
// 340 BMC-K-3036 35-in-1, not in nes.xml?
{ 339, BMC_K3006 },
{ 340, BMC_K3036 },
{ 341, BMC_TJ03 },
// 342 COOLGIRL homebrew
// 343 reset-based 4-in-1 pirate?

View File

@ -257,6 +257,8 @@ static const nes_pcb pcb_list[] =
{ "bmc_gb63", BMC_G63IN1 },
{ "bmc_gka", BMC_GKA },
{ "bmc_gkb", BMC_GKB },
{ "bmc_k3006", BMC_K3006 },
{ "bmc_k3036", BMC_K3036 },
{ "bmc_k3046", BMC_K3046 },
{ "bmc_sa005a", BMC_SA005A },
{ "bmc_tj03", BMC_TJ03 },

View File

@ -101,7 +101,7 @@ enum
BMC_2751, BMC_8157, BMC_830118C, BMC_841101C,
BMC_411120C, BMC_GOLD150, BMC_GOLD260, BMC_CH001, BMC_SUPER22,
BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET, BMC_LITTLECOM160,
BMC_CTC09, BMC_K3046, BMC_SA005A, BMC_TJ03,
BMC_CTC09, BMC_K3006, BMC_K3036, BMC_K3046, BMC_SA005A, BMC_TJ03,
// Unlicensed
UNL_8237, UNL_CC21, UNL_AX5705, UNL_KN42, UNL_KOF97,
UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE,