summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2021-08-15 06:24:09 -0800
committer GitHub <noreply@github.com>2021-08-15 10:24:09 -0400
commitcaf6dd6b24cde2cb8127e19cc2adf52b7f43c841 (patch)
tree7285d3142e604f21370f5cafd9f743013cd71f7a /src/devices/bus
parentee07073837124bf9c10f82db0a96d7479cef8a92 (diff)
bus/nes: Added support of a pair of 4-in-1 multicarts. (#8441)
New working software list additions (nes.xml) ----------------------------------- 4 in 1 (K-3131GS) [anonymous] 4 in 1 (K-3131SS) [anonymous]
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp51
-rw-r--r--src/devices/bus/nes/mmc3_clones.h22
-rw-r--r--src/devices/bus/nes/nes_carts.cpp1
-rw-r--r--src/devices/bus/nes/nes_ines.hxx2
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx1
-rw-r--r--src/devices/bus/nes/nes_slot.h2
6 files changed, 77 insertions, 2 deletions
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 58f06d9309b..45f643d70be 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_HIK8, nes_bmc_hik8_device, "nes_bmc_hik8",
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_GN45, nes_bmc_gn45_device, "nes_bmc_gn45", "NES Cart BMC GN-45 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")
@@ -236,6 +237,11 @@ nes_bmc_f15_device::nes_bmc_f15_device(const machine_config &mconfig, const char
{
}
+nes_bmc_gn45_device::nes_bmc_gn45_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_BMC_GN45, tag, owner, clock), m_lock(false)
+{
+}
+
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)
{
@@ -590,6 +596,20 @@ void nes_bmc_f15_device::pcb_reset()
prg16_cdef(0);
}
+void nes_bmc_gn45_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_lock));
+}
+
+void nes_bmc_gn45_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+
+ m_lock = false;
+ mmc3_common_initialize(0x0f, 0x7f, 0);
+}
+
void nes_bmc_gold7in1_device::device_start()
{
mmc3_start();
@@ -2350,6 +2370,37 @@ void nes_fcgj8in1_device::write_m(offs_t offset, u8 data)
/*-------------------------------------------------
+ BMC-GN-45
+
+ Games: 4 in 1 (K-3131GS and K-3131SS)
+
+ MMC3 clone with banking for multigame menu.
+
+ NES 2.0: mapper 366
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_gn45_device::write_m(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_gn45 write_m, offset: %04x, data: %02x\n", offset, data));
+
+ nes_txrom_device::write_m(offset, data); // write to overlapping WRAM
+
+ if (!m_lock)
+ {
+ m_prg_base = offset & 0x70;
+ 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);
+
+ m_lock = BIT(offset, 7);
+ }
+}
+
+/*-------------------------------------------------
+
BMC-GOLD-7IN1
Known Boards: Unknown Multigame Bootleg Board
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index c44b529dc88..84ca31ccb4e 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -627,6 +627,27 @@ public:
};
+// ======================> nes_bmc_gn45_device
+
+class nes_bmc_gn45_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_gn45_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;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ bool m_lock;
+};
+
+
// ======================> nes_bmc_gold7in1_device
class nes_bmc_gold7in1_device : public nes_txrom_device
@@ -822,6 +843,7 @@ DECLARE_DEVICE_TYPE(NES_BMC_HIK8, nes_bmc_hik8_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_GN45, nes_bmc_gn45_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)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index 52985640cc7..f3b69d7419f 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -429,6 +429,7 @@ void nes_cart(device_slot_interface &device)
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_gn45", NES_BMC_GN45);
device.option_add_internal("bmc_gold7in1", NES_BMC_GOLD7IN1);
device.option_add_internal("bmc_gc6in1", NES_BMC_GC6IN1);
device.option_add_internal("bmc_411120c", NES_BMC_411120C);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 796fd63dd44..4f1fc9c3870 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -401,7 +401,7 @@ static const nes_mmc mmc_list[] =
// 363 variant of mapper 358?
// 364 JY-007, is this ttoons6 in nes.xml?
// 365 is this asderp95 in nes.xml?
- // 366 K-3131GS and K-3131SS 4-in-1 carts
+ { 366, BMC_GN45 },
// 367 7-in-1 cart that is a close variant of mapper 205
{ 368, BTL_YUNG08 }, // SMB2 FDS conversion
// 369 Super Mario Bros Party multicart
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 8ec381a72ad..ae35ffdaafa 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -306,6 +306,7 @@ static const nes_pcb pcb_list[] =
{ "bmc_hik4in1", BMC_SUPERHIK_4IN1 },
{ "bmc_mario7in1", BMC_MARIOPARTY_7IN1 },
{ "bmc_f15", BMC_F15 },
+ { "bmc_gn45", BMC_GN45 },
{ "bmc_gold7in1", BMC_GOLD_7IN1 },
{ "bmc_gc6in1", BMC_GOLDENCARD_6IN1 },
{ "bmc_411120c", BMC_411120C },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index d33b24e78a1..548de0a7aa7 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -86,7 +86,7 @@ enum
TXC_22211, TXC_DUMARACING, TXC_MJBLOCK,
TXC_COMMANDOS, TXC_TW, TXC_STRIKEW,
// Multigame Carts
- BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_F15,
+ BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_F15, BMC_GN45,
BMC_HIK8IN1, BMC_NOVEL1, BMC_NOVEL2, BMC_S24IN1SC03, BMC_T262,
BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1,
BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646,