diff options
author | cam900 <dbtlrchl@naver.com> | 2021-02-27 00:03:25 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-02-27 02:03:25 +1100 |
commit | e8b765d2798626d0d8938a2d0934be602491e1b1 (patch) | |
tree | 7f883d63a0b88e01f25277c7caf9349a2c68bd78 | |
parent | 66551ce0df437eff2b0f5dad0db8d56f3c9c3cff (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.cpp | 35 | ||||
-rw-r--r-- | src/mame/drivers/namcos21_c67.cpp | 10 | ||||
-rw-r--r-- | src/mame/drivers/namcos21_de.cpp | 11 | ||||
-rw-r--r-- | src/mame/machine/namcos21_dsp.cpp | 13 | ||||
-rw-r--r-- | src/mame/machine/namcos21_dsp_c67.cpp | 22 | ||||
-rw-r--r-- | src/mame/video/namcos21_3d.cpp | 6 |
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() |