summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2022-01-14 17:14:53 -0900
committer GitHub <noreply@github.com>2022-01-14 21:14:53 -0500
commit63a372ddf587267f18f840854babcb5542c3fca8 (patch)
tree03f908c16c0173722f8a9cc321d64f50d7e46f82 /src
parenta30ac9e7468d2e2cd9e02600397d287f5d134057 (diff)
bus/nes: Rewrote CONY/YOKO boards. (#9143)
- Consolidated all common functionality into base class. - Split off variants based on CHR banking size (CONY) and address line changes (YOKO). - Properly handle backup RAM for Dragon Ball Party multicart. - Removed deprecated hold_irq_line. New working software list additions (nes.xml) ----------------------------------- Street Blaster IV Pro 10 (Asia) [anonymous]
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/nes/cony.cpp375
-rw-r--r--src/devices/bus/nes/cony.h60
-rw-r--r--src/devices/bus/nes/nes_carts.cpp1
-rw-r--r--src/devices/bus/nes/nes_ines.hxx10
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx1
-rw-r--r--src/devices/bus/nes/nes_slot.h2
6 files changed, 179 insertions, 270 deletions
diff --git a/src/devices/bus/nes/cony.cpp b/src/devices/bus/nes/cony.cpp
index dbe62aa52a3..2acd18c2f88 100644
--- a/src/devices/bus/nes/cony.cpp
+++ b/src/devices/bus/nes/cony.cpp
@@ -9,9 +9,7 @@
Here we emulate the following PCBs
* UNL-CONY [mapper 83]
- * UNL-YOKO
-
- TODO: fix glitches and emulate properly the variants
+ * UNL-YOKO [mapper 264]
***********************************************************************************************************/
@@ -33,71 +31,42 @@
// constructor
//-------------------------------------------------
-DEFINE_DEVICE_TYPE(NES_CONY, nes_cony_device, "nes_cony", "NES Cart Cony PCB")
-DEFINE_DEVICE_TYPE(NES_YOKO, nes_yoko_device, "nes_yoko", "NES Cart Yoko PCB")
+DEFINE_DEVICE_TYPE(NES_CONY, nes_cony_device, "nes_cony", "NES Cart Cony PCB")
+DEFINE_DEVICE_TYPE(NES_CONY1K, nes_cony1k_device, "nes_cony1k", "NES Cart Cony 1K PCB")
+DEFINE_DEVICE_TYPE(NES_YOKO, nes_yoko_device, "nes_yoko", "NES Cart Yoko PCB")
-nes_cony_device::nes_cony_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
+nes_cony_device::nes_cony_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
: nes_nrom_device(mconfig, type, tag, owner, clock)
, m_irq_count(0)
, m_irq_enable(0)
, irq_timer(nullptr)
- , m_latch1(0)
- , m_latch2(0)
- , m_extra1(0)
+ , m_extra_addr(type == NES_YOKO ? 0x1400 : 0x1100)
+ , m_mask(type == NES_YOKO ? 0x0f : 0x1f)
+ , m_mode_reg(0)
+ , m_outer_reg(0)
{
}
-nes_cony_device::nes_cony_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+nes_cony_device::nes_cony_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
: nes_cony_device(mconfig, NES_CONY, tag, owner, clock)
{
}
-nes_yoko_device::nes_yoko_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_cony_device(mconfig, NES_YOKO, tag, owner, clock), m_extra2(0)
+nes_cony1k_device::nes_cony1k_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_cony_device(mconfig, NES_CONY1K, tag, owner, clock)
{
}
-
-
-
-void nes_cony_device::device_start()
+nes_yoko_device::nes_yoko_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_cony_device(mconfig, NES_YOKO, tag, owner, clock)
{
- common_start();
- irq_timer = timer_alloc(TIMER_IRQ);
- irq_timer->adjust(attotime::zero, 0, clocks_to_attotime(1));
-
- save_item(NAME(m_irq_enable));
- save_item(NAME(m_irq_count));
-
- save_item(NAME(m_low_reg));
- save_item(NAME(m_reg));
- save_item(NAME(m_extra1));
- save_item(NAME(m_latch1));
- save_item(NAME(m_latch2));
}
-void nes_cony_device::pcb_reset()
-{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
- prg16_89ab(0);
- prg8_cd(0x1e);
- prg8_ef(0x1f);
- chr8(0, m_chr_source);
-
- m_irq_enable = 0;
- m_irq_count = 0;
- m_latch1 = 0;
- m_latch2 = 0;
- m_extra1 = 0;
- memset(m_low_reg, 0, sizeof(m_low_reg));
- memset(m_reg, 0, sizeof(m_reg));
- m_reg[9] = 0x0f;
-}
-void nes_yoko_device::device_start()
+void nes_cony_device::device_start()
{
common_start();
irq_timer = timer_alloc(TIMER_IRQ);
@@ -106,39 +75,33 @@ void nes_yoko_device::device_start()
save_item(NAME(m_irq_enable));
save_item(NAME(m_irq_count));
- save_item(NAME(m_low_reg));
- save_item(NAME(m_reg));
- save_item(NAME(m_extra1));
- save_item(NAME(m_extra2));
- save_item(NAME(m_latch1));
- save_item(NAME(m_latch2));
+ save_item(NAME(m_mmc_prg_bank));
+ save_item(NAME(m_mmc_vrom_bank));
+ save_item(NAME(m_extra_ram));
+ save_item(NAME(m_mode_reg));
+ save_item(NAME(m_outer_reg));
}
-void nes_yoko_device::pcb_reset()
+void nes_cony_device::pcb_reset()
{
- m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
prg16_89ab(0);
- prg8_cd(0x1e);
- prg8_ef(0x1f);
- chr8(0, m_chr_source);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, CHRROM);
m_irq_enable = 0;
m_irq_count = 0;
- m_latch1 = 0;
- m_latch2 = 0;
- m_extra1 = 0;
- m_extra2 = 0;
+ m_mode_reg = 0;
+ m_outer_reg = 0;
- memset(m_low_reg, 0, sizeof(m_low_reg));
- memset(m_reg, 0, sizeof(m_reg));
- m_reg[9] = 0x0f;
+ std::fill(std::begin(m_extra_ram), std::end(m_extra_ram), 0x00);
+ std::fill(std::begin(m_mmc_prg_bank), std::end(m_mmc_prg_bank), 0x00);
+ std::fill(std::begin(m_mmc_vrom_bank), std::end(m_mmc_vrom_bank), 0x00);
}
-
/*-------------------------------------------------
mapper specific handlers
-------------------------------------------------*/
@@ -162,243 +125,173 @@ void nes_cony_device::device_timer(emu_timer &timer, device_timer_id id, int par
{
if (m_irq_enable)
{
+ m_irq_count += BIT(m_mode_reg, 6) ? -1 : 1;
if (!m_irq_count)
{
- hold_irq_line();
+ set_irq_line(ASSERT_LINE);
m_irq_enable = 0;
- m_irq_count = 0xffff;
}
- else
- m_irq_count--;
}
}
}
-void nes_cony_device::write_l(offs_t offset, uint8_t data)
+void nes_cony_device::write_l(offs_t offset, u8 data)
{
LOG_MMC(("cony write_l, offset: %04x, data: %02x\n", offset, data));
- if (offset >= 0x1000 && offset < 0x1103) // from 0x5100-0x51ff
- m_low_reg[offset & 0x03] = data;
+ offset += 0x100;
+ if (offset >= m_extra_addr) // scratch ram from 0x5100 or 0x5400
+ m_extra_ram[offset & 0x03] = data;
}
-uint8_t nes_cony_device::read_l(offs_t offset)
+u8 nes_cony_device::read_l(offs_t offset)
{
LOG_MMC(("cony read_l, offset: %04x\n", offset));
- if (offset == 0x0f00) // 0x5000
- {
- // read dipswitch bit! - currently unimplemented
- }
- if (offset >= 0x1000 && offset < 0x1103) // from 0x5100-0x51ff
- return m_low_reg[offset & 0x03];
+ offset += 0x100;
+ if (offset >= m_extra_addr) // scratch ram from 0x5100 or 0x5400
+ return m_extra_ram[offset & 0x03];
+ else if (offset >= 0x1000) // 0x5000
+ return m_extra_addr >> 10; // FIXME: this should be 2-bit jumper settings; certain games glitch with certain values here
else
- return 0x00;
+ return get_open_bus();
}
-void nes_cony_device::set_prg()
+void nes_cony_device::write_m(offs_t offset, u8 data)
{
- prg16_89ab(m_reg[8] & 0x3f);
- prg16_cdef((m_reg[8] & 0x30) | 0x0f);
+ LOG_MMC(("cony write_m, offset: %04x, data: %02x\n", offset, data));
+
+ if (!m_battery.empty())
+ m_battery[((m_outer_reg >> 6) * 0x2000 + offset) & (m_battery.size() - 1)] = data;
}
-void nes_cony_device::set_chr()
+u8 nes_cony_device::read_m(offs_t offset)
{
- // FIXME: here we emulate at least 3 different boards!!!
- // one board switches 1k VROM banks only
- // one writes to 0x8000 and then switches 2k VROM banks only
- // one writes to 0x831n (n=2,3,4,5) and then switches 2k VROM banks only
- // we should split them and possibly document the proper behavior of each variant
- if (m_latch1 && !m_latch2)
- {
- chr2_0(m_reg[0], CHRROM);
- chr2_2(m_reg[1], CHRROM);
- chr2_4(m_reg[6], CHRROM);
- chr2_6(m_reg[7], CHRROM);
- }
+ LOG_MMC(("cony read_m, offset: %04x\n", offset));
+
+ if (!m_battery.empty())
+ return m_battery[((m_outer_reg >> 6) * 0x2000 + offset) & (m_battery.size() - 1)];
+ else if (BIT(m_mode_reg, 5))
+ return m_prg[(m_mmc_prg_bank[3] * 0x2000 + offset) & (m_prg_size - 1)];
else
+ return get_open_bus();
+}
+
+void nes_cony_device::set_prg()
+{
+ switch (m_mode_reg & 0x18)
{
- chr1_0(m_reg[0] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_1(m_reg[1] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_2(m_reg[2] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_3(m_reg[3] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_4(m_reg[4] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_5(m_reg[5] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_6(m_reg[6] | ((m_reg[8] & 0x30) << 4), CHRROM);
- chr1_7(m_reg[7] | ((m_reg[8] & 0x30) << 4), CHRROM);
+ case 0x00:
+ prg16_89ab(m_outer_reg);
+ prg16_cdef(m_outer_reg | m_mask >> 1);
+ break;
+ case 0x08:
+ prg32(m_outer_reg >> 1);
+ break;
+ case 0x10:
+ case 0x18:
+ {
+ int base = (m_outer_reg << 1) & ~m_mask;
+ prg8_89(base | (m_mmc_prg_bank[0] & m_mask));
+ prg8_ab(base | (m_mmc_prg_bank[1] & m_mask));
+ prg8_cd(base | (m_mmc_prg_bank[2] & m_mask));
+ prg8_ef(base | m_mask);
+ break;
+ }
}
}
-void nes_cony_device::write_h(offs_t offset, uint8_t data)
+void nes_cony_device::set_chr()
+{
+ chr2_0(m_mmc_vrom_bank[0], CHRROM);
+ chr2_2(m_mmc_vrom_bank[1], CHRROM);
+ chr2_4(m_mmc_vrom_bank[6], CHRROM);
+ chr2_6(m_mmc_vrom_bank[7], CHRROM);
+}
+
+void nes_cony_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("cony write_h, offset: %04x, data: %02x\n", offset, data));
- switch (offset)
+ switch (offset & 0x0300)
{
case 0x0000:
- m_latch1 = 1;
- [[fallthrough]];
- case 0x3000:
- case 0x30ff:
- case 0x31ff:
- m_reg[8] = data;
+ m_outer_reg = data;
set_prg();
set_chr();
break;
case 0x0100:
- m_extra1 = data & 0x80;
+ m_mode_reg = data;
+ set_prg();
switch (data & 0x03)
{
- case 0:
- set_nt_mirroring(PPU_MIRROR_VERT);
- break;
- case 1:
- set_nt_mirroring(PPU_MIRROR_HORZ);
- break;
- case 2:
- set_nt_mirroring(PPU_MIRROR_LOW);
- break;
- case 3:
- set_nt_mirroring(PPU_MIRROR_HIGH);
- break;
+ case 0: set_nt_mirroring(PPU_MIRROR_VERT); break;
+ case 1: set_nt_mirroring(PPU_MIRROR_HORZ); break;
+ case 2: set_nt_mirroring(PPU_MIRROR_LOW); break;
+ case 3: set_nt_mirroring(PPU_MIRROR_HIGH); break;
}
break;
case 0x0200:
- m_irq_count = (m_irq_count & 0xff00) | data;
- break;
- case 0x0201:
- m_irq_enable = m_extra1;
- m_irq_count = (data << 8) | (m_irq_count & 0xff);
+ if (offset & 1)
+ {
+ m_irq_enable = BIT(m_mode_reg, 7);
+ m_irq_count = data << 8 | (m_irq_count & 0x00ff);
+ }
+ else
+ {
+ m_irq_count = (m_irq_count & 0xff00) | data;
+ set_irq_line(CLEAR_LINE);
+ }
break;
case 0x0300:
- prg8_89(data);
- break;
- case 0x0301:
- prg8_ab(data);
- break;
- case 0x0302:
- prg8_cd(data);
- break;
- case 0x0312:
- case 0x0313:
- case 0x0314:
- case 0x0315:
- m_latch2 = 1;
- [[fallthrough]];
- case 0x0310:
- case 0x0311:
- case 0x0316:
- case 0x0317:
- m_reg[offset - 0x0310] = data;
- set_chr();
- break;
- case 0x0318:
- m_reg[9] = data; // unused?
- set_prg();
+ switch (offset & 0x18)
+ {
+ case 0x00:
+ case 0x08:
+ m_mmc_prg_bank[offset & 3] = data;
+ set_prg();
+ break;
+ case 0x10:
+ m_mmc_vrom_bank[offset & 7] = data;
+ set_chr();
+ break;
+ }
break;
}
}
/*-------------------------------------------------
- Yoko Bootleg Board
-
- Games: Mortal Kombat II, Master Figther VI'
-
- Very similar to Cony board
-
- NES 2.0: mapper 264
-
- In MAME: Supported.
+ Cony Bootleg Board alternate 1K CHR banking
-------------------------------------------------*/
-void nes_yoko_device::write_l(offs_t offset, uint8_t data)
+void nes_cony1k_device::set_chr()
{
- LOG_MMC(("yoko write_l, offset: %04x, data: %02x\n", offset, data));
-
- if (offset >= 0x1300) // from 0x5400
- m_low_reg[offset & 0x03] = data;
+ for (int i = 0; i < 8; i++)
+ chr1_x(i, m_mmc_vrom_bank[i] | (m_outer_reg & 0x30) << 4, CHRROM);
}
-uint8_t nes_yoko_device::read_l(offs_t offset)
-{
- LOG_MMC(("yoko read_l, offset: %04x\n", offset));
+/*-------------------------------------------------
- if (offset >= 0x0f00 && offset < 0x1300) // 0x5000
- {
- // read dipswitch bit! - currently unimplemented
- }
- if (offset >= 0x1300) // from 0x5400
- return m_low_reg[offset & 0x03];
- else
- return 0x00;
-}
+ Yoko Bootleg Board
-void nes_yoko_device::set_prg()
-{
- if (m_extra1 & 0x10)
- {
- int base = (m_extra2 & 0x08) << 1;
- prg8_89(base | (m_reg[0] & 0x0f));
- prg8_ab(base | (m_reg[1] & 0x0f));
- prg8_cd(base | (m_reg[2] & 0x0f));
- prg8_ef(base | 0x0f);
- }
- else if (m_extra1 & 0x08)
- prg32(m_extra2 >> 1);
- else
- {
- prg16_89ab(m_extra2);
- prg16_cdef(0xff);
- }
-}
+ Games: Mortal Kombat II, Master Fighter VI'
-void nes_yoko_device::set_chr()
-{
- chr2_0(m_reg[4], CHRROM);
- chr2_2(m_reg[5], CHRROM);
- chr2_4(m_reg[6], CHRROM);
- chr2_6(m_reg[7], CHRROM);
-}
+ Seems to be the same as the Cony board (2K CHR
+ banking version) but with address lines A10/A11
+ swapped in for Cony address lines A8/A9.
-void nes_yoko_device::write_h(offs_t offset, uint8_t data)
+ NES 2.0: mapper 264
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_yoko_device::write_h(offs_t offset, u8 data)
{
LOG_MMC(("yoko write_h, offset: %04x, data: %02x\n", offset, data));
- switch (offset & 0x0c17)
- {
- case 0x0000:
- m_extra2 = data;
- set_prg();
- break;
- case 0x400:
- m_extra1 = data;
- if (data & 1)
- set_nt_mirroring(PPU_MIRROR_HORZ);
- else
- set_nt_mirroring(PPU_MIRROR_VERT);
- set_prg();
- break;
- case 0x0800:
- m_irq_count = (m_irq_count & 0xff00) | data;
- break;
- case 0x0801:
- m_irq_enable = m_extra1 & 0x80;
- m_irq_count = (data << 8) | (m_irq_count & 0xff);
- break;
- case 0x0c00:
- case 0x0c01:
- case 0x0c02:
- m_reg[offset & 3] = data;
- set_prg();
- break;
- case 0x0c10:
- case 0x0c11:
- case 0x0c16:
- case 0x0c17:
- m_reg[4 + (offset & 3)] = data;
- set_chr();
- break;
- }
+ offset = (offset & 0xf0ff) | (offset & 0x0c00) >> 2;
+ nes_cony_device::write_h(offset, data);
}
diff --git a/src/devices/bus/nes/cony.h b/src/devices/bus/nes/cony.h
index aa767a88c13..6843689db7f 100644
--- a/src/devices/bus/nes/cony.h
+++ b/src/devices/bus/nes/cony.h
@@ -14,18 +14,19 @@ class nes_cony_device : public nes_nrom_device
{
public:
// construction/destruction
- nes_cony_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_cony_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_l(offs_t offset) override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual u8 read_l(offs_t offset) override;
+ virtual u8 read_m(offs_t offset) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ 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:
- static constexpr device_timer_id TIMER_IRQ = 0;
-
- nes_cony_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+ // construction/destruction
+ nes_cony_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock);
// device-level overrides
virtual void device_start() override;
@@ -34,46 +35,49 @@ protected:
virtual void set_prg();
virtual void set_chr();
- uint16_t m_irq_count;
+ u16 m_irq_count;
int m_irq_enable;
+ static constexpr device_timer_id TIMER_IRQ = 0;
emu_timer *irq_timer;
- uint8_t m_latch1, m_latch2;
- uint8_t m_low_reg[4];
- uint8_t m_reg[10];
- uint8_t m_extra1;
+ u8 m_mmc_prg_bank[4];
+ u8 m_mmc_vrom_bank[8];
+ u8 m_extra_ram[4];
+ u16 m_extra_addr;
+ u8 m_mask;
+ u8 m_mode_reg;
+ u8 m_outer_reg;
};
-// ======================> nes_yoko_device
+// ======================> nes_cony1k_device
-class nes_yoko_device : public nes_cony_device
+class nes_cony1k_device : public nes_cony_device
{
public:
// construction/destruction
- nes_yoko_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_cony1k_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- virtual uint8_t read_l(offs_t offset) override;
- virtual void write_l(offs_t offset, uint8_t data) override;
- virtual void write_h(offs_t offset, uint8_t data) override;
+ virtual void set_chr() override;
+};
- virtual void pcb_reset() override;
-protected:
- // device-level overrides
- virtual void device_start() override;
+// ======================> nes_yoko_device
-private:
- virtual void set_prg() override;
- virtual void set_chr() override;
+class nes_yoko_device : public nes_cony_device
+{
+public:
+ // construction/destruction
+ nes_yoko_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- uint8_t m_extra2;
+ virtual void write_h(offs_t offset, u8 data) override;
};
// device type definition
-DECLARE_DEVICE_TYPE(NES_CONY, nes_cony_device)
-DECLARE_DEVICE_TYPE(NES_YOKO, nes_yoko_device)
+DECLARE_DEVICE_TYPE(NES_CONY, nes_cony_device)
+DECLARE_DEVICE_TYPE(NES_CONY1K, nes_cony1k_device)
+DECLARE_DEVICE_TYPE(NES_YOKO, nes_yoko_device)
#endif // MAME_BUS_NES_CONY_H
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index ba99930536a..4226db2078f 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -251,6 +251,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("waixing_sh2", NES_WAIXING_SH2);
device.option_add_internal("fs304", NES_WAIXING_FS304); // used in Zelda 3 by Waixing
device.option_add_internal("cony", NES_CONY);
+ device.option_add_internal("cony1k", NES_CONY1K);
device.option_add_internal("yoko", NES_YOKO);
device.option_add_internal("hengg_srich", NES_HENGG_SRICH);
device.option_add_internal("hengg_xhzs", NES_HENGG_XHZS);
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index d33c723d26e..691c1d178aa 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -961,6 +961,11 @@ void nes_cart_slot_device::call_load_ines()
m_cart->set_pcb_ctrl_mirror(true);
break;
+ case CONY_BOARD:
+ if (submapper == 0 || submapper == 2)
+ pcb_id = CONY1K_BOARD;
+ break;
+
case UNL_LH28_LH54:
if (vrom_size)
m_pcb_id = (vrom_size == 0x4000) ? UNL_LE05 : UNL_LH31;
@@ -1309,6 +1314,11 @@ const char * nes_cart_slot_device::get_default_card_ines(get_default_card_softwa
pcb_id = BTL_AISENSHINICOL; // Mapper 42 is used for 2 diff boards
break;
+ case CONY_BOARD:
+ if (submapper == 0 || submapper == 2)
+ pcb_id = CONY1K_BOARD; // Mapper 83 is used for 3 diff boards
+ break;
+
case UNL_LH28_LH54: // Mapper 108 is used for 4 diff boards
if (ROM[5])
pcb_id = (ROM[5] == 2) ? UNL_LE05 : UNL_LH31;
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index eb1fa98da3e..fe6166562ea 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -159,6 +159,7 @@ static const nes_pcb pcb_list[] =
{ "waixing_sh2", WAIXING_SH2 },
{ "fs304", WAIXING_FS304 }, // used in Zelda 3 by Waixing
{ "cony", CONY_BOARD },
+ { "cony1k", CONY1K_BOARD },
{ "yoko", YOKO_BOARD },
{ "hengg_srich", HENGG_SRICH },
{ "hengg_xhzs", HENGG_XHZS },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index 47f865ea801..c1a03d3d441 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -136,7 +136,7 @@ enum
OPENCORP_DAOU306, HES_BOARD, SVISION16_BOARD, RUMBLESTATION_BOARD, JYCOMPANY_A, JYCOMPANY_B, JYCOMPANY_C,
MAGICSERIES_MD, KASING_BOARD, FUTUREMEDIA_BOARD, FUKUTAKE_BOARD, SOMARI_SL12, SOMARI_HUANG2,
HENGG_SRICH, HENGG_XHZS, HENGG_SHJY3, SUBOR_TYPE0, SUBOR_TYPE1, SUBOR_TYPE2,
- CNE_DECATHLON, CNE_FSB, CNE_SHLZ, COCOMA_BOARD, CONY_BOARD, SMD133_BOARD, YOKO_BOARD,
+ CNE_DECATHLON, CNE_FSB, CNE_SHLZ, COCOMA_BOARD, CONY_BOARD, CONY1K_BOARD, SMD133_BOARD, YOKO_BOARD,
RCM_GS2015, RCM_GS2004, RCM_GS2013, RCM_TF9IN1, RCM_3DBLOCK,
WAIXING_TYPE_A, WAIXING_TYPE_A1, WAIXING_TYPE_B, WAIXING_TYPE_C, WAIXING_TYPE_D,
WAIXING_TYPE_E, WAIXING_TYPE_F, WAIXING_TYPE_G, WAIXING_TYPE_H, WAIXING_TYPE_H1,