From b757576f35552b16ef2d11bc2179e5170b37d3eb Mon Sep 17 00:00:00 2001 From: hap Date: Sun, 30 Sep 2018 03:07:25 +0200 Subject: namcos22: get rid of scanline timer for dsp irqs (nw) --- src/mame/drivers/namcos22.cpp | 107 ++++++++++++++++-------------------------- src/mame/includes/namcos22.h | 12 ++--- src/mame/video/namcos22.cpp | 21 +++++---- 3 files changed, 58 insertions(+), 82 deletions(-) diff --git a/src/mame/drivers/namcos22.cpp b/src/mame/drivers/namcos22.cpp index 899cb690df3..d4cfcfa5330 100644 --- a/src/mame/drivers/namcos22.cpp +++ b/src/mame/drivers/namcos22.cpp @@ -1181,8 +1181,10 @@ #define VBSTART (480) -#define MCU_SPEEDUP 1 /* mcu idle skipping */ - +#define MCU_SPEEDUP 1 /* mcu idle skipping */ +#define SERIAL_IO_PERIOD (60) /* lower DSP serial I/O period */ +// actual dsp serial freq is unknown, should be much higher than 60hz of course +// serial comms doesn't work yet anyway /*********************************************************************************************/ @@ -1326,22 +1328,21 @@ WRITE8_MEMBER(namcos22_state::namcos22s_system_controller_w) if (data == 0) { /* disable DSPs */ - m_master->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - enable_slave_simulation(false); + master_enable(false); + slave_enable(false); m_dsp_irq_enabled = false; } else if (data == 1) { /* enable dsp and rendering subsystem */ - m_master->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - enable_slave_simulation(true); + master_enable(true); + slave_enable(true); m_dsp_irq_enabled = true; } else if (data == 0xff) { /* used to upload game-specific code to master/slave dsps */ - m_master->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + master_enable(true); m_dsp_irq_enabled = false; } } @@ -1471,22 +1472,21 @@ WRITE8_MEMBER(namcos22_state::namcos22_system_controller_w) if (data == 0) { /* disable DSPs */ - m_master->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - enable_slave_simulation(false); + master_enable(false); + slave_enable(false); m_dsp_irq_enabled = false; } else if (data == 1) { /* enable dsp and rendering subsystem */ - m_master->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - enable_slave_simulation(true); + master_enable(true); + slave_enable(true); m_dsp_irq_enabled = true; } else if (data == 0xff) { /* used to upload game-specific code to master/slave dsps */ - m_master->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); + master_enable(true); m_dsp_irq_enabled = false; } } @@ -1934,8 +1934,8 @@ void namcos22_state::namcos22s_am(address_map &map) map(0x400000, 0x40001f).rw(FUNC(namcos22_state::namcos22_keycus_r), FUNC(namcos22_state::namcos22_keycus_w)); map(0x410000, 0x413fff).ram(); // C139 SCI buffer map(0x420000, 0x42000f).r(FUNC(namcos22_state::namcos22_sci_r)).writeonly(); // C139 SCI registers - map(0x430000, 0x430003).nopw(); // more leds? - map(0x440000, 0x440003).rw(FUNC(namcos22_state::namcos22_dipswitch_r), FUNC(namcos22_state::namcos22_cpuleds_w)); + map(0x430000, 0x430003).w(FUNC(namcos22_state::namcos22_cpuleds_w)); + map(0x440000, 0x440003).r(FUNC(namcos22_state::namcos22_dipswitch_r)); map(0x450008, 0x45000b).rw(FUNC(namcos22_state::namcos22_portbit_r), FUNC(namcos22_state::namcos22_portbit_w)); map(0x460000, 0x463fff).rw(m_eeprom, FUNC(eeprom_parallel_28xx_device::read), FUNC(eeprom_parallel_28xx_device::write)).umask32(0xff00ff00); map(0x700000, 0x70001f).rw(FUNC(namcos22_state::namcos22_system_controller_r), FUNC(namcos22_state::namcos22s_system_controller_w)); @@ -2026,21 +2026,15 @@ void namcos22_state::alpinesa_am(address_map &map) // DSPs -void namcos22_state::enable_slave_simulation(bool enable) +void namcos22_state::master_enable(bool enable) { - m_slave_simulation_active = enable; + m_master->set_input_line(INPUT_LINE_RESET, enable ? CLEAR_LINE : ASSERT_LINE); } -void namcos22_state::slave_halt() +void namcos22_state::slave_enable(bool enable) { - m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - enable_slave_simulation(false); -} - -void namcos22_state::slave_enable() -{ -// m_slave->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); - enable_slave_simulation(true); + m_slave->set_input_line(INPUT_LINE_RESET, enable ? CLEAR_LINE : ASSERT_LINE); + m_slave_simulation_active = enable; } @@ -2364,7 +2358,7 @@ WRITE16_MEMBER(namcos22_state::upload_code_to_slave_dsp_w) switch (data) { case 0x00: - slave_halt(); + slave_enable(false); break; case 0x01: @@ -2376,7 +2370,7 @@ WRITE16_MEMBER(namcos22_state::upload_code_to_slave_dsp_w) break; case 0x03: - slave_enable(); + slave_enable(true); break; case 0x04: @@ -2384,7 +2378,7 @@ WRITE16_MEMBER(namcos22_state::upload_code_to_slave_dsp_w) case 0x10: /* serial i/o related? */ - slave_enable(); + slave_enable(true); break; default: @@ -2448,37 +2442,22 @@ READ16_MEMBER(namcos22_state::master_serial_io_r) return m_SerialDataSlaveToMasterCurrent; } -TIMER_DEVICE_CALLBACK_MEMBER(namcos22_state::dsp_master_serial_irq) +INTERRUPT_GEN_MEMBER(namcos22_state::dsp_vblank_irq) { - int scanline = param; - if (m_dsp_irq_enabled) - { - m_SerialDataSlaveToMasterCurrent = m_SerialDataSlaveToMasterNext; - - if (scanline == 480) - { - m_master->set_input_line(TMS32025_INT0, HOLD_LINE); - } - else if ((scanline % 2) == 0) - { - m_master->set_input_line(TMS32025_RINT, HOLD_LINE); - m_master->set_input_line(TMS32025_XINT, HOLD_LINE); - } - } + device.execute().set_input_line(TMS32025_INT0, HOLD_LINE); } -TIMER_DEVICE_CALLBACK_MEMBER(namcos22_state::dsp_slave_serial_irq) +TIMER_DEVICE_CALLBACK_MEMBER(namcos22_state::dsp_serial_pulse) { - int scanline = param; - if (m_dsp_irq_enabled) { - if ((scanline % 2) == 0) - { - m_slave->set_input_line(TMS32025_RINT, HOLD_LINE); - m_slave->set_input_line(TMS32025_XINT, HOLD_LINE); - } + m_SerialDataSlaveToMasterCurrent = m_SerialDataSlaveToMasterNext; + + m_master->set_input_line(TMS32025_RINT, HOLD_LINE); + m_master->set_input_line(TMS32025_XINT, HOLD_LINE); + m_slave->set_input_line(TMS32025_RINT, HOLD_LINE); + m_slave->set_input_line(TMS32025_XINT, HOLD_LINE); } } @@ -3736,8 +3715,9 @@ GFXDECODE_END void namcos22_state::machine_reset() { - m_master->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); - m_slave->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); + master_enable(false); + slave_enable(false); + m_dsp_irq_enabled = false; m_mcu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); m_poly->reset(); @@ -3747,7 +3727,6 @@ void namcos22_state::machine_start() { m_led.resolve(); m_cpuled.resolve(); - m_slave_simulation_active = false; m_portbits[0] = 0xffff; m_portbits[1] = 0xffff; } @@ -3769,8 +3748,8 @@ MACHINE_CONFIG_START(namcos22_state::namcos22) master.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); master.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); master.dr_in_cb().set(FUNC(namcos22_state::master_serial_io_r)); - - MCFG_TIMER_DRIVER_ADD_SCANLINE("master_st", namcos22_state, dsp_master_serial_irq, "screen", 0, 1) + master.set_vblank_int("screen", FUNC(namcos22_state::dsp_vblank_irq)); + MCFG_TIMER_DRIVER_ADD_PERIODIC("dsp_serial", namcos22_state, dsp_serial_pulse, attotime::from_hz(SERIAL_IO_PERIOD)) tms32025_device& slave(TMS32025(config, m_slave, SS22_MASTER_CLOCK)); /* ? */ slave.set_addrmap(AS_PROGRAM, &namcos22_state::slave_dsp_program); @@ -3782,8 +3761,6 @@ MACHINE_CONFIG_START(namcos22_state::namcos22) slave.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); slave.dx_out_cb().set(FUNC(namcos22_state::slave_serial_io_w)); - MCFG_TIMER_DRIVER_ADD_SCANLINE("slave_st", namcos22_state, dsp_slave_serial_irq, "screen", 0, 1) - MCFG_DEVICE_ADD("mcu", NAMCO_C74, SS22_MASTER_CLOCK/3) // C74 on the CPU board has no periodic interrupts, it runs entirely off Timer A0 MCFG_DEVICE_PROGRAM_MAP( mcu_s22_program) MCFG_DEVICE_IO_MAP( mcu_s22_io) @@ -3840,8 +3817,8 @@ MACHINE_CONFIG_START(namcos22_state::namcos22s) master.hold_ack_out_cb().set(FUNC(namcos22_state::dsp_hold_ack_w)); master.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); master.dr_in_cb().set(FUNC(namcos22_state::master_serial_io_r)); - - MCFG_TIMER_DRIVER_ADD_SCANLINE("master_st", namcos22_state, dsp_master_serial_irq, "screen", 0, 1) + master.set_vblank_int("screen", FUNC(namcos22_state::dsp_vblank_irq)); + MCFG_TIMER_DRIVER_ADD_PERIODIC("dsp_serial", namcos22_state, dsp_serial_pulse, attotime::from_hz(SERIAL_IO_PERIOD)) tms32025_device& slave(TMS32025(config, m_slave, SS22_MASTER_CLOCK)); slave.set_addrmap(AS_PROGRAM, &namcos22_state::slave_dsp_program); @@ -3853,12 +3830,10 @@ MACHINE_CONFIG_START(namcos22_state::namcos22s) slave.xf_out_cb().set(FUNC(namcos22_state::dsp_xf_output_w)); slave.dx_out_cb().set(FUNC(namcos22_state::slave_serial_io_w)); - MCFG_TIMER_DRIVER_ADD_SCANLINE("slave_st", namcos22_state, dsp_slave_serial_irq, "screen", 0, 1) - MCFG_DEVICE_ADD("mcu", M37710S4, SS22_MASTER_CLOCK/3) MCFG_DEVICE_PROGRAM_MAP(mcu_program) MCFG_DEVICE_IO_MAP(mcu_io) - MCFG_TIMER_DRIVER_ADD_SCANLINE("mcu_st", namcos22_state, mcu_irq, "screen", 0, 1) + MCFG_TIMER_DRIVER_ADD_SCANLINE("mcu_irq", namcos22_state, mcu_irq, "screen", 0, 1) MCFG_QUANTUM_TIME(attotime::from_hz(6000)) // MCFG_QUANTUM_PERFECT_CPU("maincpu") diff --git a/src/mame/includes/namcos22.h b/src/mame/includes/namcos22.h index ef93673b050..899dc2a0c6a 100644 --- a/src/mame/includes/namcos22.h +++ b/src/mame/includes/namcos22.h @@ -381,9 +381,8 @@ private: uint32_t pdp_polygonram_read(offs_t offs); void pdp_polygonram_write(offs_t offs, uint32_t data); void point_write(offs_t offs, uint32_t data); - void slave_halt(); - void slave_enable(); - void enable_slave_simulation(bool enable); + void master_enable(bool enable); + void slave_enable(bool enable); void matrix3d_multiply(float a[4][4], float b[4][4]); void matrix3d_identity(float m[4][4]); @@ -426,14 +425,14 @@ private: uint32_t screen_update_namcos22(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); INTERRUPT_GEN_MEMBER(namcos22s_interrupt); INTERRUPT_GEN_MEMBER(namcos22_interrupt); + INTERRUPT_GEN_MEMBER(dsp_vblank_irq); + TIMER_DEVICE_CALLBACK_MEMBER(dsp_serial_pulse); + TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq); TIMER_DEVICE_CALLBACK_MEMBER(adillor_trackball_update); TIMER_CALLBACK_MEMBER(adillor_trackball_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(propcycl_pedal_update); TIMER_DEVICE_CALLBACK_MEMBER(propcycl_pedal_interrupt); TIMER_DEVICE_CALLBACK_MEMBER(alpine_steplock_callback); - TIMER_DEVICE_CALLBACK_MEMBER(dsp_master_serial_irq); - TIMER_DEVICE_CALLBACK_MEMBER(dsp_slave_serial_irq); - TIMER_DEVICE_CALLBACK_MEMBER(mcu_irq); void alpine_io_map(address_map &map); void alpinesa_am(address_map &map); void iomcu_s22_io(address_map &map); @@ -528,6 +527,7 @@ private: uint16_t m_PrimitiveID; float m_viewmatrix[4][4]; uint8_t m_reflection; + bool m_cullflip; uint8_t m_LitSurfaceInfo[NAMCOS22_MAX_LIT_SURFACES]; int32_t m_SurfaceNormalFormat; unsigned m_LitSurfaceCount; diff --git a/src/mame/video/namcos22.cpp b/src/mame/video/namcos22.cpp index 94461719cfb..c8e507c4045 100644 --- a/src/mame/video/namcos22.cpp +++ b/src/mame/video/namcos22.cpp @@ -15,10 +15,10 @@ * + scene changes too rapidly sometimes, eg. dirtdash snow level finish (see attract), or aquajet going down the waterfall * + 100% fog if you start dirtdash at the hill level * - improve ss22 lighting, eg. mountains in alpinr2b selection screen - * - improve ss22 spot: + * - improve ss22 spot: the bugs hint toward an extra bg layer bank? * + dirtdash spotlight is opaque for a short time when exiting the jungle level * + dirtdash speedometer has wrong colors when in the jungle level - * + dirtdash record time message creates a 'gap' in the spotlight when entering the jungle level (possibly just a game bug?) + * + dirtdash record time message creates a 'gap' in the spotlight when entering the jungle level * - add layer enable in system 22, see bugs in cybrcomm and victlapw * - window clipping is wrong in acedrvrw, victlapw (see rear-view mirrors) * - ridgerac waving flag title screen is missing, just an empty beach scenery instead @@ -782,7 +782,7 @@ void namcos22_state::matrix3d_identity(float m[4][4]) { for (int col = 0; col < 4; col++) { - m[row][col] = (row == col) ? 1.0 : 0.0; + m[row][col] = (row == col) ? 1.0f : 0.0f; } } } @@ -796,9 +796,9 @@ void namcos22_state::matrix3d_apply_reflection(float m[4][4]) matrix3d_identity(r); if (m_reflection & 0x10) - r[0][0] = -1.0; + r[0][0] = -1.0f; if (m_reflection & 0x20) - r[1][1] = -1.0; + r[1][1] = -1.0f; matrix3d_multiply(m, r); } @@ -1004,16 +1004,16 @@ void namcos22_state::blit_single_quad(bitmap_rgb32 &bitmap, uint32_t color, uint /* backface cull one-sided polygons */ if (flags & 0x0020) { - double c1 = + float c1 = (v[2].x*((v[0].z*v[1].y)-(v[0].y*v[1].z)))+ (v[2].y*((v[0].x*v[1].z)-(v[0].z*v[1].x)))+ (v[2].z*((v[0].y*v[1].x)-(v[0].x*v[1].y))); - double c2 = + float c2 = (v[0].x*((v[2].z*v[3].y)-(v[2].y*v[3].z)))+ (v[0].y*((v[2].x*v[3].z)-(v[2].z*v[3].x)))+ (v[0].z*((v[2].y*v[3].x)-(v[2].x*v[3].y))); - if ((m_reflection && c1 <= 0 && c2 <= 0) || (!m_reflection && c1 >= 0 && c2 >= 0)) + if ((m_cullflip && c1 <= 0.0f && c2 <= 0.0f) || (!m_cullflip && c1 >= 0.0f && c2 >= 0.0f)) return; } @@ -1291,6 +1291,7 @@ void namcos22_state::slavesim_handle_bb0003(const int32_t *src) m_camera_lz = dspfixed_to_nativefloat(src[0x4]); m_reflection = src[0x2] >> 16 & 0x30; // z too? + m_cullflip = (m_reflection == 0x10 || m_reflection == 0x20); m_absolute_priority = src[0x3] >> 16; m_camera_vx = (int16_t)(src[5] >> 16); m_camera_vy = (int16_t)(src[5] & 0xffff); @@ -1394,8 +1395,6 @@ void namcos22_state::simulate_slavedsp(bitmap_rgb32 &bitmap) const int32_t *src = 0x300 + (int32_t *)m_polygonram.target(); int16_t len; - matrix3d_identity(m_viewmatrix); - if (m_is_ss22) { src += 4; /* FFFE 0400 */ @@ -2374,6 +2373,8 @@ uint32_t namcos22_state::screen_update_namcos22(screen_device &screen, bitmap_rg void namcos22_state::init_tables() { + matrix3d_identity(m_viewmatrix); + m_dirtypal = std::make_unique(0x8000/4); memset(m_dirtypal.get(), 1, 0x8000/4); memset(m_paletteram, 0, 0x8000); -- cgit v1.2.3