add mapper 29 and preliminary mapper 30 support (#8225)

New working software list additions
-----------------------------------
2A03Puritans [rainwarrior]
E.T. [KHAN]
Glider [anonymous]

* mapper 29: support should be complete but there are few if any other homebrew roms to test against
* mapper 30: only supports the most basic board that doesn't use flashable memory - tested on a dozen or so roms, all working
* add a game each for mappers 29 (Glider), 30 (E.T.), and 31 (2A03Puritans) so there is something in the software lists to actually test against. Glider is discontinued by manufacture, the other two are freely available from their authors.
 * various naming clean ups, like BTL- prefixes for things that are not bootlegs
This commit is contained in:
0kmg 2021-06-25 13:39:09 -08:00 committed by GitHub
parent c1108932a4
commit 8796124eb4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 271 additions and 20 deletions

View File

@ -77050,6 +77050,61 @@ be better to redump them properly. -->
</software> </software>
<!-- These are more recent dumps of unlicensed homebrew games that have been released on cartridge. They need to be verified against physical carts. -->
<software name="puritans">
<description>2A03Puritans</description>
<year>2013</year>
<publisher>Infinite NES Lives</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="2a03pur" />
<feature name="mirroring" value="horizontal" />
<dataarea name="prg" size="1048576">
<rom name="2a03puritans.prg" size="1048576" crc="5baee143" sha1="5024cf5f53995119892067603bed3e23c3655e9e" status="baddump" />
</dataarea>
<!-- 8 VRAM on cartridge -->
<dataarea name="vram" size="8192">
</dataarea>
</part>
</software>
<!-- Author self-published through mail order, carts made by RetroZone -->
<software name="et">
<description>E.T.</description>
<year>2014</year>
<publisher>&lt;homebrew&gt;</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="unrom512" />
<feature name="mirroring" value="vertical" />
<dataarea name="prg" size="131072">
<rom name="et.prg" size="131072" crc="9e8eca2c" sha1="fa88ca7cadca763eb68e606c97ebf9a4302eedfd" status="baddump" />
</dataarea>
<!-- 8 VRAM on cartridge? -->
<dataarea name="vram" size="8192">
</dataarea>
</part>
</software>
<software name="glider">
<description>Glider</description>
<year>2008</year>
<publisher>RetroZone</publisher>
<part name="cart" interface="nes_cart">
<feature name="slot" value="cufrom" />
<feature name="mirroring" value="vertical" />
<dataarea name="prg" size="131072">
<rom name="glider.prg" size="131072" crc="1b00c2b3" sha1="670fbb3c9a3f51a878d68a45930ee3fab4beb8dd" status="baddump" />
</dataarea>
<!-- 32k VRAM on cartridge -->
<dataarea name="vram" size="32768">
</dataarea>
<!-- 8k WRAM on cartridge -->
<dataarea name="wram" size="8192">
</dataarea>
</part>
</software>
<!-- Multicarts using homebrew mapper #28. These have their origin in NESDev competitions. The following roms are freely available digital releases. They need to be checked against commercial physical carts. --> <!-- Multicarts using homebrew mapper #28. These have their origin in NESDev competitions. The following roms are freely available digital releases. They need to be checked against commercial physical carts. -->
<software name="a53vol1"> <software name="a53vol1">
@ -77057,9 +77112,9 @@ be better to redump them properly. -->
<year>2013</year> <year>2013</year>
<publisher>Infinite NES Lives</publisher> <publisher>Infinite NES Lives</publisher>
<part name="cart" interface="nes_cart"> <part name="cart" interface="nes_cart">
<feature name="slot" value="nes_action53" /> <feature name="slot" value="action53" />
<dataarea name="prg" size="524288"> <dataarea name="prg" size="524288">
<rom name="action 53 volume 1.prg" size="524288" crc="6441e8f6" sha1="da92a26ecc64767fdbb63ab8b2d9e7dcd7884fcc" offset="00000" /> <rom name="action 53 volume 1.prg" size="524288" crc="6441e8f6" sha1="da92a26ecc64767fdbb63ab8b2d9e7dcd7884fcc" status="baddump" />
</dataarea> </dataarea>
<!-- 32k VRAM on cartridge? --> <!-- 32k VRAM on cartridge? -->
<dataarea name="vram" size="32768"> <dataarea name="vram" size="32768">
@ -77072,9 +77127,9 @@ be better to redump them properly. -->
<year>2014</year> <year>2014</year>
<publisher>Infinite NES Lives</publisher> <publisher>Infinite NES Lives</publisher>
<part name="cart" interface="nes_cart"> <part name="cart" interface="nes_cart">
<feature name="slot" value="nes_action53" /> <feature name="slot" value="action53" />
<dataarea name="prg" size="524288"> <dataarea name="prg" size="524288">
<rom name="action 53 volume 2.prg" size="524288" crc="6e61971f" sha1="cb2c6dc8c8be3ee738ad8a793a75475553506e14" offset="00000" /> <rom name="action 53 volume 2.prg" size="524288" crc="6e61971f" sha1="cb2c6dc8c8be3ee738ad8a793a75475553506e14" status="baddump" />
</dataarea> </dataarea>
<!-- 32k VRAM on cartridge? --> <!-- 32k VRAM on cartridge? -->
<dataarea name="vram" size="32768"> <dataarea name="vram" size="32768">
@ -77087,9 +77142,9 @@ be better to redump them properly. -->
<year>2018</year> <year>2018</year>
<publisher>Infinite NES Lives</publisher> <publisher>Infinite NES Lives</publisher>
<part name="cart" interface="nes_cart"> <part name="cart" interface="nes_cart">
<feature name="slot" value="nes_action53" /> <feature name="slot" value="action53" />
<dataarea name="prg" size="1048576"> <dataarea name="prg" size="1048576">
<rom name="action 53 volume 3.prg" size="1048576" crc="660f8e82" sha1="85c67c171f77a47566f4b9ead1a352c02e2e07a6" offset="00000" /> <rom name="action 53 volume 3.prg" size="1048576" crc="660f8e82" sha1="85c67c171f77a47566f4b9ead1a352c02e2e07a6" status="baddump" />
</dataarea> </dataarea>
<!-- 32k VRAM on cartridge? Sinking Feeling needs this much. --> <!-- 32k VRAM on cartridge? Sinking Feeling needs this much. -->
<dataarea name="vram" size="32768"> <dataarea name="vram" size="32768">

View File

@ -2833,6 +2833,8 @@ if (BUSES["NES"]~=null) then
MAME_DIR .. "src/devices/bus/nes/rexsoft.h", MAME_DIR .. "src/devices/bus/nes/rexsoft.h",
MAME_DIR .. "src/devices/bus/nes/sachen.cpp", MAME_DIR .. "src/devices/bus/nes/sachen.cpp",
MAME_DIR .. "src/devices/bus/nes/sachen.h", 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.cpp",
MAME_DIR .. "src/devices/bus/nes/somari.h", MAME_DIR .. "src/devices/bus/nes/somari.h",
MAME_DIR .. "src/devices/bus/nes/subor.cpp", MAME_DIR .. "src/devices/bus/nes/subor.cpp",

View File

@ -7,7 +7,7 @@
Here we emulate the PCB designed by infiniteneslives and 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 The main difference of this PCB compared to others is that it
uses 4k PRG banks! uses 4k PRG banks!

View File

@ -8,7 +8,7 @@
#include "nxrom.h" #include "nxrom.h"
// ======================> nes_racermate_device // ======================> nes_2a03pur_device
class nes_2a03pur_device : public nes_nrom_device class nes_2a03pur_device : public nes_nrom_device
{ {

View File

@ -51,6 +51,7 @@
#include "rcm.h" #include "rcm.h"
#include "rexsoft.h" #include "rexsoft.h"
#include "sachen.h" #include "sachen.h"
#include "sealie.h"
#include "somari.h" #include "somari.h"
#include "subor.h" #include "subor.h"
#include "tengen.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("bmc_830118c", NES_BMC_830118C);
device.option_add_internal("pjoy84", NES_PJOY84); device.option_add_internal("pjoy84", NES_PJOY84);
device.option_add_internal("nocash_nochr", NES_NOCHR); device.option_add_internal("nocash_nochr", NES_NOCHR);
device.option_add_internal("nes_action53", NES_ACTION53); device.option_add_internal("action53", NES_ACTION53);
device.option_add_internal("nes_2a03pur", NES_2A03PURITANS); device.option_add_internal("cufrom", NES_CUFROM);
device.option_add_internal("unrom512", NES_UNROM512);
device.option_add_internal("2a03pur", NES_2A03PURITANS);
// other unsupported... // other unsupported...
device.option_add_internal("ninjaryu", NES_NROM); // mapper 111 - UNSUPPORTED device.option_add_internal("ninjaryu", NES_NROM); // mapper 111 - UNSUPPORTED
device.option_add_internal("unl_dance", NES_NROM); // UNSUPPORTED device.option_add_internal("unl_dance", NES_NROM); // UNSUPPORTED

View File

@ -59,10 +59,10 @@ static const nes_mmc mmc_list[] =
{ 25, KONAMI_VRC4 }, { 25, KONAMI_VRC4 },
{ 26, KONAMI_VRC6 }, { 26, KONAMI_VRC6 },
{ 27, UNL_WORLDHERO }, // 27 World Hero board - Unsupported { 27, UNL_WORLDHERO }, // 27 World Hero board - Unsupported
{ 28, BTL_ACTION53 }, // 28 - Multi-discrete PCB designed by Tepples for Action 53 { 28, UNL_ACTION53 }, // 28 - Multi-discrete PCB designed by Tepples for Action 53
// 29 Unused { 29, UNL_CUFROM }, // 29 - homebrew PCB used by Glider
// 30 UNROM 512 + Flash, currently unsupported { 30, UNL_UNROM512 }, // 30 - UNROM 512 + Flash
{ 31, BTL_2A03_PURITANS }, // 31 - PCB designed by infinitelives & rainwarrior for 2A03 Puritans Album { 31, UNL_2A03PURITANS }, // 31 - PCB designed by infinitelives & rainwarrior for 2A03 Puritans Album
{ 32, IREM_G101 }, { 32, IREM_G101 },
{ 33, TAITO_TC0190FMC }, { 33, TAITO_TC0190FMC },
{ 34, STD_BXROM }, { 34, STD_BXROM },
@ -134,7 +134,7 @@ static const nes_mmc mmc_list[] =
// 100 images hacked to work with nesticle? // 100 images hacked to work with nesticle?
// 101 Unused (Urusei Yatsura had been assigned to this mapper, but it's Mapper 87) // 101 Unused (Urusei Yatsura had been assigned to this mapper, but it's Mapper 87)
// 102 Unused // 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 }, { 104, CAMERICA_GOLDENFIVE },
{ 105, STD_EVENT }, { 105, STD_EVENT },
{ 106, BTL_SMB3 }, { 106, BTL_SMB3 },
@ -564,6 +564,28 @@ void nes_cart_slot_device::call_load_ines()
} }
break; 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: case STD_CNROM:
if (mapper == 185 && !submapper) if (mapper == 185 && !submapper)
{ {

View File

@ -309,8 +309,10 @@ static const nes_pcb pcb_list[] =
{ "tf1201", UNL_TF1201 }, { "tf1201", UNL_TF1201 },
{ "unl_cfight", UNL_CITYFIGHT }, { "unl_cfight", UNL_CITYFIGHT },
{ "nocash_nochr", NOCASH_NOCHR }, { "nocash_nochr", NOCASH_NOCHR },
{ "nes_action53", BTL_ACTION53 }, { "action53", UNL_ACTION53 },
{ "nes_2a03pur", BTL_2A03_PURITANS }, { "cufrom", UNL_CUFROM },
{ "unrom512", UNL_UNROM512 },
{ "2a03pur", UNL_2A03PURITANS },
{ "ffe3", FFE3_BOARD }, { "ffe3", FFE3_BOARD },
{ "ffe4", FFE4_BOARD }, { "ffe4", FFE4_BOARD },
{ "ffe8", FFE8_BOARD }, { "ffe8", FFE8_BOARD },

View File

@ -129,8 +129,8 @@ enum
KAY_BOARD, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD, KAY_BOARD, HOSENKAN_BOARD, NITRA_TDA, GOUDER_37017, NANJING_BOARD,
WHIRLWIND_2706, ZEMINA_BOARD, WHIRLWIND_2706, ZEMINA_BOARD,
NOCASH_NOCHR, // homebrew PCB design which uses NTRAM for CHRRAM NOCASH_NOCHR, // homebrew PCB design which uses NTRAM for CHRRAM
BTL_ACTION53, // homebrew PCB for homebrew multicarts UNL_ACTION53, // homebrew PCB for homebrew multicarts
BTL_2A03_PURITANS, // homebrew PCB UNL_CUFROM, UNL_UNROM512, UNL_2A03PURITANS, // homebrew PCBs
/* FFE boards, for mappers 6, 8, 17 */ /* FFE boards, for mappers 6, 8, 17 */
FFE3_BOARD, FFE4_BOARD, FFE8_BOARD, TEST_BOARD, FFE3_BOARD, FFE4_BOARD, FFE8_BOARD, TEST_BOARD,
/* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */ /* Unsupported (for place-holder boards, with no working emulation) & no-board (at init) */

View File

@ -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);
}

View File

@ -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

View File

@ -72,7 +72,7 @@ void nes_state::machine_start()
// install additional handlers (read_h, read_ex, write_ex) // 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 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() == 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() == 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_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 || m_cartslot->get_pcb_id() == UNL_43272 || m_cartslot->get_pcb_id() == BMC_G63IN1 || m_cartslot->get_pcb_id() == BMC_8157