From 75aa52ab06dea891b21ae9f618d56d52247dd313 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Fri, 1 Jan 2021 01:38:13 +1000 Subject: [PATCH] CDROM: Fail reads immediately for audio/unlicensed CDs Fixes first track being unavailable on audio CDs in Vib-Ribbon. --- src/core/cdrom.cpp | 25 +++++++++++++++++++++++-- src/core/cdrom.h | 2 ++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/core/cdrom.cpp b/src/core/cdrom.cpp index 05535be41..0130ab260 100644 --- a/src/core/cdrom.cpp +++ b/src/core/cdrom.cpp @@ -238,6 +238,19 @@ bool CDROM::DoState(StateWrapper& sw) return !sw.HasError(); } +bool CDROM::IsMediaPS1Disc() const +{ + return (m_disc_region != DiscRegion::Other); +} + +bool CDROM::DoesMediaRegionMatchConsole() const +{ + if (!g_settings.cdrom_region_check) + return true; + + return System::GetRegion() != System::GetConsoleRegionForDiscRegion(m_disc_region); +} + void CDROM::InsertMedia(std::unique_ptr media) { if (CanReadMedia()) @@ -913,6 +926,10 @@ void CDROM::ExecuteCommand() { SendErrorResponse(STAT_ERROR, 0x80); } + else if ((!IsMediaPS1Disc() || !DoesMediaRegionMatchConsole()) && !m_mode.cdda) + { + SendErrorResponse(STAT_ERROR, ERROR_REASON_INVALID_COMMAND); + } else { SendACKAndStat(); @@ -1166,6 +1183,9 @@ void CDROM::ExecuteCommand() { m_reader.WaitForReadToComplete(); + Log_DevPrintf("GetTN -> %u %u", m_reader.GetMedia()->GetFirstTrackNumber(), + m_reader.GetMedia()->GetLastTrackNumber()); + m_response_fifo.Push(m_secondary_status.bits); m_response_fifo.Push(BinaryToBCD(Truncate8(m_reader.GetMedia()->GetFirstTrackNumber()))); m_response_fifo.Push(BinaryToBCD(Truncate8(m_reader.GetMedia()->GetLastTrackNumber()))); @@ -1205,6 +1225,8 @@ void CDROM::ExecuteCommand() m_response_fifo.Push(m_secondary_status.bits); m_response_fifo.Push(BinaryToBCD(Truncate8(pos.minute))); m_response_fifo.Push(BinaryToBCD(Truncate8(pos.second))); + Log_DevPrintf("GetTD %u -> %u %u", track, pos.minute, pos.second); + SetInterrupt(Interrupt::ACK); } @@ -1750,8 +1772,7 @@ void CDROM::DoIDRead() m_current_lba = 0; m_reader.QueueReadSector(0); - if (g_settings.cdrom_region_check && (m_disc_region == DiscRegion::Other || - System::GetRegion() != System::GetConsoleRegionForDiscRegion(m_disc_region))) + if (!IsMediaPS1Disc() || (g_settings.cdrom_region_check && !DoesMediaRegionMatchConsole())) { stat_byte |= STAT_ID_ERROR; flags_byte |= (1 << 7); // Unlicensed diff --git a/src/core/cdrom.h b/src/core/cdrom.h index 2a0bebd75..db039741c 100644 --- a/src/core/cdrom.h +++ b/src/core/cdrom.h @@ -27,6 +27,8 @@ public: bool HasMedia() const { return m_reader.HasMedia(); } const std::string& GetMediaFileName() const { return m_reader.GetMediaFileName(); } + bool IsMediaPS1Disc() const; + bool DoesMediaRegionMatchConsole() const; void InsertMedia(std::unique_ptr media); std::unique_ptr RemoveMedia(bool force = false);