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,