summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/nanjing.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/nanjing.c')
-rw-r--r--src/devices/bus/nes/nanjing.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/devices/bus/nes/nanjing.c b/src/devices/bus/nes/nanjing.c
new file mode 100644
index 00000000000..4d0fc022520
--- /dev/null
+++ b/src/devices/bus/nes/nanjing.c
@@ -0,0 +1,175 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Nanjing PCBs
+
+ TODO:
+ - Emulate the variants often assigned to mapper 162/164 (and investigate connection with Waixing FS-304)!
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "nanjing.h"
+
+#include "video/ppu2c0x.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_NANJING = &device_creator<nes_nanjing_device>;
+
+
+nes_nanjing_device::nes_nanjing_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_NANJING, "NES Cart Nanjing PCB", tag, owner, clock, "nes_nanjing", __FILE__)
+{
+}
+
+
+
+
+void nes_nanjing_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_count));
+ save_item(NAME(m_latch1));
+ save_item(NAME(m_latch2));
+ save_item(NAME(m_reg));
+}
+
+void nes_nanjing_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg16_89ab(m_prg_chunks - 2);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, m_chr_source);
+
+ m_count = 0xff;
+ m_latch1 = 0;
+ m_latch2 = 0;
+ m_reg[0] = 0xff;
+ m_reg[1] = 0;
+}
+
+
+
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+/*-------------------------------------------------
+
+ Bootleg Board by Nanjing
+
+ Games: A lot of pirate originals
+
+ iNES: mapper 163
+
+ In MESS: Unsupported.
+
+ -------------------------------------------------*/
+
+void nes_nanjing_device::hblank_irq(int scanline, int vblank, int blanked)
+{
+ if (BIT(m_reg[0], 7))
+ {
+ if (scanline == 127)
+ {
+ chr4_0(1, CHRRAM);
+ chr4_4(1, CHRRAM);
+ }
+
+ if (scanline == 239)
+ {
+ chr4_0(0, CHRRAM);
+ chr4_4(0, CHRRAM);
+ }
+ }
+
+}
+
+WRITE8_MEMBER(nes_nanjing_device::write_l)
+{
+ LOG_MMC(("nanjing write_l, offset: %04x, data: %02x\n", offset, data));
+
+ offset += 0x100;
+
+ if (offset < 0x1000)
+ return;
+
+ if (offset == 0x1100) // 0x5100
+ {
+ if (data == 6)
+ prg32(3);
+ return;
+ }
+
+ if (offset == 0x1101) // 0x5101
+ {
+ UINT8 temp = m_count;
+ m_count = data;
+
+ if (temp & !data)
+ m_latch2 ^= 0xff;
+ }
+
+ switch (offset & 0x300)
+ {
+ case 0x000:
+ case 0x200:
+ m_reg[BIT(offset, 9)] = data;
+ if (!BIT(m_reg[0], 7) && machine().device<ppu2c0x_device>("ppu")->get_current_scanline() <= 127)
+ chr8(0, CHRRAM);
+ break;
+ case 0x300:
+ m_latch1 = data;
+ break;
+ }
+
+ prg32((m_reg[0] & 0x0f) | ((m_reg[1] & 0x0f) << 4));
+}
+
+READ8_MEMBER(nes_nanjing_device::read_l)
+{
+ UINT8 value = 0;
+ LOG_MMC(("nanjing read_l, offset: %04x\n", offset));
+
+ offset += 0x100;
+
+ if (offset < 0x1000)
+ return 0;
+
+ switch (offset & 0x700)
+ {
+ case 0x100:
+ value = m_latch1;
+ break;
+ case 0x500:
+ value = m_latch2 & m_latch1;
+ break;
+ case 0x000:
+ case 0x200:
+ case 0x300:
+ case 0x400:
+ case 0x600:
+ case 0x700:
+ value = 4;
+ break;
+ }
+ return value;
+}