summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nes/sealie.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nes/sealie.cpp')
-rw-r--r--src/devices/bus/nes/sealie.cpp241
1 files changed, 241 insertions, 0 deletions
diff --git a/src/devices/bus/nes/sealie.cpp b/src/devices/bus/nes/sealie.cpp
new file mode 100644
index 00000000000..5c7b42cfe4e
--- /dev/null
+++ b/src/devices/bus/nes/sealie.cpp
@@ -0,0 +1,241 @@
+// license:BSD-3-Clause
+// copyright-holders:kmg
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Sealie Computing and related PCBs
+
+
+ Here we emulate the following homebrew PCBs
+
+ * SEALIE RET-CUFROM [mapper 29]
+ * SEALIE DPCMcart [mapper 409]
+ * SEALIE UNROM 512 [mapper 30]
+ * SEALIE 8BIT XMAS [mapper 30]
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "sealie.h"
+
+
+#ifdef NES_PCB_DEBUG
+#define VERBOSE (LOG_GENERAL)
+#else
+#define VERBOSE (0)
+#endif
+#include "logmacro.h"
+
+
+//-------------------------------------------------
+// constructor
+//-------------------------------------------------
+
+DEFINE_DEVICE_TYPE(NES_8BITXMAS, nes_8bitxmas_device, "nes_8bitxmas", "NES Cart Sealie 8BIT XMAS PCB")
+DEFINE_DEVICE_TYPE(NES_CUFROM, nes_cufrom_device, "nes_cufrom", "NES Cart Sealie RET-CUFROM PCB")
+DEFINE_DEVICE_TYPE(NES_DPCMCART, nes_dpcmcart_device, "nes_dpcmcart", "NES Cart Sealie DPCMcart PCB")
+DEFINE_DEVICE_TYPE(NES_UNROM512, nes_unrom512_device, "nes_unrom512", "NES Cart Sealie UNROM 512 PCB")
+
+
+nes_cufrom_device::nes_cufrom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_CUFROM, tag, owner, clock)
+{
+}
+
+nes_dpcmcart_device::nes_dpcmcart_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_DPCMCART, tag, owner, clock)
+{
+}
+
+nes_unrom512_device::nes_unrom512_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, type, tag, owner, clock)
+{
+}
+
+nes_unrom512_device::nes_unrom512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_unrom512_device(mconfig, NES_UNROM512, tag, owner, clock)
+{
+}
+
+nes_8bitxmas_device::nes_8bitxmas_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_unrom512_device(mconfig, NES_8BITXMAS, tag, owner, clock), m_led(0)
+{
+}
+
+
+
+void nes_cufrom_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, CHRRAM);
+}
+
+void nes_dpcmcart_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+}
+
+void nes_unrom512_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, CHRRAM);
+ if (m_pcb_ctrl_mirror)
+ set_nt_mirroring(PPU_MIRROR_LOW);
+}
+
+void nes_8bitxmas_device::device_start()
+{
+ nes_unrom512_device::device_start();
+ save_item(NAME(m_led));
+
+ m_bus_conflict = false;
+}
+
+void nes_8bitxmas_device::pcb_reset()
+{
+ nes_unrom512_device::pcb_reset();
+
+ m_led = 0;
+ update_led();
+}
+
+
+
+/*-------------------------------------------------
+ mapper specific handlers
+ -------------------------------------------------*/
+
+/*-------------------------------------------------
+
+ Sealie RET-CUFROM board
+
+ Games: Glider (only?)
+
+ This homebrew mapper supports 8x16k PRG banks at 0x8000,
+ 8k WRAM at 0x6000, and 4x8k VRAM banks. PRG is stored on
+ flash ROM, though unlike mapper 30 it doesn't appear to
+ be self-flashable, only through an external tool.
+
+ iNES: mapper 29
+
+ In MAME: Supported.
+
+ -------------------------------------------------*/
+
+void nes_cufrom_device::write_h(offs_t offset, u8 data)
+{
+ LOG("cufrom write_h, offset: %04x, data: %02x\n", offset, data);
+
+ prg16_89ab(BIT(data, 2, 3));
+ chr8(data & 0x03, CHRRAM);
+}
+
+/*-------------------------------------------------
+
+ Sealie DPCMcart board
+
+ Games: A Winner is You
+
+ This homebrew mapper supports a whopping 64MB which
+ is paged in 16K chucks at 0x8000. 0xc000 is fixed.
+
+ NES 2.0: mapper 409
+
+ In MAME: Partially supported.
+
+ TODO: Controls other than 'next track' don't work.
+
+ -------------------------------------------------*/
+
+void nes_dpcmcart_device::write_h(offs_t offset, u8 data)
+{
+ LOG("dpcmcart write_h, offset: %04x, data: %02x\n", offset, data);
+ prg16_89ab(offset & 0x0fff);
+}
+
+/*-------------------------------------------------
+
+ Sealie UNROM 512 board
+
+ Games: Battle Kid 1 & 2, E.T., many more
+
+ This board has several variations and jumper configurations.
+ Currently we only support the Sealie nonflashable config
+ with 32x16k PRG banks at 0x8000, 4x8k VRAM, and three
+ mirroring configs (H, V, or PCB selected 1-screen modes).
+
+ iNES: mapper 30
+
+ In MAME: Preliminary partial support.
+
+ -------------------------------------------------*/
+
+void nes_unrom512_device::write_h(offs_t offset, u8 data)
+{
+ LOG("unrom512 write_h, offset: %04x, data: %02x\n", offset, data);
+
+ // this pcb is subject to bus conflict in its nonflashable configuration
+ data = account_bus_conflict(offset, data);
+
+ if (m_pcb_ctrl_mirror)
+ set_nt_mirroring(BIT(data, 7) ? PPU_MIRROR_HIGH : PPU_MIRROR_LOW);
+ prg16_89ab(data & 0x1f);
+ chr8(BIT(data, 5, 2), CHRRAM);
+}
+
+/*-------------------------------------------------
+
+ Sealie 8BIT XMAS revD board
+
+ Games: 8-bit Xmas 2012-2016 and 2018-2021?
+
+ This board is a variant of UNROM512 with 16 LEDs
+ in 4 colors, blue, yellow, green, red, which are
+ controlled in pairs by each byte written to
+ 0x8000-0xbfff. Bits are [BYGR bygr] where bygr
+ control LEDs 1,2 and BYGR control LEDs 3,4. On
+ the 8BIT XMAS revD 2012 board LEDS are arranged:
+
+ _______________________________
+ | RED2 GRN3 |
+ | |
+ | YEL2 BLU3 |
+ | |
+ | BLU1 YEL4 |
+ | |
+ | GRN1 RED4 |
+ | |
+ | RED1 GRN4 |
+ | |
+ | YEL1 BLU4 |
+ -- --
+ | GRN2 BLU2 YEL3 RED3 |
+ | |
+
+ iNES: mapper 30
+
+ In MAME: Preliminary partial support.
+
+ -------------------------------------------------*/
+
+void nes_8bitxmas_device::update_led()
+{
+ // TODO: add artwork
+}
+
+void nes_8bitxmas_device::write_h(offs_t offset, u8 data)
+{
+ LOG("8bitxmas write_h, offset: %04x, data: %02x\n", offset, data);
+
+ if (BIT(offset, 14))
+ nes_unrom512_device::write_h(offset, data);
+ else if (m_led != data)
+ {
+ m_led = data;
+ update_led();
+ }
+}