mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-26 15:45:42 +00:00
CDROM: Don't persist seek error bit in secondary status
Fixes Viewpoint (#56).
This commit is contained in:
parent
2249b873ff
commit
4eeaa38ccd
|
@ -461,16 +461,16 @@ void CDROM::SendACKAndStat()
|
||||||
SetInterrupt(Interrupt::ACK);
|
SetInterrupt(Interrupt::ACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDROM::SendErrorResponse(u8 reason /*= 0x80*/)
|
void CDROM::SendErrorResponse(u8 stat_bits /* = STAT_ERROR */, u8 reason /* = 0x80 */)
|
||||||
{
|
{
|
||||||
m_response_fifo.Push(m_secondary_status.bits | 0x01);
|
m_response_fifo.Push(m_secondary_status.bits | stat_bits);
|
||||||
m_response_fifo.Push(reason);
|
m_response_fifo.Push(reason);
|
||||||
SetInterrupt(Interrupt::Error);
|
SetInterrupt(Interrupt::Error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDROM::SendAsyncErrorResponse(u8 reason /*= 0x80*/)
|
void CDROM::SendAsyncErrorResponse(u8 stat_bits /* = STAT_ERROR */, u8 reason /* = 0x80 */)
|
||||||
{
|
{
|
||||||
m_async_response_fifo.Push(m_secondary_status.bits | 0x01);
|
m_async_response_fifo.Push(m_secondary_status.bits | stat_bits);
|
||||||
m_async_response_fifo.Push(reason);
|
m_async_response_fifo.Push(reason);
|
||||||
SetAsyncInterrupt(Interrupt::Error);
|
SetAsyncInterrupt(Interrupt::Error);
|
||||||
}
|
}
|
||||||
|
@ -497,9 +497,9 @@ void CDROM::UpdateInterruptRequest()
|
||||||
|
|
||||||
TickCount CDROM::GetAckDelayForCommand() const
|
TickCount CDROM::GetAckDelayForCommand() const
|
||||||
{
|
{
|
||||||
const u32 default_ack_delay = 3000;
|
const u32 default_ack_delay = 60000;
|
||||||
if (m_command == Command::Init || m_command == Command::ReadTOC)
|
if (m_command == Command::Init || m_command == Command::ReadTOC)
|
||||||
return 60000;
|
return 3000;
|
||||||
else
|
else
|
||||||
return default_ack_delay;
|
return default_ack_delay;
|
||||||
}
|
}
|
||||||
|
@ -586,7 +586,7 @@ void CDROM::ExecuteCommand()
|
||||||
Log_DebugPrintf("CDROM GetID command");
|
Log_DebugPrintf("CDROM GetID command");
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -605,7 +605,7 @@ void CDROM::ExecuteCommand()
|
||||||
Log_DebugPrintf("CDROM ReadTOC command");
|
Log_DebugPrintf("CDROM ReadTOC command");
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -663,7 +663,7 @@ void CDROM::ExecuteCommand()
|
||||||
Log_DebugPrintf("CDROM %s command", logical ? "SeekL" : "SeekP");
|
Log_DebugPrintf("CDROM %s command", logical ? "SeekL" : "SeekP");
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -682,11 +682,11 @@ void CDROM::ExecuteCommand()
|
||||||
|
|
||||||
if (!HasMedia() || m_drive_state == DriveState::Reading || m_drive_state == DriveState::Playing)
|
if (!HasMedia() || m_drive_state == DriveState::Reading || m_drive_state == DriveState::Playing)
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else if (session == 0)
|
else if (session == 0)
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x10);
|
SendErrorResponse(STAT_ERROR, 0x10);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -707,7 +707,7 @@ void CDROM::ExecuteCommand()
|
||||||
Log_DebugPrintf("CDROM read command");
|
Log_DebugPrintf("CDROM read command");
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -726,7 +726,7 @@ void CDROM::ExecuteCommand()
|
||||||
|
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -787,7 +787,7 @@ void CDROM::ExecuteCommand()
|
||||||
Log_DebugPrintf("CDROM motor on command");
|
Log_DebugPrintf("CDROM motor on command");
|
||||||
if (m_secondary_status.motor_on)
|
if (m_secondary_status.motor_on)
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x20);
|
SendErrorResponse(STAT_ERROR, 0x20);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -827,7 +827,7 @@ void CDROM::ExecuteCommand()
|
||||||
m_last_sector_header.second, m_last_sector_header.frame);
|
m_last_sector_header.second, m_last_sector_header.frame);
|
||||||
if (!m_secondary_status.header_valid)
|
if (!m_secondary_status.header_valid)
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -871,7 +871,7 @@ void CDROM::ExecuteCommand()
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
|
|
||||||
EndCommand();
|
EndCommand();
|
||||||
|
@ -886,11 +886,11 @@ void CDROM::ExecuteCommand()
|
||||||
|
|
||||||
if (!HasMedia())
|
if (!HasMedia())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x80);
|
SendErrorResponse(STAT_ERROR, 0x80);
|
||||||
}
|
}
|
||||||
else if (track > m_reader.GetMedia()->GetTrackCount())
|
else if (track > m_reader.GetMedia()->GetTrackCount())
|
||||||
{
|
{
|
||||||
SendErrorResponse(0x10);
|
SendErrorResponse(STAT_ERROR, 0x10);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1204,8 +1204,7 @@ void CDROM::DoSeekComplete(TickCount ticks_late)
|
||||||
CDImage::Position pos(CDImage::Position::FromLBA(m_last_requested_sector));
|
CDImage::Position pos(CDImage::Position::FromLBA(m_last_requested_sector));
|
||||||
Log_WarningPrintf("%s seek to [%02u:%02u:%02u] failed", logical ? "Logical" : "Physical", pos.minute, pos.second,
|
Log_WarningPrintf("%s seek to [%02u:%02u:%02u] failed", logical ? "Logical" : "Physical", pos.minute, pos.second,
|
||||||
pos.frame);
|
pos.frame);
|
||||||
m_secondary_status.seek_error = true;
|
SendAsyncErrorResponse(STAT_SEEK_ERROR, 0x04);
|
||||||
SendAsyncErrorResponse(0x80);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_setloc_pending = false;
|
m_setloc_pending = false;
|
||||||
|
@ -1260,8 +1259,7 @@ void CDROM::DoChangeSessionComplete()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// we don't emulate multisession discs.. for now
|
// we don't emulate multisession discs.. for now
|
||||||
m_secondary_status.seek_error = true;
|
SendAsyncErrorResponse(STAT_SEEK_ERROR, 0x40);
|
||||||
SendAsyncErrorResponse(0x40);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,6 +136,18 @@ private:
|
||||||
BitField<u8, bool, 7, 1> BUSYSTS;
|
BitField<u8, bool, 7, 1> BUSYSTS;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum StatBits : u8
|
||||||
|
{
|
||||||
|
STAT_ERROR = (1 << 0),
|
||||||
|
STAT_MOTOR_ON = (1 << 1),
|
||||||
|
STAT_SEEK_ERROR = (1 << 2),
|
||||||
|
STAT_ID_ERROR = (1 << 3),
|
||||||
|
STAT_SHELL_OPEN = (1 << 4),
|
||||||
|
STAT_HEADER_VALID = (1 << 5),
|
||||||
|
STAT_SEEKING = (1 << 6),
|
||||||
|
STAT_PLAYING_CDDA = (1 << 7)
|
||||||
|
};
|
||||||
|
|
||||||
union SecondaryStatusRegister
|
union SecondaryStatusRegister
|
||||||
{
|
{
|
||||||
u8 bits;
|
u8 bits;
|
||||||
|
@ -151,9 +163,7 @@ private:
|
||||||
/// Clears the CDDA/seeking/header valid bits.
|
/// Clears the CDDA/seeking/header valid bits.
|
||||||
ALWAYS_INLINE void ClearActiveBits()
|
ALWAYS_INLINE void ClearActiveBits()
|
||||||
{
|
{
|
||||||
header_valid = false;
|
bits &= ~(STAT_HEADER_VALID | STAT_SEEKING | STAT_PLAYING_CDDA);
|
||||||
seeking = false;
|
|
||||||
playing_cdda = false;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -189,8 +199,8 @@ private:
|
||||||
void ClearAsyncInterrupt();
|
void ClearAsyncInterrupt();
|
||||||
void DeliverAsyncInterrupt();
|
void DeliverAsyncInterrupt();
|
||||||
void SendACKAndStat();
|
void SendACKAndStat();
|
||||||
void SendErrorResponse(u8 reason = 0x80);
|
void SendErrorResponse(u8 stat_bits = STAT_ERROR, u8 reason = 0x80);
|
||||||
void SendAsyncErrorResponse(u8 reason = 0x80);
|
void SendAsyncErrorResponse(u8 stat_bits = STAT_ERROR, u8 reason = 0x80);
|
||||||
void UpdateStatusRegister();
|
void UpdateStatusRegister();
|
||||||
void UpdateInterruptRequest();
|
void UpdateInterruptRequest();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue