diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 3bfada9ec..a163c9390 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -295,7 +295,7 @@ msf_to_bcd(int *m, int *s, int *f) 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_mult, uint32_t minor_inc) + uint32_t major_mult, uint32_t minor_inc, int m2f1) { 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) { uint8_t temp = data[index]; + if (m2f1 && (index < 4)) + temp = 0x00; + index += minor_inc; if (index >= size) @@ -323,14 +326,14 @@ cdrom_compute_ecc_block(cdrom_t *dev, uint8_t *parity, const uint8_t *data, } } -extern void -cdrom_generate_ecc_data(cdrom_t *dev, const uint8_t *data) +static void +cdrom_generate_ecc_data(cdrom_t *dev, const uint8_t *data, int m2f1) { /* 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. */ - 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 @@ -338,21 +341,23 @@ cdrom_is_sector_good(cdrom_t *dev, const uint8_t *b, const uint8_t mode2, const { int ret = 1; - if (mode2 && (form == 1)) { - const uint32_t crc = cdrom_crc32(0xffffffff, b, 2072) ^ 0xffffffff; + if (!mode2 || (form != 1)) { + if (mode2 && (form == 1)) { + const uint32_t crc = cdrom_crc32(0xffffffff, &(b[16]), 2056) ^ 0xffffffff; - ret = ret && (crc == (*(uint32_t *) &(b[2072]))); - } else if (!mode2) { - const uint32_t crc = cdrom_crc32(0xffffffff, b, 2064) ^ 0xffffffff; + ret = ret && (crc == (*(uint32_t *) &(b[2072]))); + } else if (!mode2) { + const uint32_t crc = cdrom_crc32(0xffffffff, b, 2064) ^ 0xffffffff; - ret = ret && (crc == (*(uint32_t *) &(b[2064]))); + ret = ret && (crc == (*(uint32_t *) &(b[2064]))); + } + + cdrom_generate_ecc_data(dev, &(b[12]), mode2 && (form == 1)); + + ret = ret && !memcmp(dev->p_parity, &(b[2076]), 172); + ret = ret && !memcmp(dev->q_parity, &(b[2248]), 104); } - cdrom_generate_ecc_data(dev, &(b[12])); - - ret = ret && !memcmp(dev->p_parity, &(b[2076]), 172); - ret = ret && !memcmp(dev->q_parity, &(b[2248]), 104); - return ret; } @@ -379,7 +384,7 @@ read_data(cdrom_t *dev, const uint32_t lba, int check) else if (dev->raw_buffer[dev->cur_buf ^ 1][0x0012] == dev->raw_buffer[dev->cur_buf ^ 1][0x0016]) form = ((dev->raw_buffer[dev->cur_buf ^ 1][0x0012] & - 0x20) >> 5) + 1; + 0x20) >> 5) + 1; } else if (dev->raw_buffer[dev->cur_buf ^ 1][0x000f] == 0x02) dev->mode2 = 1; diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index ccb2ebe09..ff1a913c3 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -19,7 +19,6 @@ #define __STDC_FORMAT_MACROS #include #include -// #define ENABLE_IMAGE_LOG 1 #ifdef ENABLE_IMAGE_LOG #include #endif @@ -2045,7 +2044,7 @@ image_load_mds(cd_image_t *img, const char *mdsfile) ci->file = tf; } else { 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_length = 0; 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)) { uint32_t crc; - if ((trk->mode == 2) && (trk->form == 1)) - crc = cdrom_crc32(0xffffffff, buf, 2072) ^ 0xffffffff; - else + if ((trk->mode == 2) && (trk->form == 1)) { + crc = cdrom_crc32(0xffffffff, &(buf[16]), 2056) ^ 0xffffffff; + memcpy(&(buf[2072]), &crc, 4); + } else { 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. */ - cdrom_compute_ecc_block(dev, dev->p_parity, &(buf[12]), 86, 24, 2, 86); - memcpy(&(buf[2076]), dev->p_parity, 172); + cdrom_compute_ecc_block(dev, &(buf[2076]), &(buf[12]), 86, 24, 2, 86, m2f1); /* Compute ECC Q code. */ - cdrom_compute_ecc_block(dev, dev->q_parity, &(buf[12]), 52, 43, 86, 88); - 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 + cdrom_compute_ecc_block(dev, &(buf[2248]), &(buf[12]), 52, 43, 86, 88, m2f1); } if ((ret > 0) && ((idx->type < INDEX_NORMAL) || (trk->subch_type != 0x08))) { diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index ebfc2722e..a031da199 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -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, 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, size_t len);