CD-ROM: Fix CRC and parity checking for XA Mode 2 Form 1 sectors.
This commit is contained in:
@@ -295,7 +295,7 @@ msf_to_bcd(int *m, int *s, int *f)
|
|||||||
void
|
void
|
||||||
cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
||||||
uint32_t major_count, uint32_t minor_count,
|
uint32_t major_count, uint32_t minor_count,
|
||||||
uint32_t major_mult, uint32_t minor_inc)
|
uint32_t major_mult, uint32_t minor_inc, int m2f1)
|
||||||
{
|
{
|
||||||
uint32_t size = major_count * minor_count;
|
uint32_t size = major_count * minor_count;
|
||||||
|
|
||||||
@@ -308,6 +308,9 @@ cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
|||||||
for (uint32_t minor = 0; minor < minor_count; ++minor) {
|
for (uint32_t minor = 0; minor < minor_count; ++minor) {
|
||||||
uint8_t temp = data[index];
|
uint8_t temp = data[index];
|
||||||
|
|
||||||
|
if (m2f1 && (index < 4))
|
||||||
|
temp = 0x00;
|
||||||
|
|
||||||
index += minor_inc;
|
index += minor_inc;
|
||||||
|
|
||||||
if (index >= size)
|
if (index >= size)
|
||||||
@@ -323,14 +326,14 @@ cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void
|
static void
|
||||||
cdrom_generate_ecc_data(cdrom_t *dev, const uint8_t *data)
|
cdrom_generate_ecc_data(cdrom_t *dev, const uint8_t *data, int m2f1)
|
||||||
{
|
{
|
||||||
/* Compute ECC P code. */
|
/* Compute ECC P code. */
|
||||||
cdrom_compute_ecc_block(dev, dev->p_parity, data, 86, 24, 2, 86);
|
cdrom_compute_ecc_block(dev, dev->p_parity, data, 86, 24, 2, 86, m2f1);
|
||||||
|
|
||||||
/* Compute ECC Q code. */
|
/* Compute ECC Q code. */
|
||||||
cdrom_compute_ecc_block(dev, dev->q_parity, data, 52, 43, 86, 88);
|
cdrom_compute_ecc_block(dev, dev->q_parity, data, 52, 43, 86, 88, m2f1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -338,8 +341,9 @@ cdrom_is_sector_good(cdrom_t *dev, const uint8_t *b, const uint8_t mode2, const
|
|||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
|
if (!mode2 || (form != 1)) {
|
||||||
if (mode2 && (form == 1)) {
|
if (mode2 && (form == 1)) {
|
||||||
const uint32_t crc = cdrom_crc32(0xffffffff, b, 2072) ^ 0xffffffff;
|
const uint32_t crc = cdrom_crc32(0xffffffff, &(b[16]), 2056) ^ 0xffffffff;
|
||||||
|
|
||||||
ret = ret && (crc == (*(uint32_t *) &(b[2072])));
|
ret = ret && (crc == (*(uint32_t *) &(b[2072])));
|
||||||
} else if (!mode2) {
|
} else if (!mode2) {
|
||||||
@@ -348,10 +352,11 @@ cdrom_is_sector_good(cdrom_t *dev, const uint8_t *b, const uint8_t mode2, const
|
|||||||
ret = ret && (crc == (*(uint32_t *) &(b[2064])));
|
ret = ret && (crc == (*(uint32_t *) &(b[2064])));
|
||||||
}
|
}
|
||||||
|
|
||||||
cdrom_generate_ecc_data(dev, &(b[12]));
|
cdrom_generate_ecc_data(dev, &(b[12]), mode2 && (form == 1));
|
||||||
|
|
||||||
ret = ret && !memcmp(dev->p_parity, &(b[2076]), 172);
|
ret = ret && !memcmp(dev->p_parity, &(b[2076]), 172);
|
||||||
ret = ret && !memcmp(dev->q_parity, &(b[2248]), 104);
|
ret = ret && !memcmp(dev->q_parity, &(b[2248]), 104);
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,6 @@
|
|||||||
#define __STDC_FORMAT_MACROS
|
#define __STDC_FORMAT_MACROS
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
// #define ENABLE_IMAGE_LOG 1
|
|
||||||
#ifdef ENABLE_IMAGE_LOG
|
#ifdef ENABLE_IMAGE_LOG
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#endif
|
#endif
|
||||||
@@ -2045,7 +2044,7 @@ image_load_mds(cd_image_t *img, const char *mdsfile)
|
|||||||
ci->file = tf;
|
ci->file = tf;
|
||||||
} else {
|
} else {
|
||||||
ci->start = (mds_trk_block.pm * 60 * 75) + (mds_trk_block.ps * 75) + mds_trk_block.pf;
|
ci->start = (mds_trk_block.pm * 60 * 75) + (mds_trk_block.ps * 75) + mds_trk_block.pf;
|
||||||
ci->type = INDEX_ZERO;
|
ci->type = INDEX_NONE;
|
||||||
ci->file_start = 0;
|
ci->file_start = 0;
|
||||||
ci->file_length = 0;
|
ci->file_length = 0;
|
||||||
ci->file = NULL;
|
ci->file = NULL;
|
||||||
@@ -2309,28 +2308,21 @@ image_read_sector(const void *local, uint8_t *buffer,
|
|||||||
if ((ret > 0) && (trk->attr & 0x04) && ((idx->type < INDEX_NORMAL) || !track_is_raw)) {
|
if ((ret > 0) && (trk->attr & 0x04) && ((idx->type < INDEX_NORMAL) || !track_is_raw)) {
|
||||||
uint32_t crc;
|
uint32_t crc;
|
||||||
|
|
||||||
if ((trk->mode == 2) && (trk->form == 1))
|
if ((trk->mode == 2) && (trk->form == 1)) {
|
||||||
crc = cdrom_crc32(0xffffffff, buf, 2072) ^ 0xffffffff;
|
crc = cdrom_crc32(0xffffffff, &(buf[16]), 2056) ^ 0xffffffff;
|
||||||
else
|
memcpy(&(buf[2072]), &crc, 4);
|
||||||
|
} else {
|
||||||
crc = cdrom_crc32(0xffffffff, buf, 2064) ^ 0xffffffff;
|
crc = cdrom_crc32(0xffffffff, buf, 2064) ^ 0xffffffff;
|
||||||
|
|
||||||
memcpy(&(buf[2064]), &crc, 4);
|
memcpy(&(buf[2064]), &crc, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
int m2f1 = (trk->mode == 2) && (trk->form == 1);
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* Compute ECC P code. */
|
/* Compute ECC P code. */
|
||||||
cdrom_compute_ecc_block(dev, dev->p_parity, &(buf[12]), 86, 24, 2, 86);
|
cdrom_compute_ecc_block(dev, &(buf[2076]), &(buf[12]), 86, 24, 2, 86, m2f1);
|
||||||
memcpy(&(buf[2076]), dev->p_parity, 172);
|
|
||||||
|
|
||||||
/* Compute ECC Q code. */
|
/* Compute ECC Q code. */
|
||||||
cdrom_compute_ecc_block(dev, dev->q_parity, &(buf[12]), 52, 43, 86, 88);
|
cdrom_compute_ecc_block(dev, &(buf[2248]), &(buf[12]), 52, 43, 86, 88, m2f1);
|
||||||
memcpy(&(buf[2248]), dev->q_parity, 104);
|
|
||||||
#else
|
|
||||||
/* Compute ECC P code. */
|
|
||||||
cdrom_compute_ecc_block(dev, &(buf[2076]), &(buf[12]), 86, 24, 2, 86);
|
|
||||||
|
|
||||||
/* Compute ECC Q code. */
|
|
||||||
cdrom_compute_ecc_block(dev, &(buf[2248]), &(buf[12]), 52, 43, 86, 88);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret > 0) && ((idx->type < INDEX_NORMAL) || (trk->subch_type != 0x08))) {
|
if ((ret > 0) && ((idx->type < INDEX_NORMAL) || (trk->subch_type != 0x08))) {
|
||||||
|
|||||||
@@ -459,7 +459,7 @@ extern void cdrom_reload(const uint8_t id);
|
|||||||
|
|
||||||
extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
extern void cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data,
|
||||||
uint32_t major_count, uint32_t minor_count,
|
uint32_t major_count, uint32_t minor_count,
|
||||||
uint32_t major_mult, uint32_t minor_inc);
|
uint32_t major_mult, uint32_t minor_inc, int m2f1);
|
||||||
extern unsigned long cdrom_crc32(unsigned long crc, const unsigned char *buf,
|
extern unsigned long cdrom_crc32(unsigned long crc, const unsigned char *buf,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user