summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2018-09-30 03:07:25 +0200
committer hap <happppp@users.noreply.github.com>2018-09-30 03:07:25 +0200
commitb757576f35552b16ef2d11bc2179e5170b37d3eb (patch)
treec8322b132603d52436e2f2276e718aa1a477e594
parent02f25921e84a3a3e9ce75c6eddf585c87b1daa75 (diff)
namcos22: get rid of scanline timer for dsp irqs (nw)
-rw-r--r--src/mame/drivers/namcos22.cpp107
-rw-r--r--src/mame/includes/namcos22.h12
-rw-r--r--src/mame/video/namcos22.cpp21
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<uint8_t[]>(0x8000/4);
memset(m_dirtypal.get(), 1, 0x8000/4);
memset(m_paletteram, 0, 0x8000);