diff --git a/hash/nes.xml b/hash/nes.xml
index fd5c9beaaf5..e67e2ef1e9d 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -78386,7 +78386,7 @@ be better to redump them properly. -->
19??
<pirate>
-
+
@@ -78397,13 +78397,13 @@ be better to redump them properly. -->
-
+
2000 in 1 (No Splash, No Rev, Alt Mapper)
19??
<pirate>
-
-
+
+
@@ -78478,13 +78478,13 @@ be better to redump them properly. -->
-
+
255 in 1
19??
<pirate>
-
-
+
+
@@ -78955,13 +78955,15 @@ be better to redump them properly. -->
-
+
+
Super 4-in-1 Fantasy Gun
19??
<unknown>
+
@@ -79629,13 +79631,13 @@ be better to redump them properly. -->
-
+
500 in 1
19??
<pirate>
-
-
+
+
@@ -79645,13 +79647,13 @@ be better to redump them properly. -->
-
+
500 in 1 (Alt)
19??
<pirate>
-
-
+
+
@@ -80589,7 +80591,7 @@ be better to redump them properly. -->
-
+
9999 in 1
19??
<pirate>
@@ -80605,7 +80607,7 @@ be better to redump them properly. -->
-
+
9999 in 1 (Alt)
19??
<pirate>
@@ -80621,7 +80623,7 @@ be better to redump them properly. -->
-
+
9999 in 1 (Alt 2)
19??
<pirate>
@@ -80637,12 +80639,12 @@ be better to redump them properly. -->
-
+
9999 in 1 (Anim. Splash, Rev 13)
19??
<pirate>
-
+
@@ -80669,13 +80671,13 @@ be better to redump them properly. -->
-
+
9999999 in 1 (Alt)
19??
<pirate>
-
-
+
+
diff --git a/src/devices/bus/nes/multigame.cpp b/src/devices/bus/nes/multigame.cpp
index e9f5481a6e6..32bb9f6d04d 100644
--- a/src/devices/bus/nes/multigame.cpp
+++ b/src/devices/bus/nes/multigame.cpp
@@ -78,6 +78,7 @@ DEFINE_DEVICE_TYPE(NES_BMC_76IN1, nes_bmc_76in1_device, "nes_bmc_76in1
DEFINE_DEVICE_TYPE(NES_BMC_110IN1, nes_bmc_110in1_device, "nes_bmc_110in1", "NES Cart BMC 110 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_150IN1, nes_bmc_150in1_device, "nes_bmc_150in1", "NES Cart BMC 150 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_190IN1, nes_bmc_190in1_device, "nes_bmc_190in1", "NES Cart BMC 190 in 1 PCB")
+DEFINE_DEVICE_TYPE(NES_BMC_500IN1, nes_bmc_500in1_device, "nes_bmc_500in1", "NES Cart BMC 500 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_800IN1, nes_bmc_800in1_device, "nes_bmc_800in1", "NES Cart BMC 800 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_1200IN1, nes_bmc_1200in1_device, "nes_bmc_1200in1", "NES Cart BMC 1200 in 1 PCB")
DEFINE_DEVICE_TYPE(NES_BMC_GOLD150, nes_bmc_gold150_device, "nes_bmc_gold150", "NES Cart BMC Golden 150 in 1 PCB")
@@ -279,7 +280,7 @@ nes_bmc_8157_device::nes_bmc_8157_device(const machine_config &mconfig, const ch
{
}
-nes_bmc_hik300_device::nes_bmc_hik300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_bmc_hik300_device::nes_bmc_hik300_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, NES_BMC_HIK300, tag, owner, clock)
{
}
@@ -364,6 +365,11 @@ nes_bmc_150in1_device::nes_bmc_150in1_device(const machine_config &mconfig, cons
{
}
+nes_bmc_500in1_device::nes_bmc_500in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_BMC_500IN1, tag, owner, clock)
+{
+}
+
nes_bmc_800in1_device::nes_bmc_800in1_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: nes_nrom_device(mconfig, NES_BMC_800IN1, tag, owner, clock), m_mode(0)
{
@@ -802,16 +808,11 @@ void nes_bmc_8157_device::pcb_reset()
m_latch = 0;
}
-void nes_bmc_hik300_device::device_start()
-{
- common_start();
-}
-
void nes_bmc_hik300_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg32(0xff);
- chr8(0xff, CHRROM);
+ prg16_89ab(0);
+ prg16_cdef(0);
+ chr8(0, CHRROM);
}
void nes_bmc_s700_device::device_start()
@@ -2143,24 +2144,27 @@ u8 nes_bmc_8157_device::read_h(offs_t offset)
iNES: mapper 212
- In MESS: Supported.
+ In MAME: Supported.
-------------------------------------------------*/
-void nes_bmc_hik300_device::write_h(offs_t offset, uint8_t data)
+u8 nes_bmc_hik300_device::read_m(offs_t offset)
+{
+ LOG_MMC(("bmc_hik300 read_m, offset: %04x, data: %02x\n", offset));
+ return get_open_bus() | (!BIT(offset, 4) << 7); // some games have a protection MSB
+}
+
+void nes_bmc_hik300_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("bmc_hik300 write_h, offset: %04x, data: %02x\n", offset, data));
- set_nt_mirroring(BIT(data, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
- chr8(offset, CHRROM);
+ u8 bank = offset & 0x07;
+ u8 mode = BIT(offset, 14);
+ prg16_89ab(bank & ~mode);
+ prg16_cdef(bank | mode);
- if (offset < 0x4000)
- {
- prg16_89ab(offset);
- prg16_cdef(offset);
- }
- else
- prg32(offset >> 1);
+ chr8(bank, CHRROM);
+ set_nt_mirroring(BIT(offset, 3) ? PPU_MIRROR_HORZ : PPU_MIRROR_VERT);
}
/*-------------------------------------------------
@@ -2691,6 +2695,26 @@ void nes_bmc_150in1_device::write_h(offs_t offset, uint8_t data)
set_nt_mirroring(BIT(offset, 0) ? PPU_MIRROR_HORZ: PPU_MIRROR_VERT);
}
+/*-------------------------------------------------
+
+ BMC-500IN1
+
+ Unknown Bootleg Multigame Board
+ Games: 500 in 1, 2000 in 1 Unchained Melody, etc
+
+ iNES: mapper 217
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_bmc_500in1_device::write_h(offs_t offset, u8 data)
+{
+ LOG_MMC(("bmc500in1 write_h, offset: %04x, data: %02x\n", offset, data));
+ prg32((offset >> 2) & 0x07);
+ chr8(offset & 0x07, CHRROM);
+}
+
/*-------------------------------------------------
BMC-800IN1
diff --git a/src/devices/bus/nes/multigame.h b/src/devices/bus/nes/multigame.h
index 78fb551d36f..15c55f48b24 100644
--- a/src/devices/bus/nes/multigame.h
+++ b/src/devices/bus/nes/multigame.h
@@ -606,15 +606,12 @@ class nes_bmc_hik300_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_bmc_hik300_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_bmc_hik300_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual u8 read_m(offs_t offset) 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;
};
@@ -923,6 +920,18 @@ protected:
};
+// ======================> nes_bmc_500in1_device
+
+class nes_bmc_500in1_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_bmc_500in1_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, uint8_t data) override;
+};
+
+
// ======================> nes_bmc_800in1_device
class nes_bmc_800in1_device : public nes_nrom_device
@@ -1187,6 +1196,7 @@ DECLARE_DEVICE_TYPE(NES_BMC_76IN1, nes_bmc_76in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_110IN1, nes_bmc_110in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_150IN1, nes_bmc_150in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_190IN1, nes_bmc_190in1_device)
+DECLARE_DEVICE_TYPE(NES_BMC_500IN1, nes_bmc_500in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_800IN1, nes_bmc_800in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_1200IN1, nes_bmc_1200in1_device)
DECLARE_DEVICE_TYPE(NES_BMC_GOLD150, nes_bmc_gold150_device)
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index e3d2fcc3e72..b3a74f2be17 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -406,6 +406,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_110in1", NES_BMC_110IN1);
device.option_add_internal("bmc_150in1", NES_BMC_150IN1);
device.option_add_internal("bmc_190in1", NES_BMC_190IN1);
+ device.option_add_internal("bmc_500in1", NES_BMC_500IN1);
device.option_add_internal("bmc_800in1", NES_BMC_800IN1); // mapper 236?
device.option_add_internal("bmc_1200in1", NES_BMC_1200IN1);
device.option_add_internal("bmc_gold150", NES_BMC_GOLD150); // mapper 235 with 2M PRG
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 056be6f808a..6aefc3186b5 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -250,7 +250,7 @@ static const nes_mmc mmc_list[] =
{ 214, BMC_SUPERGUN_20IN1 },
{ 215, SUPERGAME_BOOGERMAN },
{ 216, RCM_GS2015 },
- { 217, BMC_GOLDENCARD_6IN1 },
+ { 217, BMC_500IN1 },
{ 218, NOCASH_NOCHR },
// 219 UNL-A9746 (according to Cah4e3's code, no dump available (yet)
// 220 Unused - reserved for emulator debugging
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 7b9cab3a353..54852c5c865 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -287,6 +287,7 @@ static const nes_pcb pcb_list[] =
{ "bmc_110in1", BMC_110IN1 },
{ "bmc_150in1", BMC_150IN1 },
{ "bmc_190in1", BMC_190IN1 },
+ { "bmc_500in1", BMC_500IN1 },
{ "bmc_800in1", BMC_800IN1 },
{ "bmc_1200in1", BMC_1200IN1 },
{ "bmc_2751", BMC_2751 },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index c3abf5fe199..044323a10b5 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -94,7 +94,7 @@ enum
BMC_8IN1, BMC_15IN1, BMC_SUPERHIK_300IN1, BMC_SUPERGUN_20IN1,
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_70IN1, BMC_500IN1, BMC_800IN1, BMC_1200IN1,
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,