diff options
Diffstat (limited to 'src/devices/bus/nes/2a03pur.c')
-rw-r--r-- | src/devices/bus/nes/2a03pur.c | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/src/devices/bus/nes/2a03pur.c b/src/devices/bus/nes/2a03pur.c new file mode 100644 index 00000000000..d7c807b63f2 --- /dev/null +++ b/src/devices/bus/nes/2a03pur.c @@ -0,0 +1,109 @@ +// license:BSD-3-Clause +// copyright-holders:Fabio Priuli +/*********************************************************************************************************** + + + NES/Famicom cartridge emulation for 2A03 Puritans Album + + + Here we emulate the PCB designed by infiniteneslives and + rainwarrior for this homebew multicart [mapper 30?] + The main difference of this PCB compared to others is that it + uses 4k PRG banks! + + ***********************************************************************************************************/ + + +#include "emu.h" +#include "2a03pur.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_2A03PURITANS = &device_creator<nes_2a03pur_device>; + + +nes_2a03pur_device::nes_2a03pur_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : nes_nrom_device(mconfig, NES_2A03PURITANS, "NES Cart 2A03 Puritans Album PCB", tag, owner, clock, "nes_2a03pur", __FILE__) +{ +} + + + +void nes_2a03pur_device::device_start() +{ + common_start(); + save_item(NAME(m_reg)); + memset(m_reg, 0x00, sizeof(m_reg)); + m_reg[7] = 0xff; +} + +void nes_2a03pur_device::pcb_reset() +{ + m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM; + chr8(0, m_chr_source); + // register content is not touched by reset +} + + +/*------------------------------------------------- + mapper specific handlers + -------------------------------------------------*/ + +/*------------------------------------------------- + + Board 2A03 Puritans Album + + In MESS: supported. + + This mapper supports up to 1MB of PRG-ROM, in 4k + banks located at $8000, $9000, $A000, $B000, $C000, + $D000, $E000, and $F000. Each bank is selected by n + 8-bit register at $5FF8, $5FF9, $5FFA, $5FFB, $5FFC, + $5FFD, $5FFE, and $5FFF, respectively, just like NSF + banking. These registers are mirrored across the + entire $5000-$5FFF region (the register is selected + by the low 3 bits), but it is recommended to use the + original addresses. The mirroring is merely a + convenience for the hardware implementation. + + The 8kb CHR region may be RAM or ROM. This project + uses CHR-RAM, and the board used by infiniteneslives + for this project may only support CHR-RAM. + + At power-on, the mapper automatically sets all bits + in the $5FFF bank register, placing the highest bank + in $F000. This occurs on power-on but not on reset, + so any bank that is mapped to $F000 after power-on + should contain a valid reset vector. + + At present, the project uses iNES mapper 30 to + designate this mapper. No mapper number has been + officially reserved yet. + -------------------------------------------------*/ + +WRITE8_MEMBER(nes_2a03pur_device::write_l) +{ + LOG_MMC(("2a03 puritans write_l, offset: %04x, data: %02x\n", offset, data)); + offset += 0x100; + if (offset >= 0x1000) + m_reg[offset & 7] = data; +} + +READ8_MEMBER(nes_2a03pur_device::read_h) +{ + LOG_MMC(("2a03 puritans read_h, offset: %04x\n", offset)); + + return m_prg[(m_reg[(offset >> 12) & 7] * 0x1000) + (offset & 0x0fff)]; +} |