summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2021-02-27 00:03:25 +0900
committer GitHub <noreply@github.com>2021-02-27 02:03:25 +1100
commite8b765d2798626d0d8938a2d0934be602491e1b1 (patch)
tree7f883d63a0b88e01f25277c7caf9349a2c68bd78
parent66551ce0df437eff2b0f5dad0db8d56f3c9c3cff (diff)
namcos21*.cpp: Added save state support, and made pixel clocks more clear. (#7718)
namcos21_de.cpp: Fixed configuration flag (driveyes has 4 2Mbit PCM ROMs). namcos21.cpp: Removed unnecessary driver init, added hardware notes.
-rw-r--r--src/mame/drivers/namcos21.cpp35
-rw-r--r--src/mame/drivers/namcos21_c67.cpp10
-rw-r--r--src/mame/drivers/namcos21_de.cpp11
-rw-r--r--src/mame/machine/namcos21_dsp.cpp13
-rw-r--r--src/mame/machine/namcos21_dsp_c67.cpp22
-rw-r--r--src/mame/video/namcos21_3d.cpp6
6 files changed, 76 insertions, 21 deletions
diff --git a/src/mame/drivers/namcos21.cpp b/src/mame/drivers/namcos21.cpp
index 79ce1e2a4d5..fa57fcbd110 100644
--- a/src/mame/drivers/namcos21.cpp
+++ b/src/mame/drivers/namcos21.cpp
@@ -39,6 +39,7 @@ shade pixels according to their depth.
Winning Run
polygon glitches/flicker
posirq effects for bitmap layer not working
+ priority, mixing incorrection (specifically title screen and background color)
NOTES:
@@ -48,6 +49,11 @@ Winning Run
working
- some minor polygon glitches
- posirq handling broken
+ - priority, mixing incorrection
+
+ reference videos
+ - https://youtu.be/ZNNveBLWevg
+ - https://youtu.be/KazxHW9wQ60
*****************************
@@ -322,11 +328,10 @@ public:
void configure_c148_standard(machine_config &config);
void winrun(machine_config &config);
- void init_winrun();
-
protected:
virtual void machine_start() override;
virtual void machine_reset() override;
+ virtual void video_start() override;
private:
required_device<cpu_device> m_maincpu;
@@ -395,6 +400,15 @@ private:
void c140_map(address_map &map);
};
+void namcos21_state::video_start()
+{
+ m_gpu_videoram = std::make_unique<uint8_t[]>(0x80000);
+ m_gpu_maskram = std::make_unique<uint8_t[]>(0x80000);
+
+ save_pointer(NAME(m_gpu_videoram), 0x80000);
+ save_pointer(NAME(m_gpu_maskram), 0x80000);
+}
+
uint16_t namcos21_state::winrun_gpu_color_r()
{
return m_winrun_color;
@@ -833,6 +847,9 @@ void namcos21_state::machine_start()
for (int i = 0; i < 0x10; i++)
m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000);
+ save_item(NAME(m_video_enable));
+ save_item(NAME(m_winrun_color));
+ save_item(NAME(m_winrun_gpu_register));
}
TIMER_DEVICE_CALLBACK_MEMBER(namcos21_state::screen_scanline)
@@ -894,7 +911,7 @@ void namcos21_state::winrun(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
- m_screen->set_raw(49.152_MHz_XTAL / 2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_raw(49.152_MHz_XTAL / 4 * 2, 768, 0, 496, 264*2, 0, 480);
m_screen->set_screen_update(FUNC(namcos21_state::screen_update));
m_screen->set_palette(m_palette);
@@ -1080,19 +1097,13 @@ ROM_START( winrun91 )
ROM_LOAD( "nvram", 0x0000, 0x2000, CRC(75bcbc22) SHA1(1e7e785735d27aa8cd8393b16b589a46ecd7956a) )
ROM_END
-void namcos21_state::init_winrun()
-{
- m_gpu_videoram = std::make_unique<uint8_t[]>(0x80000);
- m_gpu_maskram = std::make_unique<uint8_t[]>(0x80000);
-}
-
} // Anonymous namespace
/* YEAR NAME PARENT MACHINE INPUT CLASS INIT MONITOR COMPANY FULLNAME FLAGS */
// Original 'Namco System 21' with C65 I/O MCU, uses TMS320C25 DSP with no custom part number
-GAME( 1988, winrun, 0, winrun, winrun, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run (World) (89/06/06, Ver.09)", MACHINE_IMPERFECT_GRAPHICS ) // Sub Ver.09, 1989, Graphic Ver .06, 89/01/14, Sound Ver.2.00
-GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan) (89/12/03, Ver.02)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // Sub Ver.02, 1989, Graphic Ver.02 89/12/03, Sound Ver.0000
+GAME( 1988, winrun, 0, winrun, winrun, namcos21_state, empty_init, ROT0, "Namco", "Winning Run (World) (89/06/06, Ver.09)", MACHINE_IMPERFECT_GRAPHICS ) // Sub Ver.09, 1989, Graphic Ver .06, 89/01/14, Sound Ver.2.00
+GAME( 1989, winrungp, 0, winrun, winrungp, namcos21_state, empty_init, ROT0, "Namco", "Winning Run Suzuka Grand Prix (Japan) (89/12/03, Ver.02)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN ) // Sub Ver.02, 1989, Graphic Ver.02 89/12/03, Sound Ver.0000
// Available on a size/cost reduced 2 PCB set with 'Namco System 21B' printed on each board, still C65 I/O MCU, appears to be functionally identical to original NS21
-GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, init_winrun, ROT0, "Namco", "Winning Run '91 (Japan) (1991/03/05, Main Ver 1.0, Sub Ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
+GAME( 1991, winrun91, 0, winrun, winrungp, namcos21_state, empty_init, ROT0, "Namco", "Winning Run '91 (Japan) (1991/03/05, Main Ver 1.0, Sub Ver 1.0)", MACHINE_IMPERFECT_GRAPHICS | MACHINE_NODEVICE_LAN )
diff --git a/src/mame/drivers/namcos21_c67.cpp b/src/mame/drivers/namcos21_c67.cpp
index 98b200292f3..24e0b88e459 100644
--- a/src/mame/drivers/namcos21_c67.cpp
+++ b/src/mame/drivers/namcos21_c67.cpp
@@ -305,6 +305,10 @@ public:
void init_solvalou();
+protected:
+ virtual void machine_start() override;
+ virtual void machine_reset() override;
+
private:
required_device<cpu_device> m_maincpu;
required_device<cpu_device> m_audiocpu;
@@ -348,9 +352,6 @@ private:
DECLARE_WRITE_LINE_MEMBER(yield_hack);
- virtual void machine_start() override;
- virtual void machine_reset() override;
-
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void configure_c68_namcos21(machine_config &config);
@@ -761,6 +762,7 @@ void namcos21_c67_state::machine_start()
for (int i = 0; i < 0x10; i++)
m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000);
+ save_item(NAME(m_video_enable));
}
TIMER_DEVICE_CALLBACK_MEMBER(namcos21_c67_state::screen_scanline)
@@ -812,7 +814,7 @@ void namcos21_c67_state::namcos21(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
- m_screen->set_raw(49.152_MHz_XTAL / 2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_raw(49.152_MHz_XTAL / 4 * 2, 768, 0, 496, 264*2, 0, 480);
m_screen->set_screen_update(FUNC(namcos21_c67_state::screen_update));
m_screen->set_palette(m_palette);
diff --git a/src/mame/drivers/namcos21_de.cpp b/src/mame/drivers/namcos21_de.cpp
index 333483c4a31..83a736f02b7 100644
--- a/src/mame/drivers/namcos21_de.cpp
+++ b/src/mame/drivers/namcos21_de.cpp
@@ -155,11 +155,11 @@ INTERRUPT_GEN_MEMBER( namco_de_pcbstack_device::irq1_line_hold ) { device.exec
void namco_de_pcbstack_device::device_add_mconfig(machine_config &config)
{
- M68000(config, m_maincpu, 12288000); /* Master */
+ M68000(config, m_maincpu, 49.152_MHz_XTAL / 4); /* Master */
m_maincpu->set_addrmap(AS_PROGRAM, &namco_de_pcbstack_device::driveyes_master_map);
TIMER(config, "scantimer").configure_scanline(FUNC(namco_de_pcbstack_device::screen_scanline), "screen", 0, 1);
- M68000(config, m_slave, 12288000); /* Slave */
+ M68000(config, m_slave, 49.152_MHz_XTAL / 4); /* Slave */
m_slave->set_addrmap(AS_PROGRAM, &namco_de_pcbstack_device::driveyes_slave_map);
MC6809E(config, m_audiocpu, 3072000); /* Sound */
@@ -180,7 +180,7 @@ void namco_de_pcbstack_device::device_add_mconfig(machine_config &config)
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
// TODO: basic parameters to get 60.606060 Hz, x2 is for interlace
- m_screen->set_raw(12288000*2, 768, 0, 496, 264*2, 0, 480);
+ m_screen->set_raw(49.152_MHz_XTAL / 4 * 2, 768, 0, 496, 264*2, 0, 480);
m_screen->set_screen_update(FUNC(namco_de_pcbstack_device::screen_update));
m_screen->set_palette(m_palette);
@@ -210,7 +210,7 @@ void namco_de_pcbstack_device::device_add_mconfig(machine_config &config)
m_c140->add_route(0, "lspeaker", 0.50);
m_c140->add_route(1, "rspeaker", 0.50);
- YM2151(config, "ymsnd", 3579580).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30);
+ YM2151(config, "ymsnd", 3.579545_MHz_XTAL).add_route(0, "lspeaker", 0.30).add_route(1, "rspeaker", 0.30);
}
@@ -461,6 +461,7 @@ void namco_de_pcbstack_device::device_start()
for (int i = 0; i < 0x10; i++)
m_audiobank->configure_entry(i, memregion("audiocpu")->base() + (i % max) * 0x4000);
+ save_item(NAME(m_video_enable));
}
void namco_de_pcbstack_device::device_reset()
@@ -592,7 +593,7 @@ static INPUT_PORTS_START( driveyes )
PORT_DIPNAME( 0x10, 0x10, "DSW5")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
- PORT_DIPNAME( 0x20, 0x00, "PCM ROM")
+ PORT_DIPNAME( 0x20, 0x20, "PCM ROM")
PORT_DIPSETTING( 0x20, "2M" )
PORT_DIPSETTING( 0x00, "4M" )
PORT_DIPNAME( 0x40, 0x40, "DSW7")
diff --git a/src/mame/machine/namcos21_dsp.cpp b/src/mame/machine/namcos21_dsp.cpp
index b4ced32be51..14810b43f07 100644
--- a/src/mame/machine/namcos21_dsp.cpp
+++ b/src/mame/machine/namcos21_dsp.cpp
@@ -30,10 +30,23 @@ void namcos21_dsp_device::device_start()
{
m_winrun_dspcomram = std::make_unique<uint16_t[]>(0x1000*2);
m_suspend_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(namcos21_dsp_device::suspend_callback),this));
+
m_pointram = std::make_unique<uint8_t[]>(PTRAM_SIZE);
m_pointram_idx = 0;
+
m_winrun_poly_index = 0;
std::fill(std::begin(m_winrun_dspcomram_control), std::end(m_winrun_dspcomram_control), 0);
+
+ save_pointer(NAME(m_pointram), PTRAM_SIZE);
+ save_item(NAME(m_pointram_idx));
+ save_item(NAME(m_pointram_control));
+
+ save_item(NAME(m_winrun_dspcomram_control));
+ save_pointer(NAME(m_winrun_dspcomram), 0x1000*2);
+ save_item(NAME(m_winrun_poly_buf));
+ save_item(NAME(m_winrun_poly_index));
+ save_item(NAME(m_winrun_pointrom_addr));
+ save_item(NAME(m_winrun_dsp_alive));
}
TIMER_CALLBACK_MEMBER(namcos21_dsp_device::suspend_callback)
diff --git a/src/mame/machine/namcos21_dsp_c67.cpp b/src/mame/machine/namcos21_dsp_c67.cpp
index 91595973c02..a33f905046c 100644
--- a/src/mame/machine/namcos21_dsp_c67.cpp
+++ b/src/mame/machine/namcos21_dsp_c67.cpp
@@ -42,6 +42,28 @@ void namcos21_dsp_c67_device::device_start()
m_mpDspState = std::make_unique<dsp_state>();
save_item(NAME(m_dspram16));
+
+ save_item(NAME(m_mpDspState->masterSourceAddr));
+ save_item(NAME(m_mpDspState->slaveInputBuffer));
+ save_item(NAME(m_mpDspState->slaveBytesAvailable));
+ save_item(NAME(m_mpDspState->slaveBytesAdvertised));
+ save_item(NAME(m_mpDspState->slaveInputStart));
+ save_item(NAME(m_mpDspState->slaveOutputBuffer));
+ save_item(NAME(m_mpDspState->slaveOutputSize));
+ save_item(NAME(m_mpDspState->masterDirectDrawBuffer));
+ save_item(NAME(m_mpDspState->masterDirectDrawSize));
+ save_item(NAME(m_mpDspState->masterFinished));
+ save_item(NAME(m_mpDspState->slaveActive));
+
+ save_pointer(NAME(m_pointram), PTRAM_SIZE);
+ save_item(NAME(m_pointram_idx));
+ save_item(NAME(m_pointram_control));
+ save_item(NAME(m_pointrom_idx));
+ save_item(NAME(m_mPointRomMSB));
+ save_item(NAME(m_mbPointRomDataAvailable));
+ save_item(NAME(m_depthcue));
+ save_item(NAME(m_irq_enable));
+ save_item(NAME(m_mbNeedsKickstart));
}
void namcos21_dsp_c67_device::device_reset()
diff --git a/src/mame/video/namcos21_3d.cpp b/src/mame/video/namcos21_3d.cpp
index a6f8921c094..7e0d17dcc94 100644
--- a/src/mame/video/namcos21_3d.cpp
+++ b/src/mame/video/namcos21_3d.cpp
@@ -40,6 +40,12 @@ void namcos21_3d_device::allocate_poly_framebuffer()
swap_and_clear_poly_framebuffer();
swap_and_clear_poly_framebuffer();
+
+ save_pointer(NAME(m_mpPolyFrameBufferZ), m_framebuffer_size_in_bytes / 2);
+ save_pointer(NAME(m_mpPolyFrameBufferPens), m_framebuffer_size_in_bytes / 2);
+
+ save_pointer(NAME(m_mpPolyFrameBufferZ2), m_framebuffer_size_in_bytes / 2);
+ save_pointer(NAME(m_mpPolyFrameBufferPens2), m_framebuffer_size_in_bytes / 2);
}
void namcos21_3d_device::swap_and_clear_poly_framebuffer()