CDROM: Preserve header valid bit on more commands

Fixes Goryuujin Electro hanging on boot.
This commit is contained in:
Connor McLaughlin 2020-03-29 01:16:01 +10:00
parent 0e0bd2852f
commit deb2865606
2 changed files with 19 additions and 9 deletions

View file

@ -1160,6 +1160,7 @@ void CDROM::BeginSeeking(bool logical, bool read_after_seek, bool play_after_see
const TickCount seek_time = GetTicksForSeek();
m_secondary_status.ClearActiveBits();
m_secondary_status.header_valid = false;
m_secondary_status.motor_on = true;
m_secondary_status.seeking = true;
@ -1175,8 +1176,8 @@ void CDROM::DoResetComplete(TickCount ticks_late)
m_drive_state = DriveState::Idle;
m_drive_event->Deactivate();
m_secondary_status.ClearActiveBits();
m_secondary_status.motor_on = true;
m_secondary_status.bits = 0;
m_secondary_status.motor_on = HasMedia();
m_mode.bits = 0;
m_mode.read_raw_sector = true;
@ -1184,7 +1185,6 @@ void CDROM::DoResetComplete(TickCount ticks_late)
{
Log_DevPrintf("CDROM reset - no disc");
m_secondary_status.shell_open = true;
m_secondary_status.motor_on = false;
SendAsyncErrorResponse(STAT_ERROR, 0x08);
return;
}
@ -1222,11 +1222,19 @@ void CDROM::DoSeekComplete(TickCount ticks_late)
// check for data header for logical seeks
if (logical)
{
ProcessDataSectorHeader(m_reader.GetSectorBuffer().data(), false);
if (!m_last_subq.control.data)
{
Log_WarningPrintf("Logical seek to non-data sector [%02x:%02x:%02x]", seek_mm, seek_ss, seek_ff);
seek_okay = false;
}
else
{
ProcessDataSectorHeader(m_reader.GetSectorBuffer().data(), true);
// ensure the location matches up (it should)
seek_okay = (m_last_sector_header.minute == seek_mm && m_last_sector_header.second == seek_ss &&
m_last_sector_header.frame == seek_ff);
// ensure the location matches up (it should)
seek_okay = (m_last_sector_header.minute == seek_mm && m_last_sector_header.second == seek_ss &&
m_last_sector_header.frame == seek_ff);
}
}
}
}
@ -1281,6 +1289,7 @@ void CDROM::DoStopComplete()
m_drive_state = DriveState::Idle;
m_drive_event->Deactivate();
m_secondary_status.ClearActiveBits();
m_secondary_status.header_valid = false;
m_secondary_status.motor_on = false;
m_async_response_fifo.Clear();
@ -1294,6 +1303,7 @@ void CDROM::DoChangeSessionComplete()
m_drive_state = DriveState::Idle;
m_drive_event->Deactivate();
m_secondary_status.ClearActiveBits();
m_secondary_status.header_valid = false;
m_secondary_status.motor_on = true;
m_async_response_fifo.Clear();

View file

@ -160,10 +160,10 @@ private:
BitField<u8, bool, 6, 1> seeking;
BitField<u8, bool, 7, 1> playing_cdda;
/// Clears the CDDA/seeking/header valid bits.
/// Clears the CDDA/seeking bits.
ALWAYS_INLINE void ClearActiveBits()
{
bits &= ~(STAT_HEADER_VALID | STAT_SEEKING | STAT_PLAYING_CDDA);
bits &= ~(STAT_SEEKING | STAT_PLAYING_CDDA);
}
};