refactored disc code to use the new track_set_layout function to

consolidate track layout logic

added support for loading 2048 byte gdi sectors
This commit is contained in:
Anthony Pesch 2017-11-17 18:10:43 -05:00
parent 50f9cd5fff
commit 528e4f89d4
6 changed files with 109 additions and 82 deletions

View File

@ -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(&sector_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;

View File

@ -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,

View File

@ -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);

View File

@ -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

View File

@ -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);
}

View File

@ -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 */