diff --git a/hash/nes.xml b/hash/nes.xml
index 261bba1bd72..b1fe1b9bee5 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -52115,6 +52115,96 @@ preliminary proto for the PAL version, still running on NTSC systems) or the gfx
+
+ 1997 Super 7 in 1 (JY-201)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
+
+ 1997 Super 6 in 1 (JY-202)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
+
+ 1997 Super 7 in 1 (JY-203)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
+
+ 1997 Super 7 in 1 (JY-204)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
+
+ 1997 Super 7 in 1 (JY-205)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
+
+ 1997 Super 7 in 1 (JY-206)
+ 1997
+ J.Y. Company
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index d05ab7154f0..0a0ef9f933c 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -51,6 +51,7 @@ DEFINE_DEVICE_TYPE(NES_SA9602B, nes_sa9602b_device, "nes_sa9602b",
DEFINE_DEVICE_TYPE(NES_SACHEN_SHERO, nes_sachen_shero_device, "nes_shero", "NES Cart Street Hero PCB")
//DEFINE_DEVICE_TYPE(NES_A9746, nes_a9746_device, "nes_bmc_a9746", "NES Cart A-9746 PCB")
+DEFINE_DEVICE_TYPE(NES_A88S1, nes_a88s1_device, "nes_a88s1", "NES Cart BMC A88S-1 PCB")
DEFINE_DEVICE_TYPE(NES_FCGJ8IN1, nes_fcgj8in1_device, "nes_fcgj8in1", "NES Cart BMC FC Genjin 8 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_FK23C, nes_fk23c_device, "nes_fk23c", "NES Cart FK23C PCB")
DEFINE_DEVICE_TYPE(NES_FK23CA, nes_fk23ca_device, "nes_fk23ca", "NES Cart FK23CA PCB")
@@ -203,6 +204,11 @@ nes_sachen_shero_device::nes_sachen_shero_device(const machine_config &mconfig,
//{
//}
+nes_a88s1_device::nes_a88s1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_A88S1, tag, owner, clock)
+{
+}
+
nes_fcgj8in1_device::nes_fcgj8in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_txrom_device(mconfig, NES_FCGJ8IN1, tag, owner, clock)
{
@@ -494,6 +500,23 @@ void nes_sachen_shero_device::pcb_reset()
mmc3_common_initialize(0xff, 0x1ff, 0);
}
+void nes_a88s1_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_reg));
+
+ // power-on values for registers; they don't seem to change with soft reset
+ m_reg[0] = 0x80;
+ m_reg[1] = 0x82;
+}
+
+void nes_a88s1_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ mmc3_common_initialize(0x1f, 0xff, 0);
+ update_banks();
+}
+
void nes_fcgj8in1_device::pcb_reset()
{
m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
@@ -2252,6 +2275,70 @@ void nes_bmc_mario7in1_device::write_m(offs_t offset, uint8_t data)
m_prgram[offset] = data;
}
+/*-------------------------------------------------
+
+ BMC-A88S-1
+
+ Games: 1997 Super 7 in 1, 6 in 1 (JY-201 to JY-206)
+
+ MMC3 clone with banking for multigame menu.
+
+ NES 2.0: mapper 411
+
+ In MAME: Preliminary supported.
+
+ TODO: Investigate...
+ - Hokuto no Ken has broken sound on each cart it's on.
+ - Bird Fighter boss fights have corrupt graphics.
+ - whether not being able to reset from within certain
+ games is correct. Examples are Samurai (title scroll
+ only) and Bomber Man (in game only) on JY-202, or
+ SD Gunman in JY-204.
+
+ -------------------------------------------------*/
+
+void nes_a88s1_device::update_banks()
+{
+ u8 outer = bitswap<2>(m_reg[1], 6, 3);
+ u8 size_128k = !BIT(m_reg[1], 1);
+
+ if (BIT(m_reg[0], 6)) // NROM mode
+ {
+ u8 bank = outer << 3 | bitswap<3>(m_reg[0], 2, 3, 0);
+ u8 mode = BIT(m_reg[0], 1);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
+ }
+ else // MMC3 mode
+ {
+ m_prg_base = (outer & (0xfe | size_128k)) << 4;
+ m_prg_mask = 0x1f >> size_128k;
+ set_prg(m_prg_base, m_prg_mask);
+ }
+
+ m_chr_base = (m_reg[0] & 0x10) << 4 | (BIT(m_reg[1], 2) & size_128k) << 7;
+ m_chr_mask = 0xff >> size_128k;
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+}
+
+void nes_a88s1_device::prg_cb(int start, int bank)
+{
+ if (!BIT(m_reg[0], 6))
+ nes_txrom_device::prg_cb(start, bank);
+}
+
+void nes_a88s1_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("a88s1 write_l, offset: %04x, data: %02x\n", offset, data));
+
+ offset += 0x100;
+ if (offset >= 0x1000)
+ {
+ m_reg[offset & 1] = data;
+ update_banks();
+ }
+}
+
/*-------------------------------------------------
BMC-F-15
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index 034c93a1985..c01770cfd80 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -430,6 +430,29 @@ private:
#endif
+// ======================> nes_a88s1_device
+
+class nes_a88s1_device : public nes_txrom_device
+{
+public:
+ // construction/destruction
+ nes_a88s1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void prg_cb(int start, int bank) override;
+
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
+private:
+ void update_banks();
+ u8 m_reg[2];
+};
+
+
// ======================> nes_fcgj8in1_device
class nes_fcgj8in1_device : public nes_txrom_device
@@ -899,6 +922,7 @@ DECLARE_DEVICE_TYPE(NES_SACHEN_SHERO, nes_sachen_shero_device)
DECLARE_DEVICE_TYPE(NES_A9746, nes_a9746_device)
#endif
+DECLARE_DEVICE_TYPE(NES_A88S1, nes_a88s1_device)
DECLARE_DEVICE_TYPE(NES_FCGJ8IN1, nes_fcgj8in1_device)
DECLARE_DEVICE_TYPE(NES_FK23C, nes_fk23c_device)
DECLARE_DEVICE_TYPE(NES_FK23CA, nes_fk23ca_device)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index 93945a65522..5df2c7fa9c9 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -418,6 +418,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_reset42", NES_BMC_42IN1RESET); // mapper 226? or 233?
device.option_add_internal("bmc_lc160", NES_BMC_LC160);
// misc multigame cart MMC3 clone boards
+ device.option_add_internal("a88s1", NES_A88S1);
device.option_add_internal("fcgj8in1", NES_FCGJ8IN1);
device.option_add_internal("fk23c", NES_FK23C);
device.option_add_internal("fk23ca", NES_FK23CA);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 52825b6c55f..315804c8bc3 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -446,7 +446,7 @@ static const nes_mmc mmc_list[] =
// 408 Konami PnP
// 409 (Sealie) homebrew game A Winner is You, 64MB music cart, easy to support if dump is available
// 410 Unused or JY?
- // 411 various JY multicarts
+ { 411, BMC_A88S1 },
// 412 INTV 10-in-1 PnP 2nd edition
// 413 homebrew game Super Russian Roulette
// 414 9999999-in-1 multicart
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 2524a9bfed5..861f641f3dc 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -296,6 +296,7 @@ static const nes_pcb pcb_list[] =
{ "bmc_8157", BMC_8157 },
{ "bmc_g146", BMC_G146 },
{ "bmc_11160", BMC_11160 },
+ { "a88s1", BMC_A88S1 },
{ "fcgj8in1", BMC_FCGENJIN_8IN1 },
{ "fk23c", BMC_FK23C },
{ "fk23ca", BMC_FK23CA },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index da2ef65009c..49159c57aa6 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_GN45,
+ BMC_64IN1NR, BMC_190IN1, BMC_A65AS, BMC_A88S1, 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,