diff options
Diffstat (limited to 'src/devices/bus/nes/discrete.cpp')
-rw-r--r-- | src/devices/bus/nes/discrete.cpp | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/src/devices/bus/nes/discrete.cpp b/src/devices/bus/nes/discrete.cpp new file mode 100644 index 00000000000..e0109a84d94 --- /dev/null +++ b/src/devices/bus/nes/discrete.cpp @@ -0,0 +1,209 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/*********************************************************************************************************** + + + NES/Famicom cartridge emulation for PCBs mostly based on discrete components + + Here we emulate the following PCBs + + * PCB with IC 74x161x161x32 [mapper 70 & 152] + * PCB with IC 74x139x74 [mapper 87] + * PCB with IC 74x377 [mapper 11] + * PCB with IC 74x161x138 [mapper 38] + + TODO: + - Investigating missing inputs in Crime Busters + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "discrete.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_74X161X161X32 = &device_creator<nes_74x161x161x32_device>; +const device_type NES_74X139X74 = &device_creator<nes_74x139x74_device>; +const device_type NES_74X377 = &device_creator<nes_74x377_device>; +const device_type NES_74X161X138 = &device_creator<nes_74x161x138_device>; + + +nes_74x161x161x32_device::nes_74x161x161x32_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : nes_nrom_device(mconfig, NES_74X161X161X32, "NES Cart Discrete Logic (74*161/161/32) PCB", tag, owner, clock, "nes_74x161", __FILE__) +{ +} + +nes_74x139x74_device::nes_74x139x74_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : nes_nrom_device(mconfig, NES_74X139X74, "NES Cart Discrete Logic (74*139/74) PCB", tag, owner, clock, "nes_74x139", __FILE__) +{ +} + +nes_74x377_device::nes_74x377_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : nes_nrom_device(mconfig, NES_74X377, "NES Cart Discrete Logic (74*377) PCB", tag, owner, clock, "nes_74x377", __FILE__) +{ +} + +nes_74x161x138_device::nes_74x161x138_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : nes_nrom_device(mconfig, NES_74X161X138, "NES Cart Discrete Logic (74*161/138) PCB", tag, owner, clock, "nes_bitcorp_dis", __FILE__) +{ +} + + + + +void nes_74x161x161x32_device::device_start() +{ + common_start(); +} + +void nes_74x161x161x32_device::pcb_reset() +{ + m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; + prg16_89ab(0); + prg16_cdef(m_prg_chunks - 1); + chr8(0, m_chr_source); +} + +void nes_74x139x74_device::device_start() +{ + common_start(); +} + +void nes_74x139x74_device::pcb_reset() +{ + m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; + prg16_89ab(0); + prg16_cdef(m_prg_chunks - 1); + chr8(0, m_chr_source); +} + +void nes_74x377_device::device_start() +{ + common_start(); +} + +void nes_74x377_device::pcb_reset() +{ + m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; + prg32(0); + chr8(0, m_chr_source); +} + +void nes_74x161x138_device::device_start() +{ + common_start(); +} + +void nes_74x161x138_device::pcb_reset() +{ + m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; + prg32(0); + chr8(0, m_chr_source); +} + + + + +/*------------------------------------------------- + mapper specific handlers + -------------------------------------------------*/ + +/*------------------------------------------------- + + Discrete Logic board IC 74x161x161x32 + + There are two variants (one with hardwired mirroring, the + other with a mirroring control), making necessary two distinct + mappers & pcb_id + + iNES: mappers 70 & 152 + + -------------------------------------------------*/ + +// there are two 'variants' depending on hardwired or mapper ctrl mirroring +WRITE8_MEMBER(nes_74x161x161x32_device::write_h) +{ + LOG_MMC(("74x161x161x32 write_h, offset: %04x, data: %02x\n", offset, data)); + + // this pcb is subject to bus conflict + data = account_bus_conflict(offset, data); + + if (m_pcb_ctrl_mirror) + set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW); + chr8(data, CHRROM); + prg16_89ab(data >> 4); +} + +/*------------------------------------------------- + + Discrete Logic board IC 74x139x74 by Konami & Jaleco + + iNES: mapper 87 + + -------------------------------------------------*/ + +WRITE8_MEMBER(nes_74x139x74_device::write_m) +{ + LOG_MMC(("74x139x74 write_m, offset: %04x, data: %02x\n", offset, data)); + + chr8(((data & 0x02) >> 1) | ((data & 0x01) << 1), CHRROM); +} + +/*------------------------------------------------- + + Discrete Logic board IC 74x377 by Color Dreams / Nina-007 emulation + + Games: many Color Dreams and Wisdom Tree titles + + iNES: mapper 11 + + In MESS: Supported + + Note: bit2 & bit3 are actually related to CIC lockout + defeating, and real Color Dreams titles use only + bit0 & bit1 for PRG switching. Our usage allows for support + of extended PRG games (e.g. homebrew) + + -------------------------------------------------*/ + +WRITE8_MEMBER(nes_74x377_device::write_h) +{ + LOG_MMC(("74x377 write_h, offset: %04x, data: %02x\n", offset, data)); + + // this pcb is subject to bus conflict, but not the prototype of Secret Scout, which actually breaks in case of conflict... + data = account_bus_conflict(offset, data); + + chr8(data >> 4, m_chr_source); + prg32(data & 0x0f); +} + +/*------------------------------------------------- + + Discrete Logic board IC 74x161x138 + + Games: Crime Busters + + iNES: mapper 38 + + -------------------------------------------------*/ + +WRITE8_MEMBER(nes_74x161x138_device::write_m) +{ + LOG_MMC(("74x161x138 write_m, offset: %04x, data: %02x\n", offset, data)); + + chr8(data >> 2, CHRROM); + prg32(data); +} |