| 872 | } |
| 873 | |
| 874 | static uint cdvdBlockReadTime(CDVD_MODE_TYPE mode) noexcept |
| 875 | { |
| 876 | // CAV Read speed is roughly 41% in the centre full speed on outer edge. I imagine it's more logarithmic than this |
| 877 | if (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV) |
| 878 | { |
| 879 | int numSectors = 0; |
| 880 | int offset = 0; |
| 881 | |
| 882 | // Sector counts are taken from google for Single layer, Dual layer DVD's and for 700MB CD's |
| 883 | switch (cdvd.DiscType) |
| 884 | { |
| 885 | case CDVD_TYPE_DETCTDVDS: |
| 886 | case CDVD_TYPE_PS2DVD: |
| 887 | case CDVD_TYPE_DETCTDVDD: |
| 888 | numSectors = 2298496; |
| 889 | u32 layer1Start; |
| 890 | s32 dualType; |
| 891 | |
| 892 | // Layer 1 needs an offset as it goes back to the middle of the disc |
| 893 | cdvdReadDvdDualInfo(&dualType, &layer1Start); |
| 894 | if (cdvd.SeekToSector >= layer1Start) |
| 895 | offset = layer1Start; |
| 896 | break; |
| 897 | default: // Pretty much every CD format |
| 898 | numSectors = 360000; |
| 899 | break; |
| 900 | } |
| 901 | |
| 902 | // 0.40f is the "base" inner track speed. |
| 903 | const float sectorSpeed = ((static_cast<float>(cdvd.SeekToSector - offset) / static_cast<float>(numSectors)) * 0.60f) + 0.40f; |
| 904 | const float cycles = static_cast<float>(PSXCLK) / (static_cast<float>(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed) * sectorSpeed); |
| 905 | |
| 906 | return static_cast<int>(cycles); |
| 907 | } |
| 908 | |
| 909 | // CLV Read Speed is constant |
| 910 | const float cycles = static_cast<float>(PSXCLK) / static_cast<float>(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * std::min(static_cast<float>(cdvd.Speed), (mode == MODE_CDROM) ? 10.3f : 1.6f)); |
| 911 | |
| 912 | return static_cast<int>(cycles); |
| 913 | } |
| 914 | |
| 915 | void cdvdReset() |
| 916 | { |
no test coverage detected