summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/nes_clone.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/nes_clone.cpp')
-rw-r--r--src/mame/drivers/nes_clone.cpp245
1 files changed, 216 insertions, 29 deletions
diff --git a/src/mame/drivers/nes_clone.cpp b/src/mame/drivers/nes_clone.cpp
index ea6a0a1bef1..5a8de850f96 100644
--- a/src/mame/drivers/nes_clone.cpp
+++ b/src/mame/drivers/nes_clone.cpp
@@ -61,6 +61,47 @@ private:
void nes_clone_map(address_map &map);
};
+
+class nes_clone_dancexpt_state : public nes_clone_state
+{
+public:
+ nes_clone_dancexpt_state(const machine_config &mconfig, device_type type, const char *tag) :
+ nes_clone_state(mconfig, type, tag),
+ m_nametables(*this, "nametable%u", 0),
+ m_prgrom(*this, "prgrom"),
+ m_gfxrom(*this, "gfxrom"),
+ m_mainrom(*this, "maincpu")
+ { }
+ void nes_clone_dancexpt(machine_config &config);
+
+private:
+ void nes_clone_dancexpt_map(address_map &map);
+ memory_bank_array_creator<4> m_nametables;
+ required_memory_bank m_prgrom;
+ memory_bank_creator m_gfxrom;
+ required_region_ptr<uint8_t> m_mainrom;
+
+ std::unique_ptr<u8[]> m_nt_ram;
+
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
+ void mapper_5000_w(offs_t offset, uint8_t data);
+ void mapper_5100_w(offs_t offset, uint8_t data);
+ void mapper_5200_w(offs_t offset, uint8_t data);
+
+ virtual uint8_t in0_r() override;
+ virtual uint8_t in1_r() override;
+ virtual void in0_w(uint8_t data) override;
+
+ void update_video_bank();
+
+ uint8_t m_5000_val;
+ uint8_t m_5100_val;
+ uint8_t m_5200_val;
+};
+
+
class nes_clone_dnce2000_state : public nes_clone_state
{
public:
@@ -141,7 +182,6 @@ public:
m_cbank(*this, "cbank%u", 0),
m_nametables(*this, "nametable%u", 0),
m_charbank(*this, "charbank"),
- m_ntbank(*this, "ntbank"),
m_rom_solderpad_bank(*this, "rom_sldpad_bank")
{ }
void nes_clone_afbm7800(machine_config& config);
@@ -180,9 +220,9 @@ private:
uint8_t m_extraregs[4];
void update_banks();
- void multigam3_mmc3_scanline_cb(int scanline, int vblank, int blanked);
- int16_t m_multigam3_mmc3_scanline_counter;
- uint8_t m_multigam3_mmc3_scanline_latch;
+ void mmc3_scanline_cb(int scanline, int vblank, int blanked);
+ int16_t m_mmc3_scanline_counter;
+ uint8_t m_mmc3_scanline_latch;
uint8_t m_mmc3_irq_enable;
std::vector<u8> m_vram;
@@ -193,19 +233,15 @@ private:
void update_nt_mirroring();
std::vector<u8> m_nt_ram;
- void multigam_nt_w(offs_t offset, uint8_t data);
- uint8_t multigam_nt_r(offs_t offset);
-
void vram_map(address_map &map);
void ntram_map(address_map &map);
void romarea_map(address_map &map);
required_memory_bank_array<4> m_prgbank;
required_memory_bank_array<6> m_cbank;
- required_memory_bank_array<4> m_nametables;
+ memory_bank_array_creator<4> m_nametables;
required_device<address_map_bank_device> m_charbank;
- required_device<address_map_bank_device> m_ntbank;
required_device<address_map_bank_device> m_rom_solderpad_bank;
};
@@ -329,6 +365,20 @@ static INPUT_PORTS_START( dnce2000 )
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED )
INPUT_PORTS_END
+
+
+static INPUT_PORTS_START( dancexpt )
+ PORT_START("IO1")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) PORT_PLAYER(1) PORT_16WAY // NOT A JOYSTICK!!
+ PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_16WAY
+ PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(1)
+ PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(1)
+ PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(1)
+ PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(1)
+INPUT_PORTS_END
+
void nes_clone_state::video_start()
{
}
@@ -398,6 +448,124 @@ void nes_clone_state::nes_clone_pal(machine_config &config)
}
/**************************************************
+ Dancing Expert specifics
+**************************************************/
+
+void nes_clone_dancexpt_state::machine_start()
+{
+ nes_clone_state::machine_start();
+
+ m_nt_ram = std::make_unique<u8[]>(0x800);
+
+ m_prgrom->configure_entries(0, 0x08, &m_mainrom[0], 0x4000);
+ m_gfxrom->configure_entries(0, 0x20, memregion("gfx1")->base(), 0x2000);
+
+ m_ppu->space(AS_PROGRAM).install_read_bank(0x0000, 0x1fff, m_gfxrom);
+
+ for (int i = 0; i < 4; i++)
+ m_nametables[i]->configure_entries(0, 2, &m_nt_ram[0], 0x400);
+
+ save_pointer(NAME(m_nt_ram), 0x800);
+
+ m_nametables[0]->set_entry(0);
+ m_nametables[1]->set_entry(1);
+ m_nametables[2]->set_entry(0);
+ m_nametables[3]->set_entry(1);
+
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2000,0x23ff,m_nametables[0]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2400,0x27ff,m_nametables[1]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2800,0x2bff,m_nametables[2]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2c00,0x2fff,m_nametables[3]);
+}
+
+
+uint8_t nes_clone_dancexpt_state::in0_r()
+{
+ // polled frequently during game, music data? from some other device?
+ return 0xfe; // bit 0x01 exits the song?
+}
+
+uint8_t nes_clone_dancexpt_state::in1_r()
+{
+ // read directly, not through shifter here
+ return m_io1->read();
+}
+
+void nes_clone_dancexpt_state::machine_reset()
+{
+ nes_clone_state::machine_reset();
+ m_5000_val = 0x6;
+}
+
+void nes_clone_dancexpt_state::update_video_bank()
+{
+ int bank = (m_previous_port0 & 0x7) * 4;
+ bank += m_5100_val & 0x3;
+
+ m_gfxrom->set_entry(bank);
+}
+
+void nes_clone_dancexpt_state::mapper_5000_w(offs_t offset, uint8_t data)
+{
+ // xxxx -bbb b = CPU bank at 8000-bfff x = unknown (sometimes 2, sometimes d)
+
+ if (data & ~0x27)
+ logerror("%s: mapper_5000_w %02x\n", machine().describe_context(), data);
+
+ m_5000_val = data;
+
+ m_prgrom->set_entry(m_5000_val & 0x7);
+}
+
+void nes_clone_dancexpt_state::mapper_5100_w(offs_t offset, uint8_t data)
+{
+ // ---- --cc c = lower character ROM bank
+
+ if (data & 0xfc)
+ logerror("%s: mapper_5100_w %02x\n", machine().describe_context(), data);
+
+ m_5100_val = data;
+ update_video_bank();
+}
+
+void nes_clone_dancexpt_state::in0_w(uint8_t data)
+{
+ // ---- -CCC C = upper character ROM bank
+
+ // instead of input related writes, the video banking is here?!
+ m_previous_port0 = data;
+ update_video_bank();
+}
+
+void nes_clone_dancexpt_state::mapper_5200_w(offs_t offset, uint8_t data)
+{
+ // ---- ---- unknown
+
+ logerror("%s: mapper_5200_w %02x\n", machine().describe_context(), data);
+ m_5200_val = data;
+ //update_video_bank();
+}
+
+void nes_clone_dancexpt_state::nes_clone_dancexpt(machine_config &config)
+{
+ nes_clone(config);
+ m_maincpu->set_addrmap(AS_PROGRAM, &nes_clone_dancexpt_state::nes_clone_dancexpt_map);
+}
+
+void nes_clone_dancexpt_state::nes_clone_dancexpt_map(address_map &map)
+{
+ nes_clone_basemap(map);
+
+ map(0x5000, 0x5000).w(FUNC(nes_clone_dancexpt_state::mapper_5000_w));
+ map(0x5100, 0x5100).w(FUNC(nes_clone_dancexpt_state::mapper_5100_w));
+ map(0x5200, 0x5200).w(FUNC(nes_clone_dancexpt_state::mapper_5200_w));
+
+ map(0x8000, 0xbfff).bankr("prgrom");
+ map(0xc000, 0xffff).rom().region("maincpu", 0x1c000);
+}
+
+
+/**************************************************
Dance 2000 Specifics
**************************************************/
@@ -639,13 +807,13 @@ void nes_clone_afbm7800_state::mapper_a001_w(uint8_t data)
void nes_clone_afbm7800_state::mapper_c000_w(uint8_t data)
{
// irq latch
- m_multigam3_mmc3_scanline_counter = data ^ 0xff;
+ m_mmc3_scanline_counter = data ^ 0xff;
}
void nes_clone_afbm7800_state::mapper_c001_w(uint8_t data)
{
// irq reload
- m_multigam3_mmc3_scanline_latch = data;
+ m_mmc3_scanline_latch = data;
}
void nes_clone_afbm7800_state::mapper_e000_w(uint8_t data)
@@ -663,15 +831,15 @@ void nes_clone_afbm7800_state::mapper_e001_w(uint8_t data)
-void nes_clone_afbm7800_state::multigam3_mmc3_scanline_cb( int scanline, int vblank, int blanked )
+void nes_clone_afbm7800_state::mmc3_scanline_cb( int scanline, int vblank, int blanked )
{
if (m_mmc3_irq_enable)
{
if (!vblank && !blanked)
{
- if (--m_multigam3_mmc3_scanline_counter == -1)
+ if (--m_mmc3_scanline_counter == -1)
{
- m_multigam3_mmc3_scanline_counter = m_multigam3_mmc3_scanline_latch;
+ m_mmc3_scanline_counter = m_mmc3_scanline_latch;
m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
}
}
@@ -816,8 +984,8 @@ void nes_clone_afbm7800_state::machine_reset()
update_banks();
update_nt_mirroring();
- m_multigam3_mmc3_scanline_counter = 0;
- m_multigam3_mmc3_scanline_latch = 0;
+ m_mmc3_scanline_counter = 0;
+ m_mmc3_scanline_latch = 0;
m_mmc3_irq_enable = 0;
}
@@ -831,15 +999,6 @@ void nes_clone_afbm7800_state::vram_w(offs_t offset, uint8_t data)
m_charbank->write8(offset, data);
}
-uint8_t nes_clone_afbm7800_state::multigam_nt_r(offs_t offset)
-{
- return m_ntbank->read8(offset);
-}
-
-void nes_clone_afbm7800_state::multigam_nt_w(offs_t offset, uint8_t data)
-{
- m_ntbank->write8(offset, data);
-}
void nes_clone_afbm7800_state::machine_start()
{
@@ -867,15 +1026,18 @@ void nes_clone_afbm7800_state::machine_start()
m_nametables[i]->configure_entries(0, 0x800 / 0x400, &m_nt_ram[0], 0x400);
m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x0000, 0x1fff, read8sm_delegate(*this, FUNC(nes_clone_afbm7800_state::vram_r)), write8sm_delegate(*this, FUNC(nes_clone_afbm7800_state::vram_w)));
- m_ppu->set_scanline_callback(*this, FUNC(nes_clone_afbm7800_state::multigam3_mmc3_scanline_cb));
+ m_ppu->set_scanline_callback(*this, FUNC(nes_clone_afbm7800_state::mmc3_scanline_cb));
- m_ppu->space(AS_PROGRAM).install_readwrite_handler(0x2000, 0x3eff, read8sm_delegate(*this, FUNC(nes_clone_afbm7800_state::multigam_nt_r)), write8sm_delegate(*this, FUNC(nes_clone_afbm7800_state::multigam_nt_w)));
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2000,0x23ff,m_nametables[0]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2400,0x27ff,m_nametables[1]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2800,0x2bff,m_nametables[2]);
+ m_ppu->space(AS_PROGRAM).install_readwrite_bank(0x2c00,0x2fff,m_nametables[3]);
save_item(NAME(m_vram));
save_item(NAME(m_nt_ram));
- save_item(NAME(m_multigam3_mmc3_scanline_counter));
- save_item(NAME(m_multigam3_mmc3_scanline_latch));
+ save_item(NAME(m_mmc3_scanline_counter));
+ save_item(NAME(m_mmc3_scanline_latch));
save_item(NAME(m_mmc3_irq_enable));
save_item(NAME(m_ntmirror));
@@ -1084,6 +1246,13 @@ ROM_START( hs36blk )
ROM_LOAD( "mx29lv160cbtc.u3", 0x00000, 0x200000, CRC(b5cf91a0) SHA1(399f015fb0580c90928e7f3d73810cc4b6cc70d9) )
ROM_END
+ROM_START( dancexpt )
+ ROM_REGION( 0x20000, "maincpu", ROMREGION_ERASE00 )
+ ROM_LOAD( "dancingexpert27c010.bin", 0x0000, 0x20000, CRC(658ba2ea) SHA1(c08f6a2735b3c7383cba3a5fa3af905d5af6926f) )
+
+ ROM_REGION( 0x40000, "gfx1", ROMREGION_ERASE00 )
+ ROM_LOAD( "dancingexpert27c020.bin", 0x00000, 0x40000, CRC(b653c40c) SHA1(9b74e56768ea5b5309df9761fb442b9be0be46e9) )
+ROM_END
void nes_clone_state::init_nes_clone()
{
@@ -1107,6 +1276,24 @@ CONS( 200?, vtvppong, 0, 0, nes_clone_vtvppong, nes_clone, nes_clone_vtvpp
CONS( 200?, pjoypj001, 0, 0, nes_clone, nes_clone, nes_clone_state, init_nes_clone, "Trump Grand", "PowerJoy (PJ001, NES based plug & play)", MACHINE_NOT_WORKING )
+//
+
+/*
+ Dancing Export by Daidaixing (aka TimeTop)
+
+ (notes from Sean Riddle regarding missing sound)
+ There are two globs on the main PCB, the bigger one next to a label that says NT6561.
+ Also two 32-pin COBs, one marked 27C020 and the other 27C010 (both dumped)
+
+ Finally, a daughterboard with 1 glob.
+ The daughterboard has 10 traces going to it; power, ground, and 7 from the smaller glob.
+ The 10th trace looks like the audio output.
+
+ I assume the daughterboard has a microcontroller for sound
+ I'm not sure what the smaller glob is, but it looks like it sends commands to the daughterboard.
+*/
+CONS( 200?, dancexpt, 0, 0, nes_clone_dancexpt, dancexpt, nes_clone_dancexpt_state, init_nes_clone, "Daidaixing", "Dancing Expert", MACHINE_NOT_WORKING )
+
CONS( 200?, vtvsocr, 0, 0, nes_clone_vtvsocr, nes_clone, nes_clone_vtvsocr_state, init_nes_clone, "<unknown>", "Virtual TV Soccer", MACHINE_NOT_WORKING )
// might be VT02 hardware, needs decrypting, possibly designed by wellminds (M350 etc.)