CDROM: Physical => SubQ in variables

Better describes what it actually is.
This commit is contained in:
Stenzek 2024-09-29 18:01:42 +10:00
parent 9de5794afe
commit 6dc4fa5c75
No known key found for this signature in database
1 changed files with 52 additions and 52 deletions

View File

@ -344,8 +344,8 @@ static void StopReadingWithDataEnd();
static void StartMotor(); static void StartMotor();
static void StopMotor(); static void StopMotor();
static void BeginSeeking(bool logical, bool read_after_seek, bool play_after_seek); static void BeginSeeking(bool logical, bool read_after_seek, bool play_after_seek);
static void UpdatePositionWhileSeeking(); static void UpdateSubQPositionWhileSeeking();
static void UpdatePhysicalPosition(bool update_logical); static void UpdateSubQPosition(bool update_logical);
static void SetHoldPosition(CDImage::LBA lba, bool update_subq); static void SetHoldPosition(CDImage::LBA lba, bool update_subq);
static void ResetCurrentXAFile(); static void ResetCurrentXAFile();
static void ResetAudioDecoder(); static void ResetAudioDecoder();
@ -383,7 +383,7 @@ struct CDROMState
&CDROM::DeliverAsyncInterrupt, nullptr}; &CDROM::DeliverAsyncInterrupt, nullptr};
TimingEvent drive_event{"CDROM Drive Event", 1, 1, &CDROM::ExecuteDrive, nullptr}; TimingEvent drive_event{"CDROM Drive Event", 1, 1, &CDROM::ExecuteDrive, nullptr};
GlobalTicks physical_lba_update_tick = 0; GlobalTicks subq_lba_update_tick = 0;
GlobalTicks last_interrupt_time = 0; GlobalTicks last_interrupt_time = 0;
Command command = Command::None; Command command = Command::None;
@ -408,10 +408,10 @@ struct CDROMState
CDImage::Position setloc_position = {}; CDImage::Position setloc_position = {};
CDImage::LBA requested_lba = 0; CDImage::LBA requested_lba = 0;
CDImage::LBA current_lba = 0; // this is the hold position CDImage::LBA current_lba = 0; // this is the hold position
CDImage::LBA current_subq_lba = 0; // current position of the disc with respect to time
CDImage::LBA seek_start_lba = 0; CDImage::LBA seek_start_lba = 0;
CDImage::LBA seek_end_lba = 0; CDImage::LBA seek_end_lba = 0;
CDImage::LBA physical_lba = 0; // current position of the disc with respect to time u32 subq_lba_update_carry = 0;
u32 physical_lba_update_carry = 0;
bool muted = false; bool muted = false;
bool adpcm_muted = false; bool adpcm_muted = false;
@ -632,9 +632,9 @@ TickCount CDROM::SoftReset(TickCount ticks_late)
if (HasMedia()) if (HasMedia())
{ {
if (IsSeeking()) if (IsSeeking())
UpdatePositionWhileSeeking(); UpdateSubQPositionWhileSeeking();
else else
UpdatePhysicalPosition(false); UpdateSubQPosition(false);
const TickCount speed_change_ticks = was_double_speed ? GetTicksForSpeedChange() : 0; const TickCount speed_change_ticks = was_double_speed ? GetTicksForSpeedChange() : 0;
const TickCount seek_ticks = (s_state.current_lba != 0) ? GetTicksForSeek(0) : 0; const TickCount seek_ticks = (s_state.current_lba != 0) ? GetTicksForSeek(0) : 0;
@ -697,20 +697,20 @@ bool CDROM::DoState(StateWrapper& sw)
sw.Do(&s_state.current_lba); sw.Do(&s_state.current_lba);
sw.Do(&s_state.seek_start_lba); sw.Do(&s_state.seek_start_lba);
sw.Do(&s_state.seek_end_lba); sw.Do(&s_state.seek_end_lba);
sw.DoEx(&s_state.physical_lba, 49, s_state.current_lba); sw.DoEx(&s_state.current_subq_lba, 49, s_state.current_lba);
if (sw.GetVersion() < 71) [[unlikely]] if (sw.GetVersion() < 71) [[unlikely]]
{ {
u32 physical_lba_update_tick32 = 0; u32 subq_lba_update_tick32 = 0;
sw.DoEx(&physical_lba_update_tick32, 49, static_cast<u32>(0)); sw.DoEx(&subq_lba_update_tick32, 49, static_cast<u32>(0));
s_state.physical_lba_update_tick = physical_lba_update_tick32; s_state.subq_lba_update_tick = subq_lba_update_tick32;
} }
else else
{ {
sw.Do(&s_state.physical_lba_update_tick); sw.Do(&s_state.subq_lba_update_tick);
} }
sw.DoEx(&s_state.physical_lba_update_carry, 54, static_cast<u32>(0)); sw.DoEx(&s_state.subq_lba_update_carry, 54, static_cast<u32>(0));
sw.Do(&s_state.setloc_pending); sw.Do(&s_state.setloc_pending);
sw.Do(&s_state.read_after_seek); sw.Do(&s_state.read_after_seek);
sw.Do(&s_state.play_after_seek); sw.Do(&s_state.play_after_seek);
@ -1474,11 +1474,11 @@ TickCount CDROM::GetTicksForSeek(CDImage::LBA new_lba, bool ignore_speed_change)
// Update start position for seek. // Update start position for seek.
if (IsSeeking()) if (IsSeeking())
UpdatePositionWhileSeeking(); UpdateSubQPositionWhileSeeking();
else else
UpdatePhysicalPosition(false); UpdateSubQPosition(false);
const CDImage::LBA current_lba = IsMotorOn() ? (IsSeeking() ? s_state.seek_end_lba : s_state.physical_lba) : 0; const CDImage::LBA current_lba = IsMotorOn() ? (IsSeeking() ? s_state.seek_end_lba : s_state.current_subq_lba) : 0;
const CDImage::LBA lba_diff = ((new_lba > current_lba) ? (new_lba - current_lba) : (current_lba - new_lba)); const CDImage::LBA lba_diff = ((new_lba > current_lba) ? (new_lba - current_lba) : (current_lba - new_lba));
// Motor spin-up time. // Motor spin-up time.
@ -2127,7 +2127,7 @@ void CDROM::ExecuteCommand(void*, TickCount ticks, TickCount ticks_late)
} }
else else
{ {
UpdatePhysicalPosition(true); UpdateSubQPosition(true);
DEBUG_LOG("CDROM GetlocL command - [{:02X}:{:02X}:{:02X}]", s_state.last_sector_header.minute, DEBUG_LOG("CDROM GetlocL command - [{:02X}:{:02X}:{:02X}]", s_state.last_sector_header.minute,
s_state.last_sector_header.second, s_state.last_sector_header.frame); s_state.last_sector_header.second, s_state.last_sector_header.frame);
@ -2153,9 +2153,9 @@ void CDROM::ExecuteCommand(void*, TickCount ticks, TickCount ticks_late)
else else
{ {
if (IsSeeking()) if (IsSeeking())
UpdatePositionWhileSeeking(); UpdateSubQPositionWhileSeeking();
else else
UpdatePhysicalPosition(false); UpdateSubQPosition(false);
DEV_LOG("CDROM GetlocP command - T{:02x} I{:02x} R[{:02x}:{:02x}:{:02x}] A[{:02x}:{:02x}:{:02x}]", DEV_LOG("CDROM GetlocP command - T{:02x} I{:02x} R[{:02x}:{:02x}:{:02x}] A[{:02x}:{:02x}:{:02x}]",
s_state.last_subq.track_number_bcd, s_state.last_subq.index_number_bcd, s_state.last_subq.track_number_bcd, s_state.last_subq.index_number_bcd,
@ -2684,7 +2684,7 @@ void CDROM::BeginSeeking(bool logical, bool read_after_seek, bool play_after_see
s_reader.QueueReadSector(s_state.requested_lba); s_reader.QueueReadSector(s_state.requested_lba);
} }
void CDROM::UpdatePositionWhileSeeking() void CDROM::UpdateSubQPositionWhileSeeking()
{ {
DebugAssert(IsSeeking()); DebugAssert(IsSeeking());
@ -2721,29 +2721,29 @@ void CDROM::UpdatePositionWhileSeeking()
// access the image directly since we want to preserve the cached data for the seek complete // access the image directly since we want to preserve the cached data for the seek complete
CDImage::SubChannelQ subq; CDImage::SubChannelQ subq;
if (!s_reader.ReadSectorUncached(current_lba, &subq, nullptr)) if (!s_reader.ReadSectorUncached(current_lba, &subq, nullptr))
ERROR_LOG("Failed to read subq for sector {} for physical position", current_lba); ERROR_LOG("Failed to read subq for sector {} for subq position", current_lba);
else if (subq.IsCRCValid()) else if (subq.IsCRCValid())
s_state.last_subq = subq; s_state.last_subq = subq;
s_state.current_lba = current_lba; s_state.current_lba = current_lba;
s_state.physical_lba = current_lba; s_state.current_subq_lba = current_lba;
s_state.physical_lba_update_tick = System::GetGlobalTickCounter(); s_state.subq_lba_update_tick = System::GetGlobalTickCounter();
s_state.physical_lba_update_carry = 0; s_state.subq_lba_update_carry = 0;
} }
void CDROM::UpdatePhysicalPosition(bool update_logical) void CDROM::UpdateSubQPosition(bool update_logical)
{ {
const GlobalTicks ticks = System::GetGlobalTickCounter(); const GlobalTicks ticks = System::GetGlobalTickCounter();
if (IsSeeking() || IsReadingOrPlaying() || !IsMotorOn()) if (IsSeeking() || IsReadingOrPlaying() || !IsMotorOn())
{ {
// If we're seeking+reading the first sector (no stat bits set), we need to return the set/current lba, not the last // If we're seeking+reading the first sector (no stat bits set), we need to return the set/current lba, not the last
// physical LBA. Failing to do so may result in a track-jumped position getting returned in GetlocP, which causes // SubQ LBA. Failing to do so may result in a track-jumped position getting returned in GetlocP, which causes
// Mad Panic Coaster to go into a seek+play loop. // Mad Panic Coaster to go into a seek+play loop.
if ((s_state.secondary_status.bits & (STAT_READING | STAT_PLAYING_CDDA | STAT_MOTOR_ON)) == STAT_MOTOR_ON && if ((s_state.secondary_status.bits & (STAT_READING | STAT_PLAYING_CDDA | STAT_MOTOR_ON)) == STAT_MOTOR_ON &&
s_state.current_lba != s_state.physical_lba) s_state.current_lba != s_state.current_subq_lba)
{ {
WARNING_LOG("Jumping to hold position [{}->{}] while {} first sector", s_state.physical_lba, s_state.current_lba, WARNING_LOG("Jumping to hold position [{}->{}] while {} first sector", s_state.current_subq_lba,
(s_state.drive_state == DriveState::Reading) ? "reading" : "playing"); s_state.current_lba, (s_state.drive_state == DriveState::Reading) ? "reading" : "playing");
SetHoldPosition(s_state.current_lba, true); SetHoldPosition(s_state.current_lba, true);
} }
@ -2752,7 +2752,7 @@ void CDROM::UpdatePhysicalPosition(bool update_logical)
} }
const u32 ticks_per_read = GetTicksForRead(); const u32 ticks_per_read = GetTicksForRead();
const u32 diff = static_cast<u32>((ticks - s_state.physical_lba_update_tick) + s_state.physical_lba_update_carry); const u32 diff = static_cast<u32>((ticks - s_state.subq_lba_update_tick) + s_state.subq_lba_update_carry);
const u32 sector_diff = diff / ticks_per_read; const u32 sector_diff = diff / ticks_per_read;
const u32 carry = diff % ticks_per_read; const u32 carry = diff % ticks_per_read;
if (sector_diff > 0) if (sector_diff > 0)
@ -2762,23 +2762,23 @@ void CDROM::UpdatePhysicalPosition(bool update_logical)
const CDImage::LBA sectors_per_track = GetSectorsPerTrack(s_state.current_lba); const CDImage::LBA sectors_per_track = GetSectorsPerTrack(s_state.current_lba);
const CDImage::LBA hold_position = s_state.current_lba + hold_offset; const CDImage::LBA hold_position = s_state.current_lba + hold_offset;
const CDImage::LBA tjump_position = (hold_position >= sectors_per_track) ? (hold_position - sectors_per_track) : 0; const CDImage::LBA tjump_position = (hold_position >= sectors_per_track) ? (hold_position - sectors_per_track) : 0;
const CDImage::LBA old_offset = s_state.physical_lba - tjump_position; const CDImage::LBA old_offset = s_state.current_subq_lba - tjump_position;
const CDImage::LBA new_offset = (old_offset + sector_diff) % sectors_per_track; const CDImage::LBA new_offset = (old_offset + sector_diff) % sectors_per_track;
const CDImage::LBA new_physical_lba = tjump_position + new_offset; const CDImage::LBA new_subq_lba = tjump_position + new_offset;
#ifdef _DEBUG #ifdef _DEBUG
DEV_LOG("{} sectors @ {} SPT, old pos {}, hold pos {}, tjump pos {}, new pos {}", sector_diff, sectors_per_track, DEV_LOG("{} sectors @ {} SPT, old pos {}, hold pos {}, tjump pos {}, new pos {}", sector_diff, sectors_per_track,
LBAToMSFString(s_state.physical_lba), LBAToMSFString(hold_position), LBAToMSFString(tjump_position), LBAToMSFString(s_state.current_subq_lba), LBAToMSFString(hold_position), LBAToMSFString(tjump_position),
LBAToMSFString(new_physical_lba)); LBAToMSFString(new_subq_lba));
#endif #endif
if (s_state.physical_lba != new_physical_lba) if (s_state.current_subq_lba != new_subq_lba)
{ {
s_state.physical_lba = new_physical_lba; s_state.current_subq_lba = new_subq_lba;
CDImage::SubChannelQ subq; CDImage::SubChannelQ subq;
CDROMAsyncReader::SectorBuffer raw_sector; CDROMAsyncReader::SectorBuffer raw_sector;
if (!s_reader.ReadSectorUncached(new_physical_lba, &subq, update_logical ? &raw_sector : nullptr)) if (!s_reader.ReadSectorUncached(new_subq_lba, &subq, update_logical ? &raw_sector : nullptr))
{ {
ERROR_LOG("Failed to read subq for sector {} for physical position", new_physical_lba); ERROR_LOG("Failed to read subq for sector {} for subq position", new_subq_lba);
} }
else else
{ {
@ -2789,27 +2789,27 @@ void CDROM::UpdatePhysicalPosition(bool update_logical)
ProcessDataSectorHeader(raw_sector.data()); ProcessDataSectorHeader(raw_sector.data());
} }
s_state.physical_lba_update_tick = ticks; s_state.subq_lba_update_tick = ticks;
s_state.physical_lba_update_carry = carry; s_state.subq_lba_update_carry = carry;
} }
} }
} }
void CDROM::SetHoldPosition(CDImage::LBA lba, bool update_subq) void CDROM::SetHoldPosition(CDImage::LBA lba, bool update_subq)
{ {
if (update_subq && s_state.physical_lba != lba && CanReadMedia()) if (update_subq && s_state.current_subq_lba != lba && CanReadMedia())
{ {
CDImage::SubChannelQ subq; CDImage::SubChannelQ subq;
if (!s_reader.ReadSectorUncached(lba, &subq, nullptr)) if (!s_reader.ReadSectorUncached(lba, &subq, nullptr))
ERROR_LOG("Failed to read subq for sector {} for physical position", lba); ERROR_LOG("Failed to read subq for sector {} for subq position", lba);
else if (subq.IsCRCValid()) else if (subq.IsCRCValid())
s_state.last_subq = subq; s_state.last_subq = subq;
} }
s_state.current_lba = lba; s_state.current_lba = lba;
s_state.physical_lba = lba; s_state.current_subq_lba = lba;
s_state.physical_lba_update_tick = System::GetGlobalTickCounter(); s_state.subq_lba_update_tick = System::GetGlobalTickCounter();
s_state.physical_lba_update_carry = 0; s_state.subq_lba_update_carry = 0;
} }
void CDROM::DoShellOpenComplete(TickCount ticks_late) void CDROM::DoShellOpenComplete(TickCount ticks_late)
@ -2875,9 +2875,9 @@ bool CDROM::CompleteSeek()
s_state.current_lba = s_reader.GetLastReadSector(); s_state.current_lba = s_reader.GetLastReadSector();
} }
s_state.physical_lba = s_state.current_lba; s_state.current_subq_lba = s_state.current_lba;
s_state.physical_lba_update_tick = System::GetGlobalTickCounter(); s_state.subq_lba_update_tick = System::GetGlobalTickCounter();
s_state.physical_lba_update_carry = 0; s_state.subq_lba_update_carry = 0;
return seek_okay; return seek_okay;
} }
@ -3056,9 +3056,9 @@ void CDROM::DoSectorRead()
Panic("Sector read failed"); Panic("Sector read failed");
s_state.current_lba = s_reader.GetLastReadSector(); s_state.current_lba = s_reader.GetLastReadSector();
s_state.physical_lba = s_state.current_lba; s_state.current_subq_lba = s_state.current_lba;
s_state.physical_lba_update_tick = System::GetGlobalTickCounter(); s_state.subq_lba_update_tick = System::GetGlobalTickCounter();
s_state.physical_lba_update_carry = 0; s_state.subq_lba_update_carry = 0;
s_state.secondary_status.SetReadingBits(s_state.drive_state == DriveState::Playing); s_state.secondary_status.SetReadingBits(s_state.drive_state == DriveState::Playing);