From 3561f3ac7bc3803a309b6d2e599f92a149e8243e Mon Sep 17 00:00:00 2001 From: 0kmg <9137159+0kmg@users.noreply.github.com> Date: Sat, 23 Oct 2021 03:31:27 -0800 Subject: bus/nes: Work on HIK8IN1 multicarts and variant boards. (#8740) * bus/nes: Work on HIK8IN1 multicarts and variant boards. - Fixed lock bit check on HIK8IN1 (it was effectively always unlocked). Also added high order PRG banking bits. Combined this fixes loading of broken menu items across various carts. - Added two minor variant boards SFC-12 and unknown board for JY-208. - Merged split PRG and CHR for set mc_101 into one large PRG ROM. New working software list additions (nes.xml) ----------------------------------- Rockman 6 in 1 (alt 2) [famiac, NewRisingSun] Rockman 7 in 1 (JY-208) [krzysiobal, NewRisingSun] New NOT_WORKING software list additions (nes.xml) --------------------------------------- Rockman 6 in 1 (alt) [famiac, NewRisingSun] --- hash/nes.xml | 89 ++++++++++++++++++++++---- src/devices/bus/nes/mmc3_clones.cpp | 120 +++++++++++++++++++++++++++--------- src/devices/bus/nes/mmc3_clones.h | 42 +++++++++++-- src/devices/bus/nes/nes_carts.cpp | 2 + src/devices/bus/nes/nes_ines.hxx | 4 +- src/devices/bus/nes/nes_pcb.hxx | 2 + src/devices/bus/nes/nes_slot.h | 3 +- 7 files changed, 214 insertions(+), 48 deletions(-) diff --git a/hash/nes.xml b/hash/nes.xml index cc096474676..7720e769665 100644 --- a/hash/nes.xml +++ b/hash/nes.xml @@ -52437,6 +52437,25 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx + + Rockman 7 in 1 (JY-208) + 199? + J.Y. Company + + + + + + + + + + + + + + + @@ -66955,6 +66974,44 @@ All musics were removed in this game. + + Rockman 6 in 1 (alt) + 19?? + <unknown> + + + + + + + + + + + + + + + + + Rockman 6 in 1 (alt 2) + 19?? + <unknown> + + + + + + + + + + + + + + + San Guo Zhi 4 - Chi Bi Feng Yun (Chi) 1995 @@ -78693,18 +78750,19 @@ be better to redump them properly. --> - + + 101 in 1 Games 19?? <unknown> - - + + - - + + @@ -82486,8 +82544,7 @@ be better to redump them properly. --> - - + Famicom Yarou Vol.1 - 7 in 1 19?? <pirate> @@ -83180,7 +83237,7 @@ be better to redump them properly. --> - + Super 4 in 1 19?? <pirate> @@ -83260,7 +83317,7 @@ be better to redump them properly. --> - + Super 7 in 1 19?? @@ -83293,7 +83350,8 @@ be better to redump them properly. --> - + + Super HIK 8 in 1 King Fighter 19?? <unknown> @@ -83326,7 +83384,7 @@ be better to redump them properly. --> - + Super 8 in 1 19?? <pirate> @@ -83339,6 +83397,9 @@ be better to redump them properly. --> + + + @@ -83502,7 +83563,8 @@ be better to redump them properly. --> - + + Super HIK 7 in 1 (K7006) 19?? <pirate> @@ -83552,7 +83614,8 @@ be better to redump them properly. --> - + + Super TV Game 3 in 1 (VT-414 PCB) 19?? <unknown> diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp index 64da711a032..5bf01d9f6a8 100644 --- a/src/devices/bus/nes/mmc3_clones.cpp +++ b/src/devices/bus/nes/mmc3_clones.cpp @@ -65,6 +65,8 @@ DEFINE_DEVICE_TYPE(NES_BMC_8IN1, nes_bmc_8in1_device, "nes_bmc_8in1", DEFINE_DEVICE_TYPE(NES_BMC_15IN1, nes_bmc_15in1_device, "nes_bmc_15in1", "NES Cart BMC 15 in 1 PCB") DEFINE_DEVICE_TYPE(NES_BMC_SBIG7, nes_bmc_sbig7_device, "nes_bmc_sbig7", "NES Cart BMC Super BIG 7 in 1 PCB") DEFINE_DEVICE_TYPE(NES_BMC_HIK8, nes_bmc_hik8_device, "nes_bmc_hik8", "NES Cart BMC HIK 8 in 1 PCB") +DEFINE_DEVICE_TYPE(NES_BMC_JY208, nes_bmc_jy208_device, "nes_bmc_jy208", "NES Cart BMC JY-208 PCB") +DEFINE_DEVICE_TYPE(NES_BMC_SFC12, nes_bmc_sfc12_device, "nes_bmc_sfc12", "NES Cart BMC SFC-12 PCB") 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") @@ -318,8 +320,23 @@ nes_bmc_sbig7_device::nes_bmc_sbig7_device(const machine_config &mconfig, const { } -nes_bmc_hik8_device::nes_bmc_hik8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) - : nes_txrom_device(mconfig, NES_BMC_HIK8, tag, owner, clock), m_count(0) +nes_bmc_hik8_device::nes_bmc_hik8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock) + : nes_txrom_device(mconfig, type, tag, owner, clock), m_count(0) +{ +} + +nes_bmc_hik8_device::nes_bmc_hik8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_bmc_hik8_device(mconfig, NES_BMC_HIK8, tag, owner, clock) +{ +} + +nes_bmc_jy208_device::nes_bmc_jy208_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_bmc_hik8_device(mconfig, NES_BMC_JY208, tag, owner, clock) +{ +} + +nes_bmc_sfc12_device::nes_bmc_sfc12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : nes_bmc_hik8_device(mconfig, NES_BMC_SFC12, tag, owner, clock) { } @@ -759,7 +776,7 @@ void nes_bmc_hik8_device::pcb_reset() m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; m_count = 0; - memset(m_reg, 0, sizeof(m_reg)); + std::fill(std::begin(m_reg), std::end(m_reg), 0x00); mmc3_common_initialize(0x3f, 0xff, 0); } @@ -2568,46 +2585,93 @@ void nes_bmc_sbig7_device::write_h(offs_t offset, uint8_t data) BMC-HIK8IN1 Known Boards: Unknown Multigame Bootleg Board - Games: Street Fighter V, various multigame carts + Games: Many, many multigame carts iNES: mapper 45 - In MESS: Supported. It also uses mmc3_irq. + In MAME: Supported. It also uses mmc3_irq. -------------------------------------------------*/ -void nes_bmc_hik8_device::write_m(offs_t offset, uint8_t data) +void nes_bmc_hik8_device::write_m(offs_t offset, u8 data) { LOG_MMC(("bmc_hik8 write_m, offset: %04x, data: %02x\n", offset, data)); - /* This bit is the "register lock". Once register are locked, writes go to WRAM - and there is no way to unlock them (except by resetting the machine) */ - if ((m_reg[3] & 0x40) && !m_prgram.empty()) - m_prgram[offset] = data; - else + nes_txrom_device::write_m(offset, data); // registers overlay WRAM + + if (!BIT(m_reg[3], 6)) // outer register lock bit { m_reg[m_count] = data; m_count = (m_count + 1) & 0x03; - if (!m_count) - { - LOG_MMC(("bmc_hik8 write_m, command completed %02x %02x %02x %02x\n", m_reg[3], - m_reg[2], m_reg[1], m_reg[0])); - - m_prg_base = m_reg[1]; - m_prg_mask = 0x3f ^ (m_reg[3] & 0x3f); - m_chr_base = ((m_reg[2] & 0xf0) << 4) | m_reg[0]; - if (BIT(m_reg[2], 3)) - m_chr_mask = (1 << ((m_reg[2] & 7) + 1)) - 1; - else if (m_reg[2]) - m_chr_mask = 0; - else - m_chr_mask = 0xff; // i.e. we use the vrom_bank with no masking + m_prg_base = (m_reg[2] & 0xc0) << 2 | m_reg[1]; + m_prg_mask = ~m_reg[3] & 0x3f; + set_prg(m_prg_base, m_prg_mask); - set_prg(m_prg_base, m_prg_mask); - set_chr(m_chr_source, m_chr_base, m_chr_mask); - } + m_chr_base = (m_reg[2] & 0xf0) << 4 | m_reg[0]; + m_chr_mask = 0xff >> (~m_reg[2] & 0x0f); + set_chr(m_chr_source, m_chr_base, m_chr_mask); + } +} + +/*------------------------------------------------- + + BMC-JY-208 + + Games: Rockman 7 in 1 + + Variant of the HIK8IN1 boards that adds 8K of VRAM + to be used presumably by Rockman 4/6 and a 4 screen + mirroring mode for Sachen's Rocman X. + + NES 2.0: mapper 356 + + In MAME: Supported. + + -------------------------------------------------*/ + +void nes_bmc_jy208_device::set_chr(u8 chr, int chr_base, int chr_mask) +{ + if (BIT(m_reg[2], 5)) + nes_txrom_device::set_chr(chr, chr_base, chr_mask); + else + chr8(0, CHRRAM); +} + +void nes_bmc_jy208_device::write_m(offs_t offset, u8 data) +{ + nes_bmc_hik8_device::write_m(offset, data); + + if (BIT(m_reg[2], 6)) + { + set_nt_mirroring(PPU_MIRROR_4SCREEN); // actually change NT pointers + m_mirroring = PPU_MIRROR_4SCREEN; // prevent MMC3 mirror switching } + else + m_mirroring = PPU_MIRROR_NONE; // allow MMC3 mirror switching +} + +/*------------------------------------------------- + + BMC-SFC-12 + + Games: Rockman 6 in 1 (alt 2) + + Variant of the HIK8IN1 boards that adds 8K of VRAM + to be used presumably by Rockman 4/6. + + NES 2.0: mapper 372 + + In MAME: Supported. + + -------------------------------------------------*/ + +void nes_bmc_sfc12_device::set_chr(u8 chr, int chr_base, int chr_mask) +{ + if (BIT(m_reg[2], 5)) + chr8(0, CHRRAM); + else + nes_txrom_device::set_chr(chr, chr_base, chr_mask); } /*------------------------------------------------- diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h index c1f52c3e917..31b80c5cb18 100644 --- a/src/devices/bus/nes/mmc3_clones.h +++ b/src/devices/bus/nes/mmc3_clones.h @@ -681,19 +681,51 @@ class nes_bmc_hik8_device : public nes_txrom_device { public: // construction/destruction - nes_bmc_hik8_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); + nes_bmc_hik8_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); - virtual void write_m(offs_t offset, uint8_t data) override; + virtual void write_m(offs_t offset, u8 data) override; virtual void pcb_reset() override; protected: + // construction/destruction + nes_bmc_hik8_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock); + // device-level overrides virtual void device_start() override; + u8 m_reg[4]; + private: - uint8_t m_reg[4]; - uint8_t m_count; + u8 m_count; +}; + + +// ======================> nes_bmc_jy208_device + +class nes_bmc_jy208_device : public nes_bmc_hik8_device +{ +public: + // construction/destruction + nes_bmc_jy208_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + + virtual void write_m(offs_t offset, u8 data) override; + +protected: + virtual void set_chr(u8 chr, int chr_base, int chr_mask) override; +}; + + +// ======================> nes_bmc_sfc12_device + +class nes_bmc_sfc12_device : public nes_bmc_hik8_device +{ +public: + // construction/destruction + nes_bmc_sfc12_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); + +protected: + virtual void set_chr(u8 chr, int chr_base, int chr_mask) override; }; @@ -1123,6 +1155,8 @@ DECLARE_DEVICE_TYPE(NES_BMC_8IN1, nes_bmc_8in1_device) DECLARE_DEVICE_TYPE(NES_BMC_15IN1, nes_bmc_15in1_device) DECLARE_DEVICE_TYPE(NES_BMC_SBIG7, nes_bmc_sbig7_device) DECLARE_DEVICE_TYPE(NES_BMC_HIK8, nes_bmc_hik8_device) +DECLARE_DEVICE_TYPE(NES_BMC_JY208, nes_bmc_jy208_device) +DECLARE_DEVICE_TYPE(NES_BMC_SFC12, nes_bmc_sfc12_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) diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp index 5db341be6e4..b5da813c390 100644 --- a/src/devices/bus/nes/nes_carts.cpp +++ b/src/devices/bus/nes/nes_carts.cpp @@ -451,6 +451,8 @@ void nes_cart(device_slot_interface &device) device.option_add_internal("bmc_15in1", NES_BMC_15IN1); device.option_add_internal("bmc_sbig7in1", NES_BMC_SBIG7); device.option_add_internal("bmc_hik8in1", NES_BMC_HIK8); + device.option_add_internal("bmc_jy208", NES_BMC_JY208); + device.option_add_internal("bmc_sfc12", NES_BMC_SFC12); 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); diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx index 38c73c526b9..a985aa9833d 100644 --- a/src/devices/bus/nes/nes_ines.hxx +++ b/src/devices/bus/nes/nes_ines.hxx @@ -391,7 +391,7 @@ static const nes_mmc mmc_list[] = { 353, BMC_810305C }, // Super Mario Family multicart // 354 250-in-1 multicart with FDS Bubble Bobble // 355 Hwang Shinwei 3-D Block etc, currently has unemulated PIC16C54 - // 356 7-in-1 Rockman (JY-208) + { 356, BMC_JY208 }, // 357 Bit Corp 4-in-1 (ID 4602) // 358 JY multicarts, variant of mapper 282 // 359 BMC-SB-5013 multicarts @@ -407,7 +407,7 @@ static const nes_mmc mmc_list[] = // 369 Super Mario Bros Party multicart { 370, BMC_F600 }, // Golden Mario Party II multicart // 371 Spanish PEC-586 computer main cart - // 372 Rockman 1-6 multicart very close to mapper 45 + { 372, BMC_SFC12 }, // 373 Super 4-in-1, not in nes.xml? { 374, BMC_RESETSXROM }, // 375 135-in-1 2MB multicart diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx index e82c9cd0fc0..4d05211c4d2 100644 --- a/src/devices/bus/nes/nes_pcb.hxx +++ b/src/devices/bus/nes/nes_pcb.hxx @@ -323,6 +323,8 @@ static const nes_pcb pcb_list[] = { "bmc_15in1", BMC_15IN1 }, { "bmc_sbig7in1", BMC_SUPERBIG_7IN1 }, { "bmc_hik8in1", BMC_HIK8IN1 }, + { "bmc_jy208", BMC_JY208 }, + { "bmc_sfc12", BMC_SFC12 }, { "bmc_hik4in1", BMC_SUPERHIK_4IN1 }, { "bmc_mario7in1", BMC_MARIOPARTY_7IN1 }, { "bmc_f15", BMC_F15 }, diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h index b9904cb05b0..68492e89d80 100644 --- a/src/devices/bus/nes/nes_slot.h +++ b/src/devices/bus/nes/nes_slot.h @@ -86,7 +86,8 @@ enum TXC_MJBLOCK, TXC_STRIKEW, TXC_TW, // Multigame Carts BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_A88S1, BMC_F15, BMC_F600, BMC_L6IN1, - BMC_GN45, BMC_HIK8IN1, BMC_S24IN1SC03, BMC_T262, BMC_TELETUBBIES, + BMC_GN45, BMC_HIK8IN1, BMC_SFC12, BMC_JY208, + BMC_S24IN1SC03, BMC_T262, BMC_TELETUBBIES, BMC_WS, BMC_SUPERBIG_7IN1, BMC_SUPERHIK_4IN1, BMC_BALLGAMES_11IN1, BMC_MARIOPARTY_7IN1, BMC_GOLD_7IN1, BMC_SUPER_700IN1, BMC_FAMILY_4646, BMC_36IN1, BMC_21IN1, BMC_150IN1, BMC_35IN1, BMC_64IN1, -- cgit v1.2.3