diff --git a/src/guest/gdrom/cdi.c b/src/guest/gdrom/cdi.c index 5ed24431..604bf382 100644 --- a/src/guest/gdrom/cdi.c +++ b/src/guest/gdrom/cdi.c @@ -13,9 +13,9 @@ static const char *cdi_version_names[] = { "2", "3", "3.5", }; -static const int cdi_sectors[] = {2048, 2336, 2352}; +static const char *cdi_sector_modes[] = {"CDDA", "MODE1", "MODE2"}; -static const char *cdi_modes[] = {"CDDA", "MODE1", "MODE2"}; +static const int cdi_sector_sizes[] = {2048, 2336, 2352}; static const uint8_t cdi_start_mark[] = {0, 0, 1, 0, 0, 0, 255, 255, 255, 255}; @@ -145,14 +145,14 @@ static int cdi_parse_track(struct disc *disc, uint32_t version, } /* parse track info */ - uint32_t pregap_len, track_len, mode, lba, total_len, sector_type; + uint32_t pregap_len, track_len, sector_mode, lba, total_len, sector_type; fseek(fp, 2, SEEK_CUR); r = fread(&pregap_len, 4, 1, fp); CHECK_EQ(r, 1); r = fread(&track_len, 4, 1, fp); CHECK_EQ(r, 1); fseek(fp, 6, SEEK_CUR); - r = fread(&mode, 4, 1, fp); + r = fread(§or_mode, 4, 1, fp); CHECK_EQ(r, 1); fseek(fp, 12, SEEK_CUR); r = fread(&lba, 4, 1, fp); @@ -168,61 +168,28 @@ static int cdi_parse_track(struct disc *disc, uint32_t version, return 0; } - if (sector_type >= ARRAY_SIZE(cdi_sectors)) { + if (sector_type >= ARRAY_SIZE(cdi_sector_sizes)) { LOG_WARNING("cdi_parse unsupported sector type 0x%x", sector_type); return 0; } - int sector_size = cdi_sectors[sector_type]; + int sector_size = cdi_sector_sizes[sector_type]; int data_offset = *track_offset + pregap_len * sector_size; + if (!track_set_layout(track, sector_mode, sector_size)) { + LOG_WARNING("cdi_parse unsupported track layout mode=%d size=%d", + sector_mode, sector_size); + return 0; + } + track->fad = pregap_len + lba; track->adr = 0; - track->ctrl = mode == 0 ? 0 : 4; - if (mode == 0 && sector_size == 2352) { - track->sector_fmt = GD_SECTOR_CDDA; - track->header_size = 0; - track->error_size = 0; - track->data_size = 2352; - } else if (mode == 1 && sector_size == 2352) { - track->sector_fmt = GD_SECTOR_M1; - /* skip sync, header */ - track->header_size = 16; - track->error_size = 288; - track->data_size = 2048; - } else if (mode == 1 && sector_size == 2336) { - track->sector_fmt = GD_SECTOR_M1; - track->header_size = 0; - track->error_size = 288; - track->data_size = 2048; - } else if (mode == 2 && sector_size == 2352) { - /* assume form1 */ - track->sector_fmt = GD_SECTOR_M2F1; - /* skip sync, header and subheader */ - track->header_size = 24; - track->error_size = 280; - track->data_size = 2048; - } else if (mode == 2 && sector_size == 2336) { - /* assume form1 */ - track->sector_fmt = GD_SECTOR_M2F1; - /* skip subheader */ - track->header_size = 8; - track->error_size = 280; - track->data_size = 2048; - } else { - LOG_WARNING("cdi_parse unexpected sector format %d / size %d", - track->sector_fmt, track->sector_size); - return 0; - } - track->sector_size = sector_size; + track->ctrl = sector_mode == 0 ? 0 : 4; track->file_offset = data_offset - track->fad * track->sector_size; - /* sanity check the track layout */ - CHECK_EQ(track->header_size + track->error_size + track->data_size, - track->sector_size); - LOG_INFO("cdi_parse_track track=%d fad=%d off=%d mode=%s/%d", track->num, - track->fad, data_offset, cdi_modes[mode], track->sector_size); + track->fad, data_offset, cdi_sector_modes[sector_mode], + track->sector_size); *track_offset += total_len * sector_size; *leadout_fad = track->fad + track_len; diff --git a/src/guest/gdrom/chd.c b/src/guest/gdrom/chd.c index 44e4cdff..251effc5 100644 --- a/src/guest/gdrom/chd.c +++ b/src/guest/gdrom/chd.c @@ -139,12 +139,6 @@ static int chd_parse(struct disc *disc, const char *filename) { /* sanity checks */ CHECK_EQ(tkid, chd->num_tracks + 1); - if (strcmp(type, "MODE1") && strcmp(type, "MODE1_RAW") && - strcmp(type, "AUDIO")) { - LOG_WARNING("chd_parse track type %s unsupported", type); - return 0; - } - if (strcmp(subtype, "NONE")) { LOG_WARNING("chd_parse track subtype %s unsupported", subtype); return 0; @@ -155,29 +149,37 @@ static int chd_parse(struct disc *disc, const char *filename) { return 0; } + /* figure out sector type */ + int sector_mode = 0; + int sector_size = 0; + + if (!strcmp(type, "AUDIO")) { + sector_mode = 0; + sector_size = 2352; + } else if (!strcmp(type, "MODE1")) { + sector_mode = 1; + sector_size = 2336; + } else if (!strcmp(type, "MODE1_RAW")) { + sector_mode = 1; + sector_size = 2352; + } else { + LOG_WARNING("chd_parse unexpected mode %s", type); + return 0; + } + /* add track */ CHECK_LT(chd->num_tracks, ARRAY_SIZE(chd->tracks)); struct track *track = &chd->tracks[chd->num_tracks++]; + + if (!track_set_layout(track, sector_mode, sector_size)) { + LOG_WARNING("chd_parse unsupported track layout mode=%d sector_size=%d", + sector_mode, sector_size); + return 0; + } + track->num = chd->num_tracks; track->fad = fad; track->ctrl = strcmp(type, "AUDIO") == 0 ? 0 : 4; - track->sector_fmt = !strcmp(type, "AUDIO") ? GD_SECTOR_CDDA : GD_SECTOR_M1; - track->sector_size = !strcmp(type, "MODE1") ? 2048 : 2352; - switch (track->sector_fmt) { - case GD_SECTOR_CDDA: - track->header_size = 0; - track->error_size = 0; - track->data_size = 2352; - break; - case GD_SECTOR_M1: - track->header_size = 16; - track->error_size = 280; - track->data_size = 2048; - break; - default: - LOG_WARNING("chd_parse unexpected sector format %d", track->sector_fmt); - return 0; - } track->file_offset = fad - cad; LOG_INFO("chd_parse '%s' track=%d fad=%d secsz=%d", tmp, track->num, diff --git a/src/guest/gdrom/disc.c b/src/guest/gdrom/disc.c index 89fd97f3..c4195c9f 100644 --- a/src/guest/gdrom/disc.c +++ b/src/guest/gdrom/disc.c @@ -63,6 +63,61 @@ static void disc_patch_sector(struct disc *disc, int fad, uint8_t *data) { } } +int track_set_layout(struct track *track, int sector_mode, int sector_size) { + track->sector_size = sector_size; + + if (sector_mode == 0 && sector_size == 2352) { + track->sector_fmt = GD_SECTOR_CDDA; + track->header_size = 0; + track->error_size = 0; + track->data_size = 2352; + } else if (sector_mode == 1 && sector_size == 2048) { + track->sector_fmt = GD_SECTOR_M1; + track->header_size = 0; + track->error_size = 0; + track->data_size = 2048; + } else if (sector_mode == 1 && sector_size == 2352) { + track->sector_fmt = GD_SECTOR_M1; + /* skip sync, header */ + track->header_size = 16; + track->error_size = 288; + track->data_size = 2048; + } else if (sector_mode == 1 && sector_size == 2336) { + track->sector_fmt = GD_SECTOR_M1; + track->header_size = 0; + track->error_size = 288; + track->data_size = 2048; + } else if (sector_mode == 2 && sector_size == 2048) { + /* assume form1 */ + track->sector_fmt = GD_SECTOR_M2F1; + track->header_size = 0; + track->error_size = 0; + track->data_size = 2048; + } else if (sector_mode == 2 && sector_size == 2352) { + /* assume form1 */ + track->sector_fmt = GD_SECTOR_M2F1; + /* skip sync, header and subheader */ + track->header_size = 24; + track->error_size = 280; + track->data_size = 2048; + } else if (sector_mode == 2 && sector_size == 2336) { + /* assume form1 */ + track->sector_fmt = GD_SECTOR_M2F1; + /* skip subheader */ + track->header_size = 8; + track->error_size = 280; + track->data_size = 2048; + } else { + return 0; + } + + /* sanity check */ + CHECK_EQ(track->header_size + track->error_size + track->data_size, + track->sector_size); + + return 1; +} + int disc_read_bytes(struct disc *disc, int fad, int len, uint8_t *dst, int dst_size) { CHECK_LE(len, dst_size); diff --git a/src/guest/gdrom/disc.h b/src/guest/gdrom/disc.h index 495d02a9..fef79348 100644 --- a/src/guest/gdrom/disc.h +++ b/src/guest/gdrom/disc.h @@ -36,7 +36,7 @@ struct track { int adr; /* type of track */ int ctrl; - /* sector info */ + /* sector layout */ int sector_fmt; int sector_size; int header_size; @@ -104,4 +104,6 @@ int disc_read_sectors(struct disc *disc, int fad, int num_sectors, int disc_read_bytes(struct disc *disc, int fad, int len, uint8_t *dst, int dst_size); +int track_set_layout(struct track *track, int sector_mode, int sector_size); + #endif diff --git a/src/guest/gdrom/gdi.c b/src/guest/gdrom/gdi.c index 9ec252b2..017d5feb 100644 --- a/src/guest/gdrom/gdi.c +++ b/src/guest/gdrom/gdi.c @@ -145,21 +145,23 @@ static int gdi_parse(struct disc *disc, const char *filename) { /* add track */ CHECK_LT(gdi->num_tracks, ARRAY_SIZE(gdi->tracks)); struct track *track = &gdi->tracks[gdi->num_tracks++]; + + /* sanity check */ + CHECK_EQ(num, gdi->num_tracks); + + if (!track_set_layout(track, 1, sector_size)) { + LOG_WARNING("gdi_parse unsupported track layout sector_size=%d", + sector_size); + return 0; + } + track->num = gdi->num_tracks; track->fad = lba + GDROM_PREGAP; track->ctrl = ctrl; - track->sector_fmt = GD_SECTOR_M1; - track->sector_size = sector_size; - track->header_size = 16; - track->error_size = 288; - track->data_size = 2048; track->file_offset = file_offset - track->fad * track->sector_size; snprintf(track->filename, sizeof(track->filename), "%s" PATH_SEPARATOR "%s", dirname, filename); - /* sanity check */ - CHECK_EQ(num, track->num); - LOG_INFO("gdi_parse track=%d filename='%s' fad=%d secsz=%d", track->num, track->filename, track->fad, track->sector_size); } diff --git a/src/guest/holly/holly.c b/src/guest/holly/holly.c index 321caf0e..e5bc69c1 100644 --- a/src/guest/holly/holly.c +++ b/src/guest/holly/holly.c @@ -410,8 +410,7 @@ REG_R32(holly_cb, SB_FFST) { return 0; } -REG_W32(holly_cb, SB_FFST) { -} +REG_W32(holly_cb, SB_FFST) {} REG_W32(holly_cb, SB_SFRES) { /* only reset if the magic value is written */