19 inline const std::array<quint32, 256> &
edcTable()
21 static const std::array<quint32, 256> table = []() {
22 std::array<quint32, 256> result{};
23 for (quint32 i = 0; i < 256; ++i) {
25 for (
int bit = 0; bit < 8; ++bit) {
26 value = (value >> 1) ^ ((value & 1U) ? 0xD8018001U : 0U);
35 inline quint32
computeEdc(
const quint8 *data, qsizetype size)
39 for (qsizetype i = 0; i < size; ++i) {
40 edc = (edc >> 8) ^ table[(edc ^ data[i]) & 0xffU];
51 for (
int i = 0; i < 256; ++i) {
52 const int doubled = (i << 1) ^ ((i & 0x80) ? 0x11d : 0);
65 inline void computeEcc(
const quint8 *source, quint32 majorCount, quint32 minorCount,
66 quint32 majorMultiplier, quint32 minorIncrement, quint8 *destination)
69 const quint32 size = majorCount * minorCount;
71 for (quint32 major = 0; major < majorCount; ++major) {
72 quint32 index = (major >> 1) * majorMultiplier + (major & 1U);
76 for (quint32 minor = 0; minor < minorCount; ++minor) {
77 const quint8 value = source[index];
78 index += minorIncrement;
84 eccA = tables.forward[eccA];
87 eccA = tables.backward[tables.forward[eccA] ^ eccB];
88 destination[major] = eccA;
89 destination[major + majorCount] = eccA ^ eccB;
95 destination[0] = quint8(edc);
96 destination[1] = quint8(edc >> 8);
97 destination[2] = quint8(edc >> 16);
98 destination[3] = quint8(edc >> 24);
103 if (sector[0] != 0 || sector[11] != 0) {
106 for (
int i = 1; i < 11; ++i) {
107 if (sector[i] != 0xff) {
122 auto *sector =
reinterpret_cast<quint8 *
>(sectorData.data());
127 const quint8 mode = sector[15];
142 if (std::memcmp(sector + 16, sector + 20, 4) != 0) {
147 if ((sector[18] & 0x20U) != 0) {
159 quint8 addressAndMode[4];
160 std::memcpy(addressAndMode, sector + 12,
sizeof(addressAndMode));
161 std::memset(sector + 12, 0,
sizeof(addressAndMode));
164 std::memcpy(sector + 12, addressAndMode,
sizeof(addressAndMode));
171 const qint64 previousPos = io.pos();
172 const qint64 sectorPos = qint64(num) *
SECTOR_SIZE;
174 if (!io.seek(sectorPos)) {
181 ok = io.seek(sectorPos) && io.write(sectorData) ==
SECTOR_SIZE;
184 if (!io.seek(previousPos)) {
200 auto *sector =
reinterpret_cast<quint8 *
>(sectorData.data());
201 if (
hasCdRomSync(sector) && (sector[15] == 1 || sector[15] == 2)) {
202 const quint8 mode = sector[15];
204 if (address.size() != 3) {
207 std::memcpy(sector + 12, address.constData(), 3);
#define SECTOR_SIZE
Definition: IsoArchive.h:16
Definition: IsoArchive.h:200
static QByteArray int2Header(quint32 id)
Definition: IsoArchive.h:218
quint32 currentSector() const
Definition: IsoArchive.cpp:488
Definition: PsxCdromEdcEcc.h:11
bool updateSectorEdcEcc(QByteArray §orData)
Definition: PsxCdromEdcEcc.h:116
bool hasCdRomSync(const quint8 *sector)
Definition: PsxCdromEdcEcc.h:101
constexpr int Mode2Form1EdcOffset
Definition: PsxCdromEdcEcc.h:14
const std::array< quint32, 256 > & edcTable()
Definition: PsxCdromEdcEcc.h:19
void computeEcc(const quint8 *source, quint32 majorCount, quint32 minorCount, quint32 majorMultiplier, quint32 minorIncrement, quint8 *destination)
Definition: PsxCdromEdcEcc.h:65
bool repairSector(IsoArchiveIO &io, quint32 num)
Definition: PsxCdromEdcEcc.h:169
void writeEdcLittleEndian(quint8 *destination, quint32 edc)
Definition: PsxCdromEdcEcc.h:93
constexpr int EccPOffset
Definition: PsxCdromEdcEcc.h:16
constexpr int Mode2Form2EdcOffset
Definition: PsxCdromEdcEcc.h:15
const EccTables & eccTables()
Definition: PsxCdromEdcEcc.h:59
constexpr int Mode1EdcOffset
Definition: PsxCdromEdcEcc.h:13
quint32 computeEdc(const quint8 *data, qsizetype size)
Definition: PsxCdromEdcEcc.h:35
constexpr int EccQOffset
Definition: PsxCdromEdcEcc.h:17
bool writeRelocatedSector(IsoArchiveIO &io, QByteArray sectorData)
Definition: PsxCdromEdcEcc.h:194
Definition: PsxCdromEdcEcc.h:45
std::array< quint8, 256 > backward
Definition: PsxCdromEdcEcc.h:47
std::array< quint8, 256 > forward
Definition: PsxCdromEdcEcc.h:46
EccTables()
Definition: PsxCdromEdcEcc.h:49