mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-23 06:15:38 +00:00
CDROM: Fix double-reads hitting incorrect sector again
Fixes Bedlem / Rise 2 without breaking Vigilante 8 - 2nd Offense.
This commit is contained in:
parent
5e7fd5aa71
commit
dcfb929de5
|
@ -853,6 +853,15 @@ TickCount CDROM::GetTicksForStop(bool motor_was_on)
|
|||
return motor_was_on ? (m_mode.double_speed ? 25000000 : 13000000) : 7000;
|
||||
}
|
||||
|
||||
CDImage::LBA CDROM::GetNextSectorToBeRead()
|
||||
{
|
||||
if (!IsReadingOrPlaying())
|
||||
return m_current_lba;
|
||||
|
||||
m_reader.WaitForReadToComplete();
|
||||
return m_reader.GetLastReadSector();
|
||||
}
|
||||
|
||||
void CDROM::BeginCommand(Command command)
|
||||
{
|
||||
TickCount ack_delay = GetAckDelayForCommand(command);
|
||||
|
@ -1077,7 +1086,7 @@ void CDROM::ExecuteCommand()
|
|||
{
|
||||
SendACKAndStat();
|
||||
|
||||
if ((!m_setloc_pending || m_setloc_position.ToLBA() == m_current_lba) &&
|
||||
if ((!m_setloc_pending || m_setloc_position.ToLBA() == GetNextSectorToBeRead()) &&
|
||||
(m_drive_state == DriveState::Reading || (IsSeeking() && m_read_after_seek)))
|
||||
{
|
||||
Log_DevPrintf("Ignoring read command with no/same setloc, already reading/reading after seek");
|
||||
|
@ -1108,7 +1117,7 @@ void CDROM::ExecuteCommand()
|
|||
{
|
||||
SendACKAndStat();
|
||||
|
||||
if (track == 0 && (!m_setloc_pending || m_setloc_position.ToLBA() == m_current_lba) &&
|
||||
if (track == 0 && (!m_setloc_pending || m_setloc_position.ToLBA() == GetNextSectorToBeRead()) &&
|
||||
(m_drive_state == DriveState::Playing || (IsSeeking() && m_play_after_seek)))
|
||||
{
|
||||
Log_DevPrintf("Ignoring play command with no/same setloc, already playing/playing after seek");
|
||||
|
@ -1924,8 +1933,7 @@ void CDROM::DoSectorRead()
|
|||
is_data_sector ? "data" : "audio", is_data_sector ? "reading" : "playing");
|
||||
}
|
||||
|
||||
m_current_lba++;
|
||||
m_reader.QueueReadSector(m_current_lba);
|
||||
m_reader.QueueReadSector(m_current_lba + 1u);
|
||||
}
|
||||
|
||||
void CDROM::ProcessDataSectorHeader(const u8* raw_sector)
|
||||
|
|
|
@ -202,6 +202,10 @@ private:
|
|||
{
|
||||
return (m_drive_state == DriveState::SeekingLogical || m_drive_state == DriveState::SeekingPhysical);
|
||||
}
|
||||
bool IsReadingOrPlaying() const
|
||||
{
|
||||
return (m_drive_state == DriveState::Reading || m_drive_state == DriveState::Playing);
|
||||
}
|
||||
bool CanReadMedia() const { return (m_drive_state != DriveState::ShellOpening && m_reader.HasMedia()); }
|
||||
bool HasPendingCommand() const { return m_command != Command::None; }
|
||||
bool HasPendingInterrupt() const { return m_interrupt_flag_register != 0; }
|
||||
|
@ -220,6 +224,7 @@ private:
|
|||
TickCount GetTicksForRead();
|
||||
TickCount GetTicksForSeek(CDImage::LBA new_lba);
|
||||
TickCount GetTicksForStop(bool motor_was_on);
|
||||
CDImage::LBA GetNextSectorToBeRead();
|
||||
void BeginCommand(Command command); // also update status register
|
||||
void EndCommand(); // also updates status register
|
||||
void AbortCommand();
|
||||
|
|
Loading…
Reference in a new issue