summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2021-07-24 07:20:34 -0800
committer GitHub <noreply@github.com>2021-07-25 01:20:34 +1000
commit42c4027313b2ebe603eb5097b501e6b3ca19f0b4 (patch)
tree83eff4264671bacbf66590e0bc6c9eb7a661c56e
parent3cd59927456a5c958e1eb6506029a46c63b31a15 (diff)
bus/nes: Added support for 4 multicarts. (#8344)
New working software list additions (nes.xml) ----------------------------------- 10 in 1 (CTC-09) [anonymous] 11 in 1 (K-3046) [anonymous] 16 in 1 (SA005-A) [anonymous] 4 in 1 (TJ-03) [anonymous]
-rw-r--r--hash/nes.xml61
-rw-r--r--src/devices/bus/nes/multigame.cpp145
-rw-r--r--src/devices/bus/nes/multigame.h59
-rw-r--r--src/devices/bus/nes/nes_carts.cpp4
-rw-r--r--src/devices/bus/nes/nes_ines.hxx12
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx4
-rw-r--r--src/devices/bus/nes/nes_slot.h5
7 files changed, 282 insertions, 8 deletions
diff --git a/hash/nes.xml b/hash/nes.xml
index dac26f6bc63..b05272b7c8e 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -77377,6 +77377,21 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_10c09">
+ <description>10 in 1 (CTC-09)</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_ctc09" />
+ <dataarea name="prg" size="262144">
+ <rom name="10-in-1 (ctc-09)(unl).prg" size="262144" crc="bc585bd0" sha1="22f208ffefe9b0e6675e605a55ed12542ca1b7c9" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="131072">
+ <rom name="10-in-1 (ctc-09)(unl).chr" size="131072" crc="f9242c9d" sha1="c838cd75a1bc62ca93cf0dd69bad5246962ada1d" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_10m">
<description>10000000 in 1</description>
<year>19??</year>
@@ -77447,6 +77462,22 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_11k46">
+ <description>11 in 1 (K-3046)</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_k3046" />
+ <feature name="mirroring" value="vertical" />
+ <dataarea name="prg" size="524288">
+ <rom name="11-in-1 (k-3046)(unl).prg" size="524288" crc="d330cd7e" sha1="100553175ed21bb30db95377caeb9314dee5b6f7" status="baddump" />
+ </dataarea>
+ <!-- 8k VRAM on cartridge -->
+ <dataarea name="vram" size="8192">
+ </dataarea>
+ </part>
+ </software>
+
<!-- According to Cah4e3 this dumps has corrupted chunks of PRG. Investigate... -->
<software name="mc_110a" cloneof="mc_110">
<description>110 in 1 (Bad?)</description>
@@ -77810,6 +77841,21 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_16sa5">
+ <description>16 in 1 (SA005-A)</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_sa005a" />
+ <dataarea name="prg" size="262144">
+ <rom name="16-in-1 (sa005-a)(unl).prg" size="262144" crc="cd0afbe2" sha1="3a4d033fb4bfbd13699e4bae6633e70a5c2b5ba9" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="131072">
+ <rom name="16-in-1 (sa005-a)(unl).chr" size="131072" crc="cd62b4f9" sha1="b0bc49645dbd0e1dd22bc74a21327437d5f500d8" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_168">
<description>168 in 1</description>
<year>19??</year>
@@ -78895,6 +78941,21 @@ be better to redump them properly. -->
</part>
</software>
+ <software name="mc_4tj03">
+ <description>4 in 1 (TJ-03)</description>
+ <year>19??</year>
+ <publisher>&lt;pirate&gt;</publisher>
+ <part name="cart" interface="nes_cart">
+ <feature name="slot" value="bmc_tj03" />
+ <dataarea name="prg" size="131072">
+ <rom name="4-in-1 (tj-03)(unl).prg" size="131072" crc="09f4de0b" sha1="06bf299ce068166ab0f6041a1625bf96f1cc9f2d" status="baddump" />
+ </dataarea>
+ <dataarea name="chr" size="32768">
+ <rom name="4-in-1 (tj-03)(unl).chr" size="32768" crc="c0b5369f" sha1="f90eb3125ec73d0f65d0257792f51815d7339252" status="baddump" />
+ </dataarea>
+ </part>
+ </software>
+
<software name="mc_4vt87" supported="no">
<description>4 in 1 (VT087)</description>
<year>19??</year>
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index c368e0a2cc2..7570138e09f 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -42,9 +42,13 @@ DEFINE_DEVICE_TYPE(NES_SUPERGUN20IN1, nes_sgun20in1_device, "nes_sgun20in1
DEFINE_DEVICE_TYPE(NES_VT5201, nes_vt5201_device, "nes_vt5201", "NES Cart VT5201 PCB")
DEFINE_DEVICE_TYPE(NES_810544C, nes_810544c_device, "nes_810544c", "NES Cart 810544-C-A1 PCB")
DEFINE_DEVICE_TYPE(NES_NTD03, nes_ntd03_device, "nes_ntd03", "NES Cart NTD-03 PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_CTC09, nes_bmc_ctc09_device, "nes_bmc_ctc09", "NES Cart BMC CTC-09 PCB")
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_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")
DEFINE_DEVICE_TYPE(NES_BMC_WS, nes_bmc_ws_device, "nes_bmc_ws", "NES Cart BMC WS PCB")
DEFINE_DEVICE_TYPE(NES_BMC_11160, nes_bmc_11160_device, "nes_bmc_1160", "NES Cart BMC-1160 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_G146, nes_bmc_g146_device, "nes_bmc_g146", "NES Cart BMC-G-146 PCB")
@@ -147,6 +151,11 @@ nes_ntd03_device::nes_ntd03_device(const machine_config &mconfig, const char *ta
{
}
+nes_bmc_ctc09_device::nes_bmc_ctc09_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_CTC09, tag, owner, clock)
+{
+}
+
nes_bmc_gb63_device::nes_bmc_gb63_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_BMC_GB63, tag, owner, clock), m_latch(0), m_dipsetting(0), m_vram_disable(0)
{
@@ -162,6 +171,21 @@ nes_bmc_gkb_device::nes_bmc_gkb_device(const machine_config &mconfig, const char
{
}
+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)
+{
+}
+
+nes_bmc_sa005a_device::nes_bmc_sa005a_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_SA005A, tag, owner, clock)
+{
+}
+
+nes_bmc_tj03_device::nes_bmc_tj03_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_TJ03, tag, owner, clock)
+{
+}
+
nes_bmc_ws_device::nes_bmc_ws_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_BMC_WS, tag, owner, clock), m_latch(0)
{
@@ -519,6 +543,14 @@ void nes_ntd03_device::pcb_reset()
chr8(0, m_chr_source);
}
+void nes_bmc_ctc09_device::pcb_reset()
+{
+// nes_slot's pcb_start sets us up in the main menu. Soft reset is empty so
+// that games reset to their own title screens. This seems to be this cart's
+// intended behavior as trying to reset to the menu here crashes (due to RAM
+// contents?). Soft reset can similarly crash the main menu (BTANB?).
+}
+
void nes_bmc_gb63_device::device_start()
{
common_start();
@@ -572,6 +604,20 @@ void nes_bmc_gkb_device::pcb_reset()
chr8(0, m_chr_source);
}
+void nes_bmc_k3046_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(7);
+ chr8(0, CHRRAM);
+}
+
+void nes_bmc_sa005a_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(0);
+ chr8(0, CHRROM);
+}
+
void nes_bmc_ws_device::device_start()
{
common_start();
@@ -1425,6 +1471,38 @@ void nes_ntd03_device::write_h(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-CTC-09
+
+ Games: 10 in 1
+
+ NES 2.0: mapper 335
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_ctc09_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_ctc09 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ if (BIT(offset, 14))
+ {
+ if (BIT(data, 4))
+ {
+ u8 bank = ((data & 0x07) << 1) | BIT(data, 3);
+ prg16_89ab(bank);
+ prg16_cdef(bank);
+ }
+ else
+ prg32(data & 0x07);
+ set_nt_mirroring(BIT(data, 5) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+ }
+ else
+ chr8(data & 0x0f, CHRROM);
+}
+
+/*-------------------------------------------------
+
BMC-GHOSTBUSTERS63IN1
in MESS: only preliminar support
@@ -1539,6 +1617,73 @@ void nes_bmc_gkb_device::write_h(offs_t offset, uint8_t data)
/*-------------------------------------------------
+ BMC-K-3046
+
+ Games: 11 in 1
+
+ NES 2.0: mapper 336
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_k3046_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_k3046 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ // this pcb is subject to bus conflict
+ data = account_bus_conflict(offset, data);
+
+ data &= 0x1f;
+ prg16_89ab(data);
+ prg16_cdef(data | 0x07);
+}
+
+/*-------------------------------------------------
+
+ BMC-SA005-A
+
+ Games: 16 in 1
+
+ NES 2.0: mapper 338
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_sa005a_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_sa005a write_h, offset: %04x, data: %02x\n", offset, data));
+ u8 bank = offset & 0x0f;
+ prg16_89ab(bank);
+ prg16_cdef(bank);
+ chr8(bank, CHRROM);
+ set_nt_mirroring(BIT(offset, 3) ? PPU_MIRROR_VERT : PPU_MIRROR_HORZ);
+}
+
+/*-------------------------------------------------
+
+ BMC-TJ-03
+
+ Games: 4 in 1
+
+ NES 2.0: mapper 341
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_tj03_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc_tj03 write_h, offset: %04x, data: %02x\n", offset, data));
+ u8 bank = (offset >> 8) & 0x03;
+ prg32(bank);
+ chr8(bank, CHRROM);
+ set_nt_mirroring(BIT(offset, 9) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
+}
+
+/*-------------------------------------------------
+
Board BMC-WS
Games: Super 40-in-1
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index 0192e6bdfc1..fe4c7543eb1 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -285,6 +285,20 @@ protected:
};
+// ======================> nes_bmc_ctc09_device
+
+class nes_bmc_ctc09_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_ctc09_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_gb63_device
class nes_bmc_gb63_device : public nes_nrom_device
@@ -310,6 +324,7 @@ private:
int m_vram_disable;
};
+
// ======================> nes_bmc_gka_device
class nes_bmc_gka_device : public nes_nrom_device
@@ -349,6 +364,46 @@ protected:
};
+// ======================> nes_bmc_k3046_device
+
+class nes_bmc_k3046_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_k3046_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_sa005a_device
+
+class nes_bmc_sa005a_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_sa005a_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_tj03_device
+
+class nes_bmc_tj03_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_tj03_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+};
+
+
// ======================> nes_bmc_ws_device
class nes_bmc_ws_device : public nes_nrom_device
@@ -951,9 +1006,13 @@ DECLARE_DEVICE_TYPE(NES_SUPERGUN20IN1, nes_sgun20in1_device)
DECLARE_DEVICE_TYPE(NES_VT5201, nes_vt5201_device)
DECLARE_DEVICE_TYPE(NES_810544C, nes_810544c_device)
DECLARE_DEVICE_TYPE(NES_NTD03, nes_ntd03_device)
+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_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)
DECLARE_DEVICE_TYPE(NES_BMC_WS, nes_bmc_ws_device)
DECLARE_DEVICE_TYPE(NES_BMC_11160, nes_bmc_11160_device)
DECLARE_DEVICE_TYPE(NES_BMC_G146, nes_bmc_g146_device)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index 72645409d52..68e334d16bc 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -362,9 +362,13 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_d1038", NES_VT5201); // mapper 60?
device.option_add_internal("810544c", NES_810544C);
device.option_add_internal("ntd03", NES_NTD03);
+ device.option_add_internal("bmc_ctc09", NES_BMC_CTC09);
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_k3046", NES_BMC_K3046);
+ device.option_add_internal("bmc_sa005a", NES_BMC_SA005A);
+ device.option_add_internal("bmc_tj03", NES_BMC_TJ03);
device.option_add_internal("bmc_ws", NES_BMC_WS);
device.option_add_internal("bmc_g146", NES_BMC_G146);
device.option_add_internal("bmc_11160", NES_BMC_11160);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index d7f8abb0bc7..9eb8e6e441d 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -369,13 +369,13 @@ static const nes_mmc mmc_list[] =
{ 332, BMC_WS },
// 333 BMC_8IN1 and BMC-NEWSTAR-GRM070-8IN1 multicarts
// 334 5/20-in-1 1993 Copyright multicart, not in nes.xml?
- // 335 BMC-CTC-09 10-in-1, not in nes.xml?
- // 336 BMC-K-3046 11-in-1, not in nes.xml?
- // 337 BMC-CTC-12IN1 multicart, not in nes.xml?
- // 338 BMC-SA005-A multicarts, not in nes.xml?
+ { 335, BMC_CTC09 },
+ { 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?
- // 341 BMC-TJ-03 4-in-1, not in nes.xml?
+ { 341, BMC_TJ03 },
// 342 COOLGIRL homebrew
// 343 reset-based 4-in-1 pirate?
// 344 3/6-in-1 GN-26 multicart, not in nes.xml
@@ -384,7 +384,7 @@ static const nes_mmc mmc_list[] =
{ 347, KAISER_KS7030 }, // Doki Doki Panic alt FDS conversion
{ 348, BMC_830118C },
{ 349, BMC_G146 },
- // 350 BMC-891227 multicart
+ // { 350, BMC_891227 }, not in nes.xml
// 351 JY/Techline 9-in-1
// 352 Kaiser 4-in-1 KS106C
// 353 Super Mario Family multicart
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index a2ad31b2118..1f98df8f757 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -248,9 +248,13 @@ static const nes_pcb pcb_list[] =
{ "bmc_d1038", BMC_VT5201 }, // mapper 60?
{ "810544c", BMC_810544 },
{ "ntd03", BMC_NTD_03 },
+ { "bmc_ctc09", BMC_CTC09 },
{ "bmc_gb63", BMC_G63IN1 },
{ "bmc_gka", BMC_GKA },
{ "bmc_gkb", BMC_GKB },
+ { "bmc_k3046", BMC_K3046 },
+ { "bmc_sa005a", BMC_SA005A },
+ { "bmc_tj03", BMC_TJ03 },
{ "bmc_ws", BMC_WS },
{ "bmc_hik300", BMC_SUPERHIK_300IN1 },
{ "bmc_s700", BMC_SUPER_700IN1 },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index a2ce8b2da4e..b8734c7ace4 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -85,7 +85,7 @@ enum
/* TXC */
TXC_22211, TXC_DUMARACING, TXC_MJBLOCK,
TXC_COMMANDOS, TXC_TW, TXC_STRIKEW,
- /* Multigame Carts */
+ // Multigame Carts
BMC_64IN1NR, BMC_190IN1, BMC_A65AS,
BMC_HIK8IN1, BMC_NOVEL1, BMC_NOVEL2, BMC_S24IN1SC03, BMC_T262,
BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1,
@@ -100,7 +100,8 @@ enum
BMC_POWERFUL_255, BMC_11160, BMC_G146, BMC_8157, BMC_830118C,
BMC_411120C, BMC_GOLD150, BMC_GOLD260, BMC_CH001, BMC_SUPER22,
BMC_12IN1, BMC_4IN1RESET, BMC_42IN1RESET,
- /* Unlicensed */
+ BMC_CTC09, BMC_K3046, BMC_SA005A, BMC_TJ03,
+ // Unlicensed
UNL_8237, UNL_CC21, UNL_AX5705, UNL_KOF97,
UNL_N625092, UNL_SC127, UNL_SMB2J, UNL_T230, UNL_MMALEE,
UNL_UXROM, UNL_MK2, UNL_XIAOZY, UNL_KOF96, UNL_FS6,