summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author 0kmg <9137159+0kmg@users.noreply.github.com>2021-11-20 09:06:56 -0900
committer GitHub <noreply@github.com>2021-11-20 13:06:56 -0500
commitc55b1ec88816b10cd62ffcd3bd88aef97a3632da (patch)
tree90ca808315bc021492c047d471df0a33b52613ed /src
parentb774465e41ab0a5f1df477bafc6708201cbff894 (diff)
bus/nes: Added support for boards using the SMD133 ASIC. (#8840)
* bus/nes: Added support for boards using the SMD133 ASIC. New working software list additions (nes.xml) ----------------------------------- Data East All-Star Collection [anonymous] Mega Man 8 in 1 (PL-0006) [anonymous] Super Games 143 in 1 (The Best Games of NES) [anonymous] Software list items promoted to working (nes.xml) --------------------------------------- CoolBoy 198 in 1 CoolBoy 400 in 1 CoolBoy 400 in 1 (alt, 403 games) Game 450 in 1 Game 500 in 1 Pocket Games 150 in 1 Super Game 218 in 1 (JF2181) Super Game 360 in 1 Super Game 402 in 1
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/nes/mmc3_clones.cpp94
-rw-r--r--src/devices/bus/nes/mmc3_clones.h22
-rw-r--r--src/devices/bus/nes/nes_carts.cpp2
-rw-r--r--src/devices/bus/nes/nes_ines.hxx12
-rw-r--r--src/devices/bus/nes/nes_pcb.hxx13
-rw-r--r--src/devices/bus/nes/nes_slot.cpp1
-rw-r--r--src/devices/bus/nes/nes_slot.h4
-rw-r--r--src/mame/drivers/nes_vt369_vtunknown.cpp9
-rw-r--r--src/mame/mame.lst1
9 files changed, 121 insertions, 37 deletions
diff --git a/src/devices/bus/nes/mmc3_clones.cpp b/src/devices/bus/nes/mmc3_clones.cpp
index 1f289cf3899..2021976a97f 100644
--- a/src/devices/bus/nes/mmc3_clones.cpp
+++ b/src/devices/bus/nes/mmc3_clones.cpp
@@ -86,7 +86,7 @@ DEFINE_DEVICE_TYPE(NES_BMC_830832C, nes_bmc_830832c_device, "nes_bmc_830832c
DEFINE_DEVICE_TYPE(NES_BMC_YY841101C, nes_bmc_yy841101c_device, "nes_bmc_yy841101c", "NES Cart BMC YY841101C PCB")
DEFINE_DEVICE_TYPE(NES_BMC_YY841155C, nes_bmc_yy841155c_device, "nes_bmc_yy841155c", "NES Cart BMC YY841155C PCB")
DEFINE_DEVICE_TYPE(NES_PJOY84, nes_pjoy84_device, "nes_pjoy84", "NES Cart Powerjoy 84 PCB")
-DEFINE_DEVICE_TYPE(NES_COOLBOY, nes_coolboy_device, "nes_coolboy", "NES Cart CoolBoy PCB")
+DEFINE_DEVICE_TYPE(NES_SMD133, nes_smd133_device, "nes_smd133", "NES Cart SMD133 PCB")
INPUT_PORTS_START( sachen_shero )
@@ -438,8 +438,8 @@ nes_pjoy84_device::nes_pjoy84_device(const machine_config &mconfig, const char *
{
}
-nes_coolboy_device::nes_coolboy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : nes_txrom_device(mconfig, NES_COOLBOY, tag, owner, clock)
+nes_smd133_device::nes_smd133_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock)
+ : nes_txrom_device(mconfig, NES_SMD133, tag, owner, clock)
{
}
@@ -1025,6 +1025,20 @@ void nes_pjoy84_device::pcb_reset()
mmc3_common_initialize(m_prg_mask, m_chr_mask, 0);
}
+void nes_smd133_device::device_start()
+{
+ mmc3_start();
+ save_item(NAME(m_reg));
+}
+
+void nes_smd133_device::pcb_reset()
+{
+ m_chr_source = m_vrom_chunks ? CHRROM : CHRRAM;
+
+ std::fill(std::begin(m_reg), std::end(m_reg), 0x00);
+ mmc3_common_initialize(0x3f, 0xff, 0);
+}
+
/*-------------------------------------------------
@@ -3019,7 +3033,7 @@ void nes_bmc_gn45_device::write_m(offs_t offset, u8 data)
{
LOG_MMC(("bmc_gn45 write_m, offset: %04x, data: %02x\n", offset, data));
- nes_txrom_device::write_m(offset, data); // write to overlapping WRAM
+ nes_txrom_device::write_m(offset, data); // registers overlay WRAM
if (!m_lock)
{
@@ -3644,32 +3658,78 @@ void nes_pjoy84_device::write_m(offs_t offset, uint8_t data)
/*-------------------------------------------------
- COOLBOY
+ COOLBOY, MINDKIDS, and others with SMD132/133 chips
+
+ Games: many multicarts, Chinese games, and some
+ modern re-releases such as Metal Storm and Holy Diver
- Games: several multigame carts
+ NES 2.0: mapper 268
- In MESS: Not Supported.
+ In MAME: Partially supported.
+
+ TODO: There are many unimplemented features, though
+ there may be no carts that use them. Some of the
+ unemulated stuff: regs 4 and 5 not used, more GNROM
+ bits in reg 2, "weird" modes, WRAM at 0x5000, etc.
-------------------------------------------------*/
-void nes_coolboy_device::prg_cb(int start, int bank)
+void nes_smd133_device::prg_cb(int start, int bank)
{
- bank = (bank & 3) | ((bank & 8) >> 1) | ((bank & 4) << 1);
+ if (BIT(m_reg[3], 4)) // GNROM mode
+ {
+ u8 mask = (m_reg[1] & 0x02) | 0x01;
+ bank &= ~0x0f;
+ bank |= (m_reg[3] & ~mask & 0x0f) | (start & mask);
+ }
+
prg8_x(start, bank);
}
-void nes_coolboy_device::chr_cb(int start, int bank, int source)
+void nes_smd133_device::chr_cb(int start, int bank, int source)
{
- bank = (bank & 0xdd) | ((bank & 0x20) >> 4) | ((bank & 2) << 4);
+ if (BIT(m_reg[3], 4)) // GNROM mode
+ {
+ bank &= ~m_chr_mask;
+ bank |= (m_reg[2] & 0x0f) << 3 | start;
+ }
+
chr1_x(start, bank, source);
}
-void nes_coolboy_device::write_m(offs_t offset, uint8_t data)
+void nes_smd133_device::smd133_write(offs_t offset, u8 data)
{
- LOG_MMC(("coolboy write_m, offset: %04x, data: %02x\n", offset, data));
+ int reg = offset & 0x07;
- m_reg[offset & 0x03] = data;
- //set_base_mask();
- set_chr(m_chr_source, m_chr_base, m_chr_mask);
- set_prg(m_prg_base, m_prg_mask);
+ if (reg < 6 && (BIT(m_reg[3], 4) || !BIT(m_reg[3], 7)))
+ {
+ m_reg[reg] = data;
+
+ m_prg_base = (m_reg[0] & 0x30) << 6 | (m_reg[1] & 0x0c) << 6 | (m_reg[1] & 0x10) << 3 | (m_reg[0] & 0x07) << 4;
+ m_prg_mask = (bitswap<3>(m_reg[1], 5, 6, 7) << 5 | (m_reg[0] & 0x40) >> 2 | 0x0f) ^ 0x30;
+ set_prg(m_prg_base, m_prg_mask);
+
+ m_chr_base = (m_reg[0] & 0x80) & ((m_reg[0] & 0x08) << 4);
+ m_chr_mask = 0xff >> BIT(m_reg[0], 7);
+ set_chr(m_chr_source, m_chr_base, m_chr_mask);
+ }
+}
+
+void nes_smd133_device::write_l(offs_t offset, u8 data)
+{
+ LOG_MMC(("smd133 write_l, offset: %04x, data: %02x\n", offset, data));
+
+ offset += 0x100;
+ if (offset >= 0x1000 && m_smd133_addr == 0x5000)
+ smd133_write(offset, data);
+}
+
+void nes_smd133_device::write_m(offs_t offset, u8 data)
+{
+ LOG_MMC(("smd133 write_m, offset: %04x, data: %02x\n", offset, data));
+
+ nes_txrom_device::write_m(offset, data); // registers overlay WRAM
+
+ if (offset < 0x1000 && m_smd133_addr == 0x6000)
+ smd133_write(offset, data);
}
diff --git a/src/devices/bus/nes/mmc3_clones.h b/src/devices/bus/nes/mmc3_clones.h
index faeacccb091..f71adaac9ef 100644
--- a/src/devices/bus/nes/mmc3_clones.h
+++ b/src/devices/bus/nes/mmc3_clones.h
@@ -1123,21 +1123,29 @@ private:
uint8_t m_reg[4];
};
-// ======================> nes_coolboy_device
-class nes_coolboy_device : public nes_txrom_device
+// ======================> nes_smd133_device
+
+class nes_smd133_device : public nes_txrom_device
{
public:
// construction/destruction
- nes_coolboy_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ nes_smd133_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
- // device-level overrides
- virtual void write_m(offs_t offset, uint8_t data) override;
+ virtual void write_l(offs_t offset, u8 data) override;
+ virtual void write_m(offs_t offset, u8 data) override;
virtual void prg_cb(int start, int bank) override;
virtual void chr_cb(int start, int bank, int source) override;
+ virtual void pcb_reset() override;
+
+protected:
+ // device-level overrides
+ virtual void device_start() override;
+
private:
- uint8_t m_reg[4];
+ void smd133_write(offs_t offset, u8 data);
+ u8 m_reg[6];
};
@@ -1200,6 +1208,6 @@ DECLARE_DEVICE_TYPE(NES_BMC_830832C, nes_bmc_830832c_device)
DECLARE_DEVICE_TYPE(NES_BMC_YY841101C, nes_bmc_yy841101c_device)
DECLARE_DEVICE_TYPE(NES_BMC_YY841155C, nes_bmc_yy841155c_device)
DECLARE_DEVICE_TYPE(NES_PJOY84, nes_pjoy84_device)
-DECLARE_DEVICE_TYPE(NES_COOLBOY, nes_coolboy_device)
+DECLARE_DEVICE_TYPE(NES_SMD133, nes_smd133_device)
#endif // MAME_BUS_NES_MMC3_CLONES_H
diff --git a/src/devices/bus/nes/nes_carts.cpp b/src/devices/bus/nes/nes_carts.cpp
index c7911546d70..9e3249ae928 100644
--- a/src/devices/bus/nes/nes_carts.cpp
+++ b/src/devices/bus/nes/nes_carts.cpp
@@ -447,6 +447,7 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("nt639", NES_NT639);
device.option_add_internal("resettxrom", NES_RESETTXROM);
device.option_add_internal("s24in1c03", NES_S24IN1SC03);
+ device.option_add_internal("smd133", NES_SMD133);
device.option_add_internal("tech9in1", NES_TECHLINE9IN1);
device.option_add_internal("bmc_8in1", NES_BMC_8IN1);
device.option_add_internal("bmc_15in1", NES_BMC_15IN1);
@@ -484,7 +485,6 @@ void nes_cart(device_slot_interface &device)
device.option_add_internal("unl_dance", NES_NROM); // UNSUPPORTED
device.option_add_internal("onebus", NES_NROM); // UNSUPPORTED
device.option_add_internal("pec586", NES_NROM); // UNSUPPORTED
- device.option_add_internal("coolboy", NES_NROM); // UNSUPPORTED
device.option_add_internal("unl_drgnfgt", NES_NROM); // UNSUPPORTED
// are there dumps of games with these boards?
device.option_add_internal("bmc_hik_kof", NES_NROM); // mapper 251 - UNSUPPORTED
diff --git a/src/devices/bus/nes/nes_ines.hxx b/src/devices/bus/nes/nes_ines.hxx
index 7ebaf16f0c9..ddffcae5695 100644
--- a/src/devices/bus/nes/nes_ines.hxx
+++ b/src/devices/bus/nes/nes_ines.hxx
@@ -303,7 +303,7 @@ static const nes_mmc mmc_list[] =
{ 265, BMC_T262 },
{ 266, UNL_CITYFIGHT },
{ 267, BMC_EL861121C },
- // 268 COOLBOY and MINDKIDS
+ { 268, SMD133_BOARD },
// 269 mc_gx121 seems to be a PnP, but there are two actual multicarts for this mapper?
// 270 multicarts on OneBus Famiclones
// 271 TXC 4 in 1 MGC-026, not in nes.xml?
@@ -753,6 +753,16 @@ void nes_cart_slot_device::call_load_ines()
submapper = 0;
logerror("Unimplemented NES 2.0 submapper: CAMERICA-BF9096.\n");
}
+ // 268: SMD133 boards
+ else if (mapper == 268)
+ {
+ if (submapper == 0)
+ m_cart->set_smd133_addr(0x6000);
+ else if (submapper == 1)
+ m_cart->set_smd133_addr(0x5000);
+ else
+ logerror("Unimplemented NES 2.0 submapper: %d\n", submapper);
+ }
// 313: BMC RESET-TXROM
else if (mapper == 313)
{
diff --git a/src/devices/bus/nes/nes_pcb.hxx b/src/devices/bus/nes/nes_pcb.hxx
index 2d1c0214955..f625aef1ccc 100644
--- a/src/devices/bus/nes/nes_pcb.hxx
+++ b/src/devices/bus/nes/nes_pcb.hxx
@@ -319,6 +319,7 @@ static const nes_pcb pcb_list[] =
{ "resetsxrom", BMC_RESETSXROM },
{ "resettxrom", BMC_RESETTXROM },
{ "s24in1c03", BMC_S24IN1SC03 },
+ { "smd133", SMD133_BOARD },
{ "tech9in1", BMC_TECHLINE9IN1 },
{ "bmc_8in1", BMC_8IN1 },
{ "bmc_15in1", BMC_15IN1 },
@@ -395,7 +396,6 @@ static const nes_pcb pcb_list[] =
{ "unl_dance", UNSUPPORTED_BOARD },
{ "bmc_hik_kof", UNSUPPORTED_BOARD },
{ "onebus", UNSUPPORTED_BOARD },
- { "coolboy", UNSUPPORTED_BOARD },
{ "pec586", UNSUPPORTED_BOARD },
{ "test", TEST_BOARD },
{ "unknown", UNKNOWN_BOARD } // a few pirate dumps uses the wrong mapper...
@@ -678,6 +678,17 @@ void nes_cart_slot_device::call_load_pcb()
m_cart->set_n163_vol(n163_get_submapper_num(get_feature("n163-vol")));
}
+ // get address of SMD133 chip on boards that use it
+ if (m_pcb_id == SMD133_BOARD)
+ {
+ const char *addr = get_feature("smd133-addr");
+ int val = 6;
+
+ if (addr == nullptr || sscanf(addr, "%u%*c", &val) != 1 || val < 5 || val > 6)
+ logerror("Unexpected smd133-addr: %s\n", addr ? addr : "(nullptr)");
+ m_cart->set_smd133_addr(val * 0x1000);
+ }
+
// get outer PRG bank size for multicart boards that use this feature
if (m_pcb_id == BMC_EL860947C || m_pcb_id == BMC_RESETTXROM)
{
diff --git a/src/devices/bus/nes/nes_slot.cpp b/src/devices/bus/nes/nes_slot.cpp
index 19098e80479..fac3c7c1758 100644
--- a/src/devices/bus/nes/nes_slot.cpp
+++ b/src/devices/bus/nes/nes_slot.cpp
@@ -129,6 +129,7 @@ device_nes_cart_interface::device_nes_cart_interface(const machine_config &mconf
, m_n163_vol(0)
, m_outer_prg_size(0)
, m_outer_chr_size(0)
+ , m_smd133_addr(0x6000)
, m_mirroring(PPU_MIRROR_NONE)
, m_pcb_ctrl_mirror(false)
, m_four_screen_vram(false)
diff --git a/src/devices/bus/nes/nes_slot.h b/src/devices/bus/nes/nes_slot.h
index 8509e2a74c2..2648a09bc1b 100644
--- a/src/devices/bus/nes/nes_slot.h
+++ b/src/devices/bus/nes/nes_slot.h
@@ -136,7 +136,7 @@ enum
OPENCORP_DAOU306, HES_BOARD, SVISION16_BOARD, RUMBLESTATION_BOARD, JYCOMPANY_A, JYCOMPANY_B, JYCOMPANY_C,
MAGICSERIES_MD, KASING_BOARD, FUTUREMEDIA_BOARD, FUKUTAKE_BOARD, SOMARI_SL12, SOMARI_HUANG2,
HENGG_SRICH, HENGG_XHZS, HENGG_SHJY3, SUBOR_TYPE0, SUBOR_TYPE1, SUBOR_TYPE2,
- CNE_DECATHLON, CNE_FSB, CNE_SHLZ, COCOMA_BOARD, CONY_BOARD, YOKO_BOARD,
+ CNE_DECATHLON, CNE_FSB, CNE_SHLZ, COCOMA_BOARD, CONY_BOARD, SMD133_BOARD, YOKO_BOARD,
RCM_GS2015, RCM_GS2004, RCM_GS2013, RCM_TF9IN1, RCM_3DBLOCK,
WAIXING_TYPE_A, WAIXING_TYPE_A1, WAIXING_TYPE_B, WAIXING_TYPE_C, WAIXING_TYPE_D,
WAIXING_TYPE_E, WAIXING_TYPE_F, WAIXING_TYPE_G, WAIXING_TYPE_H, WAIXING_TYPE_H1,
@@ -228,6 +228,7 @@ public:
void set_n163_vol(int vol) { m_n163_vol = vol; }
void set_outer_prg_size(int val) { m_outer_prg_size = val; }
void set_outer_chr_size(int val) { m_outer_chr_size = val; }
+ void set_smd133_addr(int val) { m_smd133_addr = val; }
void set_x1_005_alt(bool val) { m_x1_005_alt_mirroring = val; }
void set_bus_conflict(bool val) { m_bus_conflict = val; }
uint8_t get_open_bus() { return m_open_bus; }
@@ -303,6 +304,7 @@ protected:
int m_n163_vol;
int m_outer_prg_size;
int m_outer_chr_size;
+ int m_smd133_addr;
int m_mirroring;
bool m_pcb_ctrl_mirror, m_four_screen_vram, m_has_trainer;
diff --git a/src/mame/drivers/nes_vt369_vtunknown.cpp b/src/mame/drivers/nes_vt369_vtunknown.cpp
index 421691e63fb..e77d942c6bd 100644
--- a/src/mame/drivers/nes_vt369_vtunknown.cpp
+++ b/src/mame/drivers/nes_vt369_vtunknown.cpp
@@ -411,7 +411,7 @@ void nes_vt369_vtunknown_cy_state::nes_vt369_vtunknown_bt(machine_config &config
void nes_vt369_vtunknown_cy_state::bittboy_412c_w(uint8_t data)
{
- //bittboy (ok), mc_pg150 (not working)
+ // bittboy (ok)
logerror("%s: vt03_412c_extbank_w %02x\n", machine().describe_context(), data);
m_ahigh = (data & 0x04) ? (1 << 24) : 0x0;
}
@@ -698,11 +698,6 @@ ROM_START( bittboy )
ROM_LOAD( "bittboy_flash_read_s29gl256n-tf-v2.bin", 0x00000, 0x2000000, CRC(24c802d7) SHA1(c1300ff799b93b9b53060b94d3985db4389c5d3a) )
ROM_END
-ROM_START( mc_pg150 )
- ROM_REGION( 0x2000000, "mainrom", 0 )
- ROM_LOAD( "pocketgames150-in1.bin", 0x00000, 0x2000000, CRC(32f1176b) SHA1(2cfd9b61ebdfc328f020ae9bd5e5e2219321e828) )
-ROM_END
-
ROM_START( mc_hh210 )
ROM_REGION( 0x1000000, "mainrom", 0 )
ROM_LOAD( "msp55lv128t.u4", 0x00000, 0x1000000, CRC(9ba520d4) SHA1(627f811b24314197e289a2ade668ff4115421bed) )
@@ -876,8 +871,6 @@ void nes_vt369_vtunknown_state::init_lxcmcypp()
// Runs well, only issues in SMB3 which crashes
CONS( 2017, bittboy, 0, 0, nes_vt369_vtunknown_bt_2x16mb, nes_vt369_vtunknown, nes_vt369_vtunknown_cy_state, empty_init, "BittBoy", "BittBoy Mini FC 300 in 1", MACHINE_IMPERFECT_GRAPHICS ) // has external banking (2x 16mbyte banks)
-// Broken GFX, investigate, is this really a system? research indicates it's a multicart for a regular NES?
-CONS( 201?, mc_pg150, 0, 0, nes_vt369_vtunknown_bt_2x16mb, nes_vt369_vtunknown, nes_vt369_vtunknown_cy_state, empty_init, "<unknown>", "Pocket Games 150 in 1", MACHINE_NOT_WORKING ) // has external banking
// No title screen, but press start and menu and games run fine. Makes odd
// memory accesses which probably explain broken title screen
CONS( 201?, mc_hh210, 0, 0, nes_vt369_vtunknown_4k_ram_16mb, nes_vt369_vtunknown, nes_vt369_vtunknown_state, empty_init, "<unknown>", "Handheld 210 in 1", MACHINE_NOT_WORKING )
diff --git a/src/mame/mame.lst b/src/mame/mame.lst
index 50bdab3195b..ee53d19ce37 100644
--- a/src/mame/mame.lst
+++ b/src/mame/mame.lst
@@ -32982,7 +32982,6 @@ lxcmcysw
lxcyber
mc_cb280
mc_hh210
-mc_pg150
mog_m320
myarccn
otrail