summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/camerica.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/camerica.c')
-rw-r--r--src/devices/bus/nes/camerica.c225
1 files changed, 225 insertions, 0 deletions
diff --git a/src/devices/bus/nes/camerica.c b/src/devices/bus/nes/camerica.c
new file mode 100644
index 00000000000..61c41dd7867
--- /dev/null
+++ b/src/devices/bus/nes/camerica.c
@@ -0,0 +1,225 @@
+// license:BSD-3-Clause
+// copyright-holders:Fabio Priuli
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Camerica/Codemasters PCBs
+
+
+ Here we emulate the following PCBs
+
+ * Camerica BF9093, BF9097, BF909X [mapper 71, two variants]
+ * Camerica BF9096 Boards [mapper 232]
+ * Camerica Golden Five [mapper 104]
+
+ Aladdin Deck Enhancer pass-thru cart and the corresponding minicarts
+ (ALGNV11 & ALGQV11 PCBs) are emulated in a separate source file.
+
+
+ TODO:
+ - check what causes flickering from PPU in Fire Hawk, Poogie and Big Nose (same PPU issue as Back to
+ Future 2&3?)
+ - not all the Golden Five games work. investigate!
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "camerica.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_BF9093 = &device_creator<nes_bf9093_device>;
+const device_type NES_BF9096 = &device_creator<nes_bf9096_device>;
+const device_type NES_GOLDEN5 = &device_creator<nes_golden5_device>;
+
+
+nes_bf9093_device::nes_bf9093_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_BF9093, "NES Cart Camerica BF9093 PCB", tag, owner, clock, "nes_bf9093", __FILE__)
+{
+}
+
+nes_bf9096_device::nes_bf9096_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_BF9096, "NES Cart Camerica BF9096 PCB", tag, owner, clock, "nes_bf9096", __FILE__)
+{
+}
+
+nes_golden5_device::nes_golden5_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
+ : nes_nrom_device(mconfig, NES_GOLDEN5, "NES Cart Camerica Golden 5 PCB", tag, owner, clock, "nes_golden5", __FILE__)
+{
+}
+
+
+
+
+void nes_bf9093_device::device_start()
+{
+ common_start();
+}
+
+void nes_bf9093_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ prg32(0xff);
+ chr8(0, m_chr_source);
+}
+
+void nes_bf9096_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_latch));
+ save_item(NAME(m_bank_base));
+}
+
+void nes_bf9096_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ chr8(0, m_chr_source);
+
+ m_latch = 0x00;
+ m_bank_base = 0x0c;
+ prg16_89ab(m_bank_base | m_latch);
+ prg16_cdef(m_bank_base | 3);
+}
+
+void nes_golden5_device::device_start()
+{
+ common_start();
+ save_item(NAME(m_latch));
+}
+
+void nes_golden5_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+ chr8(0, m_chr_source);
+
+ m_latch = 0x00;
+ m_bank_base = 0x00;
+ prg16_89ab(m_bank_base | m_latch);
+ prg16_cdef(m_bank_base | 0x0f);
+}
+
+
+
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+/*-------------------------------------------------
+
+ Camerica Boards (BF9093, BF9097, BF909X, ALGNV11)
+
+ Games: Linus Spacehead's Cosmic Crusade, Micro Machines,
+ Mig-29, Stunt Kids
+
+ To emulate NT mirroring for BF9097 board (missing in BF9093)
+ we use crc_hack, however Fire Hawk is broken (but without
+ mirroring there would be no helicopter graphics).
+
+ iNES: mapper 71
+
+ In MESS: Partially Supported.
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_bf9093_device::write_h)
+{
+ LOG_MMC(("bf9093 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ switch (offset & 0x7000)
+ {
+ case 0x0000:
+ case 0x1000:
+ if (m_pcb_ctrl_mirror)
+ set_nt_mirroring(BIT(data, 4) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
+ break;
+ case 0x4000:
+ case 0x5000:
+ case 0x6000:
+ case 0x7000:
+ prg16_89ab(data);
+ break;
+ }
+}
+
+/*-------------------------------------------------
+
+ Camerica BF9096 & ALGQV11 Boards
+
+ Games: Quattro Adventure, Quattro Arcade, Quattro Sports
+
+ Writes to 0x8000-0xbfff set prg block to (data&0x18)>>1,
+ writes to 0xc000-0xffff set prg page to data&3. selected
+ prg are: prg16_89ab = block|page, prg_cdef = 3|page.
+ For more info on the hardware to bypass the NES lockout, see
+ Kevtris' Camerica Mappers documentation.
+
+ iNES: mapper 232
+
+ In MESS: Supported.
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_bf9096_device::write_h)
+{
+ LOG_MMC(("bf9096 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ if (offset < 0x4000)
+ {
+ m_bank_base = ((data >> 3) & 3) << 2;
+ prg16_89ab(m_bank_base | m_latch);
+ prg16_cdef(m_bank_base | 3);
+ }
+ else
+ {
+ m_latch = data & 3;
+ prg16_89ab(m_bank_base | m_latch);
+ }
+}
+
+/*-------------------------------------------------
+
+ Camerica Golden Five board
+
+ Games: Pegasus 5 in 1
+
+ iNES: mapper 104
+
+ In MESS: Supported.
+
+ -------------------------------------------------*/
+
+WRITE8_MEMBER(nes_golden5_device::write_h)
+{
+ LOG_MMC(("golden5 write_h, offset: %04x, data: %02x\n", offset, data));
+
+ if (offset < 0x4000)
+ {
+ if (data & 0x08)
+ {
+ m_bank_base = (data & 0x07) << 4;
+ prg16_89ab(m_bank_base | m_latch);
+ prg16_cdef(m_bank_base | 0x0f);
+ }
+
+ }
+ else
+ {
+ m_latch = data & 0x0f;
+ prg16_89ab(m_bank_base | m_latch);
+ }
+}