summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/benshieng.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/benshieng.c')
-rw-r--r--src/devices/bus/nes/benshieng.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/src/devices/bus/nes/benshieng.c b/src/devices/bus/nes/benshieng.c
new file mode 100644
index 00000000000..b96c75e6297
--- /dev/null
+++ b/src/devices/bus/nes/benshieng.c
@@ -0,0 +1,105 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Benshieng PCBs
+
+
+ Here we emulate the following PCBs used by Benshieng multigame carts series
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "benshieng.h"
+
+
+#ifdef NES_PCB_DEBUG
+#define VERBOSE 1
+#else
+#define VERBOSE 0
+#endif
+
+#define LOG_MMC(x) do { if (VERBOSE) logerror x; } while (0)
+
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+const device_type NES_BENSHIENG = &device_creator<nes_benshieng_device>;
+
+
+nes_benshieng_device::nes_benshieng_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_BENSHIENG, "NES Cart Benshieng PCB", tag, owner, clock, "nes_benshieng", __FILE__)
+{
+}
+
+
+
+
+void nes_benshieng_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_dipsetting));
+ save_item(NAME(m_mmc_prg_bank));
+ save_item(NAME(m_mmc_vrom_bank));
+}
+
+void nes_benshieng_device::pcb_reset()
+{
+ m_dipsetting = 0;
+
+ m_mmc_prg_bank[0] = 0xff;
+ m_mmc_prg_bank[1] = 0xff;
+ m_mmc_prg_bank[2] = 0xff;
+ m_mmc_prg_bank[3] = 0xff;
+ memset(m_mmc_vrom_bank, 0, sizeof(m_mmc_vrom_bank));
+ update_banks();
+}
+
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+/*-------------------------------------------------
+
+ BMC-BS-5
+
+ Games: a few 4 in 1 multicarts
+
+ -------------------------------------------------*/
+
+void nes_benshieng_device::update_banks()
+{
+ prg8_89(m_mmc_prg_bank[0]);
+ prg8_ab(m_mmc_prg_bank[1]);
+ prg8_cd(m_mmc_prg_bank[2]);
+ prg8_ef(m_mmc_prg_bank[3]);
+ chr2_0(m_mmc_vrom_bank[0], CHRROM);
+ chr2_2(m_mmc_vrom_bank[1], CHRROM);
+ chr2_4(m_mmc_vrom_bank[2], CHRROM);
+ chr2_6(m_mmc_vrom_bank[3], CHRROM);
+}
+
+WRITE8_MEMBER(nes_benshieng_device::write_h)
+{
+ UINT8 helper = (offset & 0xc00) >> 10;
+ LOG_MMC(("benshieng write_h, offset: %04x, data: %02x\n", offset, data));
+// m_mmc_dipsetting = ioport("CARTDIPS")->read();
+
+ switch (offset & 0x7000)
+ {
+ case 0x0000:
+ m_mmc_vrom_bank[helper] = offset & 0x1f;
+ break;
+ case 0x2000:
+ if (BIT(offset, m_dipsetting + 4)) // mmc_dipsetting is always zero atm, given we have no way to add cart-based DIPs
+ m_mmc_prg_bank[helper] = offset & 0x0f;
+ break;
+ }
+ update_banks();
+}