diff options
author | 0kmg <9137159+0kmg@users.noreply.github.com> | 2021-08-06 18:37:51 -0800 |
---|---|---|
committer | 0kmg <9137159+0kmg@users.noreply.github.com> | 2021-08-12 11:11:14 -0800 |
commit | d991edb73b54f333bf6e0cd527af4a1bb8bf5b5b (patch) | |
tree | ec41979605f0321eccc7210d0b653b8bb73f4619 /src/devices/bus | |
parent | 4131373f0a910e30cac4a24ae574b0f2ddb02b45 (diff) |
bus/nes: Added support for 17-in-1 and 6-in-1 multicarts.
New working software list additions (nes.xml)
-----------------------------------
17 in 1 (60311C) [anonymous]
Super HiK 6 in 1 (A-030) [anonymous]
Diffstat (limited to 'src/devices/bus')
-rw-r--r-- | src/devices/bus/nes/multigame.cpp | 115 | ||||
-rw-r--r-- | src/devices/bus/nes/multigame.h | 46 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_carts.cpp | 2 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_ines.hxx | 4 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_pcb.hxx | 2 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.h | 27 |
6 files changed, 181 insertions, 15 deletions
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp index f23db61b64f..e9f5481a6e6 100644 --- a/src/devices/bus/nes/multigame.cpp +++ b/src/devices/bus/nes/multigame.cpp @@ -42,8 +42,10 @@ DEFINE_DEVICE_TYPE(NES_NOVEL2, nes_novel2_device, "nes_novel2", DEFINE_DEVICE_TYPE(NES_STUDYNGAME, nes_studyngame_device, "nes_studyngame", "NES Cart Study n Game PCB") DEFINE_DEVICE_TYPE(NES_SUPERGUN20IN1, nes_sgun20in1_device, "nes_sgun20in1", "NES Cart Supergun 20 in 1 PCB") DEFINE_DEVICE_TYPE(NES_VT5201, nes_vt5201_device, "nes_vt5201", "NES Cart VT5201 PCB") +DEFINE_DEVICE_TYPE(NES_BMC_60311C, nes_bmc_60311c_device, "nes_bmc_60311c", "NES Cart BMC 60311C PCB") DEFINE_DEVICE_TYPE(NES_BMC_80013B, nes_bmc_80013b_device, "nes_bmc_80013b", "NES Cart BMC 80013-B PCB") DEFINE_DEVICE_TYPE(NES_BMC_810544C, nes_bmc_810544c_device, "nes_bmc_810544c", "NES Cart BMC 810544-C-A1 PCB") +DEFINE_DEVICE_TYPE(NES_BMC_830425C, nes_bmc_830425c_device, "nes_bmc_830425c", "NES Cart BMC 830425C-4391T 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") @@ -200,6 +202,11 @@ nes_bmc_810544c_device::nes_bmc_810544c_device(const machine_config &mconfig, co { } +nes_bmc_830425c_device::nes_bmc_830425c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_nrom_device(mconfig, NES_BMC_830425C, tag, owner, clock), m_latch(0) +{ +} + nes_ntd03_device::nes_ntd03_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : nes_nrom_device(mconfig, NES_NTD03, tag, owner, clock) { @@ -402,6 +409,11 @@ nes_vram_protect_device::nes_vram_protect_device(const machine_config &mconfig, { } +nes_bmc_60311c_device::nes_bmc_60311c_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_vram_protect_device(mconfig, NES_BMC_60311C, tag, owner, clock) +{ +} + nes_bmc_th22913_device::nes_bmc_th22913_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) : nes_vram_protect_device(mconfig, NES_BMC_TH22913, tag, owner, clock) { @@ -640,6 +652,22 @@ void nes_bmc_810544c_device::pcb_reset() chr8(0, CHRROM); } +void nes_bmc_830425c_device::device_start() +{ + common_start(); + save_item(NAME(m_latch)); +} + +void nes_bmc_830425c_device::pcb_reset() +{ + prg16_89ab(0); + prg16_cdef(0x0f); + chr8(0, CHRRAM); + set_nt_mirroring(PPU_MIRROR_VERT); + + m_latch = 0; +} + void nes_ntd03_device::device_start() { common_start(); @@ -1118,6 +1146,20 @@ void nes_vram_protect_device::pcb_reset() m_vram_protect = false; } +void nes_bmc_60311c_device::device_start() +{ + nes_vram_protect_device::device_start(); + save_item(NAME(m_reg)); +} + +void nes_bmc_60311c_device::pcb_reset() +{ + nes_vram_protect_device::pcb_reset(); + + m_reg[0] = m_reg[1] = m_reg[2] = 0; + update_banks(); +} + void nes_bmc_th22913_device::pcb_reset() { nes_vram_protect_device::pcb_reset(); @@ -1655,6 +1697,32 @@ void nes_bmc_810544c_device::write_h(offs_t offset, u8 data) chr8(offset & 0x0f, CHRROM); } + +/*------------------------------------------------- + + BMC-820425C-4391T + + Games: Super HiK 6-in-1 (A-030) + + NES 2.0: mapper 320 + + In MAME: Supported. + + -------------------------------------------------*/ + +void nes_bmc_830425c_device::write_h(offs_t offset, u8 data) +{ + LOG_MMC(("bmc_830425c write_h, offset: %04x, data: %02x\n", offset, data)); + + if ((offset & 0x7fe0) == 0x70e0) + m_latch = offset & 0x1f; + + u8 outer = (m_latch & 0x0f) << 3; + u8 mode = !BIT(m_latch, 4) << 3 | 0x07; + prg16_89ab(outer | (data & mode)); + prg16_cdef(outer | mode); +} + /*------------------------------------------------- BMC-NTD-03 @@ -2928,6 +2996,53 @@ void nes_bmc_lc160_device::write_h(offs_t offset, u8 data) /*------------------------------------------------- + BMC-60311C + + Games: 17 in 1 + + NES 2.0: mapper 289 + + In MAME: Preliminary supported. + + TODO: All the Capcom games and Konami's Hyper Soccer + sound horrible here. BTANB? Also Journey to the West + doesn't work as an individual rom (jwest) or here. + + -------------------------------------------------*/ + +void nes_bmc_60311c_device::update_banks() +{ + if (BIT(m_reg[0], 1)) // UNROM mode + { + prg16_89ab((m_reg[1] & ~0x07) | (BIT(m_reg[0], 0) ? 0x07 : m_reg[2])); + prg16_cdef(m_reg[1] | 0x07); + } + else // NROM mode + { + prg16_89ab(m_reg[1] & ~BIT(m_reg[0], 0)); + prg16_cdef(m_reg[1] | BIT(m_reg[0], 0)); + } + + m_vram_protect = BIT(m_reg[0], 2); + set_nt_mirroring(BIT(m_reg[0], 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT); +} + +void nes_bmc_60311c_device::write_m(offs_t offset, u8 data) +{ + LOG_MMC(("bmc_60311c write_m, offset: %04x, data: %02x\n", offset, data)); + m_reg[offset & 1] = data & 0x7f; + update_banks(); +} + +void nes_bmc_60311c_device::write_h(offs_t offset, u8 data) +{ + LOG_MMC(("bmc_60311c write_h, offset: %04x, data: %02x\n", offset, data)); + m_reg[2] = data & 0x07; + update_banks(); +} + +/*------------------------------------------------- + BMC-TH2291-3, BMC-CH-011 Games: Powerful 250 in 1, Powerful 255 in 1 diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h index 8add9505737..78fb551d36f 100644 --- a/src/devices/bus/nes/multigame.h +++ b/src/devices/bus/nes/multigame.h @@ -343,6 +343,27 @@ protected: }; +// ======================> nes_bmc_830425c_device + +class nes_bmc_830425c_device : public nes_nrom_device +{ +public: + // construction/destruction + nes_bmc_830425c_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; + +protected: + // device-level overrides + virtual void device_start() override; + +private: + u8 m_latch; +}; + + // ======================> nes_ntd03_device class nes_ntd03_device : public nes_nrom_device @@ -1078,6 +1099,29 @@ protected: }; +// ======================> nes_bmc_60311c_device + +class nes_bmc_60311c_device : public nes_vram_protect_device +{ +public: + // construction/destruction + nes_bmc_60311c_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 write_h(offs_t offset, u8 data) override; + + virtual void pcb_reset() override; + +protected: + // device-level overrides + virtual void device_start() override; + +private: + void update_banks(); + u8 m_reg[3]; +}; + + // ======================> nes_bmc_th22913_device class nes_bmc_th22913_device : public nes_vram_protect_device @@ -1107,8 +1151,10 @@ DECLARE_DEVICE_TYPE(NES_NOVEL2, nes_novel2_device) DECLARE_DEVICE_TYPE(NES_STUDYNGAME, nes_studyngame_device) DECLARE_DEVICE_TYPE(NES_SUPERGUN20IN1, nes_sgun20in1_device) DECLARE_DEVICE_TYPE(NES_VT5201, nes_vt5201_device) +DECLARE_DEVICE_TYPE(NES_BMC_60311C, nes_bmc_60311c_device) DECLARE_DEVICE_TYPE(NES_BMC_80013B, nes_bmc_80013b_device) DECLARE_DEVICE_TYPE(NES_BMC_810544C, nes_bmc_810544c_device) +DECLARE_DEVICE_TYPE(NES_BMC_830425C, nes_bmc_830425c_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) diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp index b9e124f470f..e3d2fcc3e72 100644 --- a/src/devices/bus/nes/nes_carts.cpp +++ b/src/devices/bus/nes/nes_carts.cpp @@ -368,8 +368,10 @@ void nes_cart(device_slot_interface &device) device.option_add_internal("sgun20in1", NES_SUPERGUN20IN1); device.option_add_internal("bmc_vt5201", NES_VT5201); // mapper 59? device.option_add_internal("bmc_d1038", NES_VT5201); // mapper 59? + device.option_add_internal("bmc_60311c", NES_BMC_60311C); device.option_add_internal("bmc_80013b", NES_BMC_80013B); device.option_add_internal("bmc_810544c", NES_BMC_810544C); + device.option_add_internal("bmc_830425c", NES_BMC_830425C); 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); diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx index d6bc4203233..056be6f808a 100644 --- a/src/devices/bus/nes/nes_ines.hxx +++ b/src/devices/bus/nes/nes_ines.hxx @@ -324,7 +324,7 @@ static const nes_mmc mmc_list[] = { 286, BMC_BENSHIENG }, { 287, BMC_411120C }, // 288 GKCX1 21 in 1 multicarts, not in nes.xml? - // { 289, BMC_60311C }, not in nes.xml? + { 289, BMC_60311C }, { 290, BMC_NTD_03 }, // 291 Kasheng 2-in-1 multicarts not yet in nes.xml? // { 292, UNL_DRAGONFIGHTER }, in nes.xml, not emulated yet @@ -355,7 +355,7 @@ static const nes_mmc mmc_list[] = // 317 Unused // 318 Unused // 319 HP-898F (has different bank order than UNIF!) and KD-7/9-E boards - // 320 BMC-830425C-4391T, not in nes.xml? + { 320, BMC_830425C }, // 321 duplicate of 287? // 322 BMC-K-3033 35-in-1, related to mc_35? // 323 Farid SLROM homebrew 8-in-1 diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx index 5aa7b84315c..7b9cab3a353 100644 --- a/src/devices/bus/nes/nes_pcb.hxx +++ b/src/devices/bus/nes/nes_pcb.hxx @@ -253,8 +253,10 @@ static const nes_pcb pcb_list[] = { "sgun20in1", BMC_SUPERGUN_20IN1 }, { "bmc_vt5201", BMC_VT5201 }, // mapper 59? { "bmc_d1038", BMC_VT5201 }, // mapper 59? + { "bmc_60311c", BMC_60311C }, { "bmc_80013b", BMC_80013B }, { "bmc_810544c", BMC_810544C }, + { "bmc_830425c", BMC_830425C }, { "ntd03", BMC_NTD_03 }, { "bmc_ctc09", BMC_CTC09 }, { "bmc_gb63", BMC_G63IN1 }, diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h index 58874cf2464..c3abf5fe199 100644 --- a/src/devices/bus/nes/nes_slot.h +++ b/src/devices/bus/nes/nes_slot.h @@ -15,7 +15,7 @@ // uncomment this for *very* verbose logging of most cart accesses //#define NES_PCB_DEBUG -/* Boards */ +// Boards enum { STD_NROM = 0, @@ -30,38 +30,38 @@ enum STD_SXROM_A, STD_SOROM, STD_SOROM_A, STD_DISKSYS, STD_NROM368,//homebrew extension of NROM! - /* Discrete components boards (by various manufacturer) */ + // Discrete components boards (by various manufacturer) DIS_74X161X138, DIS_74X139X74, DIS_74X377, DIS_74X161X161X32, - /* Active Enterprises */ + // Active Enterprises ACTENT_ACT52, - /* AGCI */ + // AGCI AGCI_50282, - /* AVE */ + // AVE AVE_NINA01, AVE_NINA06, AVE_MAXI15, - /* Bandai */ + // Bandai BANDAI_FJUMP2, BANDAI_PT554, BANDAI_DATACH, BANDAI_KARAOKE, BANDAI_OEKAKIDS, BANDAI_FCG, BANDAI_LZ93, BANDAI_LZ93EX1, BANDAI_LZ93EX2, // Caltron CALTRON_6IN1, CALTRON_9IN1, - /* Camerica */ + // Camerica CAMERICA_BF9093, CAMERICA_BF9096, CAMERICA_ALADDIN, CAMERICA_GOLDENFIVE, GG_NROM, - /* Dreamtech */ + // Dreamtech DREAMTECH_BOARD, - /* Irem */ + // Irem IREM_G101, IREM_H3001, IREM_LROG017, IREM_TAM_S1, IREM_HOLYDIVR, - /* Jaleco */ + // Jaleco JALECO_SS88006, JALECO_JF11, JALECO_JF13, JALECO_JF16, JALECO_JF17, JALECO_JF17_ADPCM, JALECO_JF19, JALECO_JF19_ADPCM, JALECO_JF23, JALECO_JF24, JALECO_JF29, JALECO_JF33, - /* Konami */ + // Konami KONAMI_VRC1, KONAMI_VRC2, KONAMI_VRC3, KONAMI_VRC4, KONAMI_VRC6, KONAMI_VRC7, - /* Namcot */ + // Namcot NAMCOT_163, NAMCOT_175, NAMCOT_340, NAMCOT_3425, NAMCOT_34X3, NAMCOT_3446, // NTDEC @@ -95,7 +95,8 @@ enum BMC_GOLDENCARD_6IN1, BMC_72IN1, BMC_SUPER_42IN1, BMC_76IN1, BMC_31IN1, BMC_22GAMES, BMC_20IN1, BMC_110IN1, BMC_70IN1, BMC_800IN1, BMC_1200IN1, - BMC_GKA, BMC_GKB, BMC_VT5201, BMC_BENSHIENG, BMC_80013B, BMC_810544C, + BMC_GKA, BMC_GKB, BMC_VT5201, BMC_BENSHIENG, + BMC_60311C, BMC_80013B, BMC_810544C, BMC_830425C, BMC_NTD_03, BMC_G63IN1, BMC_FCGENJIN_8IN1, BMC_FK23C, BMC_FK23CA, BMC_PJOY84, BMC_TH22913, BMC_11160, BMC_G146, BMC_2751, BMC_8157, BMC_830118C, BMC_841101C, |