diff --git a/hash/nes.xml b/hash/nes.xml
index f524e231deb..9ebea5ef436 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -78391,6 +78391,21 @@ be better to redump them properly. -->
+
+ 21 in 1 (K-3006)
+ 199?
+ <pirate>
+
+
+
+
+
+
+
+
+
+
+
22 in 1 (Reset Based)
19??
@@ -78677,6 +78692,21 @@ be better to redump them properly. -->
+
+ 35 in 1 (K-3036)
+ 19??
+ <pirate>
+
+
+
+
+
+
+
+
+
+
+
36 in 1
19??
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 83454fdd554..4a64325ab41 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -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
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index 3581b6f9105..d1a22b72bc8 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -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)
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index d4233692cf4..ce267154a29 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -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
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index 36738ed01e9..bb8f80642e4 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -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)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index cd57ad448bc..6b972d072ac 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -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);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 01521bd27fc..8530de5f980 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -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?
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 4baf2cb06c1..2e7c5569acc 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -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 },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index dec30523644..3bbe65c2871 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -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,