-ldv4200hle: Fixed overshoot issue with Multi-Speed Forward/Reverse. [Ryan Holtz] (#9483)

Co-authored-by: MooglyGuy <mog@home>
This commit is contained in:
MooglyGuy 2022-03-29 22:52:34 +02:00 committed by Vas Crabb
parent 80e6e42a74
commit a8e76831f8

View File

@ -394,26 +394,60 @@ uint8_t pioneer_ldv4200hle_device::process_command(uint8_t cmd_index, uint32_t v
break;
case CMD_MULTISPEED_FORWARD:
LOGMASKED(LOG_COMMANDS, "%s: Command: Multi-Speed Forward (%d) (cancelling search)\n", machine().describe_context(), value == ~0U ? 0 : value);
m_mode = MODE_MS_FORWARD;
m_search_frame = ~0U;
m_search_chapter = ~0U;
if (value != ~0U)
if (value + 1 == m_curr_frame)
{
LOGMASKED(LOG_COMMANDS, "%s: Setting stop frame\n", machine().describe_context());
m_mark_frame = value + 1;
m_cmd_running = true;
LOGMASKED(LOG_COMMANDS, "%s: Already at desired frame, entering still/pause\n", machine().describe_context(), value == ~0U ? 0 : value);
if (is_cav_disc())
{
m_mode = MODE_STILL;
update_video_enable();
}
else
{
m_mode = MODE_PAUSE;
video_enable(false);
}
}
else
{
m_mode = MODE_MS_FORWARD;
if (value != ~0U)
{
LOGMASKED(LOG_COMMANDS, "%s: Setting stop frame\n", machine().describe_context());
m_mark_frame = value + 1;
m_cmd_running = true;
}
}
break;
case CMD_MULTISPEED_REVERSE:
LOGMASKED(LOG_COMMANDS, "%s: Command: Multi-Speed Reverse (%d) (cancelling search)\n", machine().describe_context(), value == ~0U ? 0 : value);
m_mode = MODE_MS_REVERSE;
m_search_frame = ~0U;
m_search_chapter = ~0U;
if (value != ~0U)
if (value + 1 == m_curr_frame)
{
LOGMASKED(LOG_COMMANDS, "%s: Setting stop frame\n", machine().describe_context());
m_mark_frame = value + 1;
m_cmd_running = true;
LOGMASKED(LOG_COMMANDS, "%s: Already at desired frame, entering still/pause\n", machine().describe_context(), value == ~0U ? 0 : value);
if (is_cav_disc())
{
m_mode = MODE_STILL;
update_video_enable();
}
else
{
m_mode = MODE_PAUSE;
video_enable(false);
}
}
else
{
m_mode = MODE_MS_REVERSE;
if (value != ~0U)
{
LOGMASKED(LOG_COMMANDS, "%s: Setting stop frame\n", machine().describe_context());
m_mark_frame = value + 1;
m_cmd_running = true;
}
}
break;
case CMD_SPEED_SET:
@ -768,8 +802,8 @@ void pioneer_ldv4200hle_device::device_timer(emu_timer &timer, device_timer_id i
{
if (m_mark_frame != ~0U && m_search_frame == ~0U)
{
int32_t old_delta = (int32_t)old_frame - (int32_t)m_mark_frame;
int32_t curr_delta = (int32_t)m_curr_frame - (int32_t)m_mark_frame;
int32_t old_delta = (int32_t)m_mark_frame - (int32_t)old_frame;
int32_t curr_delta = (int32_t)m_mark_frame - (int32_t)m_curr_frame;
LOGMASKED(LOG_STOPS, "%s: Stop Mark is currently %d, old frame is %d, current frame is %d, old delta %d, curr delta %d\n", machine().describe_context(), m_mark_frame, old_frame, m_curr_frame, old_delta, curr_delta);
if (curr_delta == 0 || std::signbit(old_delta) != std::signbit(curr_delta))
{
@ -801,7 +835,7 @@ void pioneer_ldv4200hle_device::device_timer(emu_timer &timer, device_timer_id i
if (m_search_frame != ~0U)
{
// TODO: Chapter-search support
int32_t delta = (int32_t)m_curr_frame - (int32_t)m_search_frame;
int32_t delta = (int32_t)m_search_frame - (int32_t)m_curr_frame;
LOGMASKED(LOG_SEARCHES, "%s: Searching from current frame %d with delta %d\n", machine().describe_context(), m_curr_frame, delta);
if (delta == 0)
{
@ -829,20 +863,20 @@ void pioneer_ldv4200hle_device::device_timer(emu_timer &timer, device_timer_id i
queue_reply("R\x0d");
}
}
else if (delta >= -2 && delta < 0)
else if (delta <= 2 && delta > 0)
{
LOGMASKED(LOG_SEARCHES, "%s: Negative-near delta, letting disc run to current\n", machine().describe_context());
LOGMASKED(LOG_SEARCHES, "%s: Positive near delta, letting disc run to current\n", machine().describe_context());
// We're approaching our frame, let it run up.
}
else
{
if (delta < 0)
{
advance_slider(std::max(1, -delta / 2));
advance_slider(std::min(-2, delta / 2));
}
else
{
advance_slider(std::min(-2, -delta / 2));
advance_slider(std::max(1, delta / 2));
}
}
}
@ -891,6 +925,17 @@ int32_t pioneer_ldv4200hle_device::player_update(const vbi_metadata &vbi, int fi
m_speed_accum -= elapsed_tracks * 60;
if (m_mode == MODE_MS_REVERSE)
elapsed_tracks *= -1;
if (m_mark_frame != ~0U)
{
int32_t jump_frame = (int32_t)m_curr_frame + elapsed_tracks;
int32_t curr_delta = (int32_t)m_mark_frame - (int32_t)m_curr_frame;
int32_t next_delta = (int32_t)m_mark_frame - (int32_t)jump_frame;
if (std::signbit(curr_delta) != std::signbit(next_delta))
{
elapsed_tracks = curr_delta;
}
}
return elapsed_tracks;
}