diff options
author | 2021-11-20 09:06:56 -0900 | |
---|---|---|
committer | 2021-11-20 13:06:56 -0500 | |
commit | c55b1ec88816b10cd62ffcd3bd88aef97a3632da (patch) | |
tree | 90ca808315bc021492c047d471df0a33b52613ed /src | |
parent | b774465e41ab0a5f1df477bafc6708201cbff894 (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.cpp | 94 | ||||
-rw-r--r-- | src/devices/bus/nes/mmc3_clones.h | 22 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_carts.cpp | 2 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_ines.hxx | 12 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_pcb.hxx | 13 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.cpp | 1 | ||||
-rw-r--r-- | src/devices/bus/nes/nes_slot.h | 4 | ||||
-rw-r--r-- | src/mame/drivers/nes_vt369_vtunknown.cpp | 9 | ||||
-rw-r--r-- | src/mame/mame.lst | 1 |
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 |