diff --git a/hash/nes.xml b/hash/nes.xml
index 02c2ae4b87b..43551a3342f 100644
--- a/hash/nes.xml
+++ b/hash/nes.xml
@@ -77050,6 +77050,61 @@ be better to redump them properly. -->
+
+
+
+ 2A03Puritans
+ 2013
+ Infinite NES Lives
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ E.T.
+ 2014
+ <homebrew>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Glider
+ 2008
+ RetroZone
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -77057,9 +77112,9 @@ be better to redump them properly. -->
2013
Infinite NES Lives
-
+
-
+
@@ -77072,9 +77127,9 @@ be better to redump them properly. -->
2014
Infinite NES Lives
-
+
-
+
@@ -77087,9 +77142,9 @@ be better to redump them properly. -->
2018
Infinite NES Lives
-
+
-
+
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index ae7ff3bfba9..5d4df6e5730 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -2833,6 +2833,8 @@ if (BUSES["NES"]~=null) then
MAME_DIR .. "src/devices/bus/nes/rexsoft.h",
MAME_DIR .. "src/devices/bus/nes/sachen.cpp",
MAME_DIR .. "src/devices/bus/nes/sachen.h",
+ MAME_DIR .. "src/devices/bus/nes/sealie.cpp",
+ MAME_DIR .. "src/devices/bus/nes/sealie.h",
MAME_DIR .. "src/devices/bus/nes/somari.cpp",
MAME_DIR .. "src/devices/bus/nes/somari.h",
MAME_DIR .. "src/devices/bus/nes/subor.cpp",
diff --git a/src/devices/bus/nes/2a03pur.cpp b/src/devices/bus/nes/2a03pur.cpp
index 87e364b1638..62dbc5ee753 100644
--- a/src/devices/bus/nes/2a03pur.cpp
+++ b/src/devices/bus/nes/2a03pur.cpp
@@ -7,7 +7,7 @@
Here we emulate the PCB designed by infiniteneslives and
- rainwarrior for this homebew multicart [mapper 31]
+ rainwarrior for this homebrew multicart [mapper 31]
The main difference of this PCB compared to others is that it
uses 4k PRG banks!
diff --git a/src/devices/bus/nes/2a03pur.h b/src/devices/bus/nes/2a03pur.h
index 970898ff128..fe7d50d5804 100644
--- a/src/devices/bus/nes/2a03pur.h
+++ b/src/devices/bus/nes/2a03pur.h
@@ -8,7 +8,7 @@
#include "nxrom.h"
-// ======================> nes_racermate_device
+// ======================> nes_2a03pur_device
class nes_2a03pur_device : public nes_nrom_device
{
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index a4a3950b98d..e34ed926145 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -51,6 +51,7 @@
#include "rcm.h"
#include "rexsoft.h"
#include "sachen.h"
+#include "sealie.h"
#include "somari.h"
#include "subor.h"
#include "tengen.h"
@@ -397,8 +398,10 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("bmc_830118c", NES_BMC_830118C);
device.option_add_internal("pjoy84", NES_PJOY84);
device.option_add_internal("nocash_nochr", NES_NOCHR);
- device.option_add_internal("nes_action53", NES_ACTION53);
- device.option_add_internal("nes_2a03pur", NES_2A03PURITANS);
+ device.option_add_internal("action53", NES_ACTION53);
+ device.option_add_internal("cufrom", NES_CUFROM);
+ device.option_add_internal("unrom512", NES_UNROM512);
+ device.option_add_internal("2a03pur", NES_2A03PURITANS);
// other unsupported...
device.option_add_internal("ninjaryu", NES_NROM); // mapper 111 - UNSUPPORTED
device.option_add_internal("unl_dance", NES_NROM); // UNSUPPORTED
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 6239f4e1849..c8690d3c3c2 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -59,10 +59,10 @@ static const nes_mmc mmc_list[] =
{ 25, KONAMI_VRC4 },
{ 26, KONAMI_VRC6 },
{ 27, UNL_WORLDHERO }, // 27 World Hero board - Unsupported
- { 28, BTL_ACTION53 }, // 28 - Multi-discrete PCB designed by Tepples for Action 53
- // 29 Unused
- // 30 UNROM 512 + Flash, currently unsupported
- { 31, BTL_2A03_PURITANS }, // 31 - PCB designed by infinitelives & rainwarrior for 2A03 Puritans Album
+ { 28, UNL_ACTION53 }, // 28 - Multi-discrete PCB designed by Tepples for Action 53
+ { 29, UNL_CUFROM }, // 29 - homebrew PCB used by Glider
+ { 30, UNL_UNROM512 }, // 30 - UNROM 512 + Flash
+ { 31, UNL_2A03PURITANS }, // 31 - PCB designed by infinitelives & rainwarrior for 2A03 Puritans Album
{ 32, IREM_G101 },
{ 33, TAITO_TC0190FMC },
{ 34, STD_BXROM },
@@ -134,7 +134,7 @@ static const nes_mmc mmc_list[] =
// 100 images hacked to work with nesticle?
// 101 Unused (Urusei Yatsura had been assigned to this mapper, but it's Mapper 87)
// 102 Unused
- { 103, UNL_2708 }, // 103 Bootleg cart 2708 (Doki Doki Panic - FDS Conversion) - Unsupported
+ { 103, UNL_2708 }, // 103 Bootleg cart 2708 (Doki Doki Panic - FDS Conversion)
{ 104, CAMERICA_GOLDENFIVE },
{ 105, STD_EVENT },
{ 106, BTL_SMB3 },
@@ -564,6 +564,28 @@ void nes_cart_slot_device::call_load_ines()
}
break;
+ case UNL_UNROM512:
+ // this mapper also uses mirroring flags differently
+ m_cart->set_four_screen_vram(false);
+ switch (local_options & 0x09)
+ {
+ case 0x00:
+ m_cart->set_mirroring(PPU_MIRROR_HORZ);
+ break;
+ case 0x01:
+ m_cart->set_mirroring(PPU_MIRROR_VERT);
+ break;
+ case 0x08:
+ m_cart->set_mirroring(PPU_MIRROR_LOW);
+ m_cart->set_pcb_ctrl_mirror(true);
+ break;
+ case 0x09:
+ m_cart->set_mirroring(PPU_MIRROR_4SCREEN);
+ m_cart->set_four_screen_vram(true);
+ break;
+ }
+ break;
+
case STD_CNROM:
if (mapper == 185 && !submapper)
{
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index b70340e6479..6c893ce105f 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -309,8 +309,10 @@ static const nes_pcb pcb_list[] =
{ "tf1201", UNL_TF1201 },
{ "unl_cfight", UNL_CITYFIGHT },
{ "nocash_nochr", NOCASH_NOCHR },
- { "nes_action53", BTL_ACTION53 },
- { "nes_2a03pur", BTL_2A03_PURITANS },
+ { "action53", UNL_ACTION53 },
+ { "cufrom", UNL_CUFROM },
+ { "unrom512", UNL_UNROM512 },
+ { "2a03pur", UNL_2A03PURITANS },
{ "ffe3", FFE3_BOARD },
{ "ffe4", FFE4_BOARD },
{ "ffe8", FFE8_BOARD },
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index a207a26e869..5f810e3c6fe 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -129,8 +129,8 @@ enum
KAY_BOARD, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD,
WHIRLWIND_2706, ZEMINA_BOARD,
NOCASH_NOCHR, // homebrew PCB design which uses NTRAM for CHRRAM
- BTL_ACTION53, // homebrew PCB for homebrew multicarts
- BTL_2A03_PURITANS, // homebrew PCB
+ UNL_ACTION53, // homebrew PCB for homebrew multicarts
+ UNL_CUFROM, UNL_UNROM512, UNL_2A03PURITANS, // homebrew PCBs
/* FFE boards, for mappers 6, 8, 17 */
FFE3_BOARD, FFE4_BOARD, FFE8_BOARD, TEST_BOARD,
/* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */
diff --git a/src/devices/bus/nes/sealie.cpp b/src/devices/bus/nes/sealie.cpp
new file mode 100644
index 00000000000..1e6761486ac
--- /dev/null
+++ b/src/devices/bus/nes/sealie.cpp
@@ -0,0 +1,124 @@
+// license:BSD-3-Clause
+// copyright-holders: kmg, Fabio Priuli
+/***********************************************************************************************************
+
+
+ NES/Famicom cartridge emulation for Sealie Computing and related PCBs
+
+
+ Here we emulate the following homebrew PCBs
+
+ * SEALIE RET-CUFROM [mapper 29]
+ * SEALIE UNROM 512 [mapper 30]
+
+ ***********************************************************************************************************/
+
+
+#include "emu.h"
+#include "sealie.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
+//-------------------------------------------------
+
+DEFINE_DEVICE_TYPE(NES_CUFROM, nes_cufrom_device, "nes_cufrom", "NES Cart Sealie RET-CUFROM 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_unrom512_device::nes_unrom512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_nrom_device(mconfig, NES_UNROM512, tag, owner, clock)
+{
+}
+
+
+
+void nes_cufrom_device::pcb_reset()
+{
+ prg16_89ab(0);
+ prg16_cdef(m_prg_chunks - 1);
+ chr8(0, CHRRAM);
+}
+
+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);
+}
+
+
+/*-------------------------------------------------
+ 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_MMC(("cufrom write_h, offset: %04x, data: %02x\n", offset, data));
+
+ prg16_89ab((data >> 2) & 0x07);
+ chr8(data & 0x03, CHRRAM);
+}
+
+/*-------------------------------------------------
+
+ 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_MMC(("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((data >> 5) & 0x03, CHRRAM);
+}
diff --git a/src/devices/bus/nes/sealie.h b/src/devices/bus/nes/sealie.h
new file mode 100644
index 00000000000..1892bf45ff2
--- /dev/null
+++ b/src/devices/bus/nes/sealie.h
@@ -0,0 +1,43 @@
+// license:BSD-3-Clause
+// copyright-holders: kmg, Fabio Priuli
+#ifndef MAME_BUS_NES_SEALIE_H
+#define MAME_BUS_NES_SEALIE_H
+
+#pragma once
+
+#include "nxrom.h"
+
+
+// ======================> nes_cufrom_device
+
+class nes_cufrom_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_cufrom_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+};
+
+
+// ======================> nes_unrom512_device
+
+class nes_unrom512_device : public nes_nrom_device
+{
+public:
+ // construction/destruction
+ nes_unrom512_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ virtual void write_h(offs_t offset, u8 data) override;
+
+ virtual void pcb_reset() override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(NES_CUFROM, nes_cufrom_device)
+DECLARE_DEVICE_TYPE(NES_UNROM512, nes_unrom512_device)
+
+#endif // MAME_BUS_NES_SEALIE_H
diff --git a/src/mame/machine/nes.cpp b/src/mame/machine/nes.cpp
index 9dd876039e6..43f55e607d0 100644
--- a/src/mame/machine/nes.cpp
+++ b/src/mame/machine/nes.cpp
@@ -72,7 +72,7 @@ void nes_state::machine_start()
// install additional handlers (read_h, read_ex, write_ex)
if (m_cartslot->get_pcb_id() == STD_EXROM || m_cartslot->get_pcb_id() == STD_NROM368 || m_cartslot->get_pcb_id() == STD_DISKSYS
|| m_cartslot->get_pcb_id() == GG_NROM || m_cartslot->get_pcb_id() == CAMERICA_ALADDIN || m_cartslot->get_pcb_id() == SUNSOFT_DCS
- || m_cartslot->get_pcb_id() == BANDAI_DATACH || m_cartslot->get_pcb_id() == BANDAI_KARAOKE || m_cartslot->get_pcb_id() == BTL_2A03_PURITANS || m_cartslot->get_pcb_id() == AVE_MAXI15
+ || m_cartslot->get_pcb_id() == BANDAI_DATACH || m_cartslot->get_pcb_id() == BANDAI_KARAOKE || m_cartslot->get_pcb_id() == UNL_2A03PURITANS || m_cartslot->get_pcb_id() == AVE_MAXI15
|| m_cartslot->get_pcb_id() == KAISER_KS7022 || m_cartslot->get_pcb_id() == KAISER_KS7031 || m_cartslot->get_pcb_id() == KAISER_KS7037 || m_cartslot->get_pcb_id() == BMC_VT5201
|| m_cartslot->get_pcb_id() == UNL_LH32 || m_cartslot->get_pcb_id() == UNL_LH10 || m_cartslot->get_pcb_id() == UNL_2708 || m_cartslot->get_pcb_id() == UNL_RT01
|| m_cartslot->get_pcb_id() == UNL_43272 || m_cartslot->get_pcb_id() == BMC_G63IN1 || m_cartslot->get_pcb_id() == BMC_8157