convert disc_read_sector to disc_read_sectors

This commit is contained in:
Anthony Pesch 2017-07-17 21:42:10 -04:00
parent 7cb3f56f54
commit df67ffc63d
7 changed files with 87 additions and 59 deletions

View File

@ -229,8 +229,7 @@ static int bios_boot(struct bios *bios) {
/* load ip.bin bootstrap */
{
int n = 16;
int r = gdrom_read_sectors(gd, data_fad, sector_fmt, sector_mask, n, tmp,
int r = gdrom_read_sectors(gd, data_fad, 16, sector_fmt, sector_mask, tmp,
sizeof(tmp));
if (!r) {
return 0;
@ -243,9 +242,8 @@ static int bios_boot(struct bios *bios) {
static const char *bootfile = "1ST_READ.BIN";
/* read primary volume descriptor */
int n = 1;
int r = gdrom_read_sectors(gd, data_fad + ISO_PVD_SECTOR, sector_fmt,
sector_mask, n, tmp, sizeof(tmp));
int r = gdrom_read_sectors(gd, data_fad + ISO_PVD_SECTOR, 1, sector_fmt,
sector_mask, tmp, sizeof(tmp));
if (!r) {
return 0;
}
@ -259,8 +257,8 @@ static int bios_boot(struct bios *bios) {
struct iso_dir *root = &pvd->root_directory_record;
int len = align_up(root->size.le, sector_size);
int fad = GDROM_PREGAP + root->extent.le;
n = len / sector_size;
r = gdrom_read_sectors(gd, fad, sector_fmt, sector_mask, n, tmp,
int n = len / sector_size;
r = gdrom_read_sectors(gd, fad, n, sector_fmt, sector_mask, tmp,
sizeof(tmp));
if (!r) {
return 0;

View File

@ -34,8 +34,9 @@ struct cdi {
int num_tracks;
};
static int cdi_read_sector(struct disc *disc, int fad, int sector_fmt,
int sector_mask, void *dst) {
static int cdi_read_sectors(struct disc *disc, int fad, int num_sectors,
int sector_fmt, int sector_mask, void *dst,
int dst_size) {
struct cdi *cdi = (struct cdi *)disc;
struct track *track = disc_lookup_track(disc, fad);
@ -43,28 +44,44 @@ static int cdi_read_sector(struct disc *disc, int fad, int sector_fmt,
CHECK(sector_fmt == GD_SECTOR_ANY || sector_fmt == track->sector_fmt);
CHECK(sector_mask == GD_MASK_DATA);
/* read the user data portion of the sector */
int offset, size;
/* seek the to the starting fad */
int offset = track->file_offset + fad * track->sector_size;
int res = fseek(cdi->fp, offset, SEEK_SET);
CHECK_EQ(res, 0);
/* only read the data portion of the track */
int header_size, error_size, data_size;
if (track->sector_fmt == GD_SECTOR_CDDA) {
offset = track->file_offset + fad * track->sector_size;
size = track->sector_size;
CHECK_EQ(size, 2352);
header_size = 0;
error_size = 0;
data_size = track->sector_size - header_size - error_size;
CHECK_EQ(data_size, 2352);
} else if (track->sector_fmt == GD_SECTOR_M2F1) {
offset = track->file_offset + fad * track->sector_size + 8;
size = track->sector_size - 288;
CHECK_EQ(size, 2048);
header_size = 8;
error_size = 280;
data_size = track->sector_size - header_size - error_size;
CHECK_EQ(data_size, 2048);
} else {
CHECK(0);
}
int res = fseek(cdi->fp, offset, SEEK_SET);
CHECK_EQ(res, 0);
int read = 0;
res = (int)fread(dst, 1, size, cdi->fp);
CHECK_EQ(res, size);
for (int i = 0; i < num_sectors; i++) {
res = fseek(cdi->fp, header_size, SEEK_CUR);
CHECK_EQ(res, 0);
return res;
CHECK_LE(read + data_size, dst_size);
res = (int)fread(dst + read, 1, data_size, cdi->fp);
CHECK_EQ(res, data_size);
read += res;
res = fseek(cdi->fp, error_size, SEEK_CUR);
CHECK_EQ(res, 0);
}
return read;
}
static void cdi_get_toc(struct disc *disc, int area, struct track **first_track,
@ -362,7 +379,7 @@ struct disc *cdi_create(const char *filename) {
cdi->get_num_tracks = &cdi_get_num_tracks;
cdi->get_track = &cdi_get_track;
cdi->get_toc = &cdi_get_toc;
cdi->read_sector = &cdi_read_sector;
cdi->read_sectors = &cdi_read_sectors;
struct disc *disc = (struct disc *)cdi;

View File

@ -28,9 +28,11 @@ struct track *disc_lookup_track(struct disc *disc, int fad) {
return NULL;
}
int disc_read_sector(struct disc *disc, int fad, int sector_fmt,
int sector_mask, void *dst) {
return disc->read_sector(disc, fad, sector_fmt, sector_mask, dst);
int disc_read_sectors(struct disc *disc, int fad, int num_sectors,
int sector_fmt, int sector_mask, void *dst,
int dst_size) {
return disc->read_sectors(disc, fad, num_sectors, sector_fmt, sector_mask,
dst, dst_size);
}
void disc_get_toc(struct disc *disc, int area, struct track **first_track,
@ -67,7 +69,8 @@ void disc_get_meta(struct disc *disc, struct disc_meta *meta) {
struct session *session = disc_get_session(disc, 1);
uint8_t tmp[DISC_MAX_SECTOR_SIZE];
disc_read_sector(disc, session->leadin_fad, GD_SECTOR_ANY, GD_MASK_DATA, tmp);
disc_read_sectors(disc, session->leadin_fad, 1, GD_SECTOR_ANY, GD_MASK_DATA,
tmp, sizeof(tmp));
memcpy(meta, tmp, sizeof(*meta));
}

View File

@ -54,7 +54,7 @@ struct disc {
void (*get_toc)(struct disc *, int, struct track **, struct track **, int *,
int *);
int (*read_sector)(struct disc *, int, int, int, void *);
int (*read_sectors)(struct disc *, int, int, int, int, void *, int);
};
struct disc *disc_create(const char *filename);
@ -68,8 +68,8 @@ int disc_get_num_tracks(struct disc *disc);
struct track *disc_get_track(struct disc *disc, int n);
void disc_get_toc(struct disc *disc, int area, struct track **first_track,
struct track **last_track, int *leadin_fad, int *leadout_fad);
int disc_read_sector(struct disc *disc, int fad, int sector_fmt,
int sector_mask, void *dst);
int disc_read_sectors(struct disc *disc, int fad, int num_sectors,
int sector_fmt, int sector_mask, void *dst, int dst_size);
struct track *disc_lookup_track(struct disc *disc, int fad);
#endif

View File

@ -11,8 +11,9 @@ struct gdi {
int num_tracks;
};
static int gdi_read_sector(struct disc *disc, int fad, int sector_fmt,
int sector_mask, void *dst) {
static int gdi_read_sectors(struct disc *disc, int fad, int num_sectors,
int sector_fmt, int sector_mask, void *dst,
int dst_size) {
struct gdi *gdi = (struct gdi *)disc;
struct track *track = disc_lookup_track(disc, fad);
@ -29,18 +30,33 @@ static int gdi_read_sector(struct disc *disc, int fad, int sector_fmt,
CHECK_NOTNULL(fp);
}
/* read the user data portion of the sector */
int offset = track->file_offset + fad * track->sector_size + 16;
int size = track->sector_size - 304;
CHECK_EQ(size, 2048);
/* seek the to the starting fad */
int offset = track->file_offset + fad * track->sector_size;
int res = fseek(fp, offset, SEEK_SET);
CHECK_EQ(res, 0);
res = (int)fread(dst, 1, size, fp);
CHECK_EQ(res, size);
/* only read the data portion of the track */
int header_size = 16;
int error_size = 288;
int data_size = track->sector_size - header_size - error_size;
CHECK_EQ(data_size, 2048);
return res;
int read = 0;
for (int i = 0; i < num_sectors; i++) {
res = fseek(fp, header_size, SEEK_CUR);
CHECK_EQ(res, 0);
CHECK_LE(read + data_size, dst_size);
res = (int)fread(dst + read, 1, data_size, fp);
CHECK_EQ(res, data_size);
read += res;
res = fseek(fp, error_size, SEEK_CUR);
CHECK_EQ(res, 0);
}
return read;
}
static void gdi_get_toc(struct disc *disc, int area, struct track **first_track,
@ -199,7 +215,7 @@ struct disc *gdi_create(const char *filename) {
gdi->get_num_tracks = &gdi_get_num_tracks;
gdi->get_track = &gdi_get_track;
gdi->get_toc = &gdi_get_toc;
gdi->read_sector = &gdi_read_sector;
gdi->read_sectors = &gdi_read_sectors;
struct disc *disc = (struct disc *)gdi;

View File

@ -118,8 +118,8 @@ static void gdrom_spi_cdread(struct gdrom *gd) {
/* fill DMA buffer with as many sectors as possible */
int num_sectors = MIN(gd->cdr_num_sectors, max_dma_sectors);
gd->dma_size = gdrom_read_sectors(gd, gd->cdr_first_sector, gd->cdr_secfmt,
gd->cdr_secmask, num_sectors,
gd->dma_size = gdrom_read_sectors(gd, gd->cdr_first_sector, num_sectors,
gd->cdr_secfmt, gd->cdr_secmask,
gd->dma_buffer, sizeof(gd->dma_buffer));
gd->dma_head = 0;
@ -134,8 +134,8 @@ static void gdrom_spi_cdread(struct gdrom *gd) {
/* fill PIO buffer with as many sectors as possible */
int num_sectors = MIN(gd->cdr_num_sectors, max_pio_sectors);
gd->pio_size = gdrom_read_sectors(gd, gd->cdr_first_sector, gd->cdr_secfmt,
gd->cdr_secmask, num_sectors,
gd->pio_size = gdrom_read_sectors(gd, gd->cdr_first_sector, num_sectors,
gd->cdr_secfmt, gd->cdr_secmask,
gd->pio_buffer, sizeof(gd->pio_buffer));
gd->pio_head = 0;
@ -479,7 +479,7 @@ int gdrom_copy_sectors(struct gdrom *gd, int fad, int fmt, int mask,
uint8_t tmp[DISC_MAX_SECTOR_SIZE];
for (int i = fad; i < fad + num_sectors; i++) {
int n = gdrom_read_sectors(gd, i, fmt, mask, 1, tmp, sizeof(tmp));
int n = disc_read_sectors(gd->disc, i, 1, fmt, mask, tmp, sizeof(tmp));
as_memcpy_to_guest(space, dst + read, tmp, n);
read += n;
}
@ -487,24 +487,18 @@ int gdrom_copy_sectors(struct gdrom *gd, int fad, int fmt, int mask,
return read;
}
int gdrom_read_sectors(struct gdrom *gd, int fad, int fmt, int mask,
int num_sectors, uint8_t *dst, int dst_size) {
int gdrom_read_sectors(struct gdrom *gd, int fad, int num_sectors, int fmt,
int mask, uint8_t *dst, int dst_size) {
if (!gd->disc) {
LOG_WARNING("gdrom_read_sectors failed, no disc");
return 0;
}
int read = 0;
uint8_t data[DISC_MAX_SECTOR_SIZE];
LOG_GDROM("gdrom_read_sectors [%d, %d)", fad, fad + num_sectors);
for (int i = fad; i < fad + num_sectors; i++) {
int n = disc_read_sector(gd->disc, i, fmt, mask, data);
CHECK_LE(read + n, dst_size);
memcpy(dst + read, data, n);
read += n;
}
int read =
disc_read_sectors(gd->disc, fad, num_sectors, fmt, mask, dst, dst_size);
CHECK(read);
return read;
}

View File

@ -24,8 +24,8 @@ void gdrom_get_toc(struct gdrom *gd, int area, struct gd_spi_toc *toc);
void gdrom_get_session(struct gdrom *gd, int session,
struct gd_spi_session *ses);
void gdrom_get_subcode(struct gdrom *gd, int format, uint8_t *data, int size);
int gdrom_read_sectors(struct gdrom *gd, int fad, int fmt, int mask, int n,
uint8_t *dst, int dst_size);
int gdrom_read_sectors(struct gdrom *gd, int fad, int num_sectors, int fmt,
int mask, uint8_t *dst, int dst_size);
int gdrom_copy_sectors(struct gdrom *gd, int fad, int fmt, int mask,
int num_sectors, struct address_space *space,
uint32_t dst);