Skip to content

Commit

Permalink
CDROM: More accurate approximation of sectors per track
Browse files Browse the repository at this point in the history
  • Loading branch information
stenzek committed Nov 12, 2024
1 parent 4763b67 commit 5cf2c86
Showing 1 changed file with 45 additions and 2 deletions.
47 changes: 45 additions & 2 deletions src/core/cdrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1497,8 +1497,51 @@ TickCount CDROM::GetTicksForRead()

u32 CDROM::GetSectorsPerTrack(CDImage::LBA lba)
{
return static_cast<CDImage::LBA>(9.0f +
2.5440497f * std::log(static_cast<float>(lba / CDImage::FRAMES_PER_MINUTE) + 1u));
using SPTTable = std::array<u8, 80>;

static constexpr const SPTTable spt_table = []() constexpr -> SPTTable {
// Based on mech behaviour, thanks rama for these numbers!
// Note that minutes beyond 71 are buggy on the real mech, it uses the 71 minute table
// regardless of the disc size. This matches the 71 minute table.
SPTTable table = {};
for (size_t mm = 0; mm < table.size(); mm++)
{
if (mm == 0) // 00 = 8
table[mm] = 8;
else if (mm <= 4) // 01-04 = 9
table[mm] = 9;
else if (mm <= 7) // 05-07 = 10
table[mm] = 10;
else if (mm <= 11) // 08-11 = 11
table[mm] = 11;
else if (mm <= 16) // 12-16 = 12
table[mm] = 12;
else if (mm <= 23) // 17-23 = 13
table[mm] = 13;
else if (mm <= 27) // 24-27 = 14
table[mm] = 14;
else if (mm <= 32) // 28-32 = 15
table[mm] = 15;
else if (mm <= 39) // 32-39 = 16
table[mm] = 16;
else if (mm <= 44) // 40-44 = 17
table[mm] = 17;
else if (mm <= 52) // 45-52 = 18
table[mm] = 18;
else if (mm <= 60) // 53-60 = 19
table[mm] = 19;
else if (mm <= 67) // 61-66 = 20
table[mm] = 20;
else if (mm <= 74) // 67-74 = 21
table[mm] = 21;
else // 75-80 = 22
table[mm] = 22;
}
return table;
}();

const u32 mm = lba / CDImage::FRAMES_PER_MINUTE;
return spt_table[std::min(mm, static_cast<u32>(spt_table.size()))];
}

TickCount CDROM::GetTicksForSeek(CDImage::LBA new_lba, bool ignore_speed_change)
Expand Down

0 comments on commit 5cf2c86

Please sign in to comment.