mirror of https://github.com/inolen/redream.git
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:
parent
50f9cd5fff
commit
528e4f89d4
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue