diff options
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 |
commit | 42c4027313b2ebe603eb5097b501e6b3ca19f0b4 (patch) | |
tree | 83eff4264671bacbf66590e0bc6c9eb7a661c56e | |
parent | 3cd59927456a5c958e1eb6506029a46c63b31a15 (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.xml | 61 | ||||
-rw-r--r-- | src/devices/bus/nes/multigame.cpp | 145 | ||||
-rw-r--r-- | src/devices/bus/nes/multigame.h | 59 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_carts.cpp | 4 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_ines.hxx | 12 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_pcb.hxx | 4 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.h | 5 |
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><pirate></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><pirate></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><pirate></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><pirate></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, |