mirror of https://github.com/inolen/redream.git
convert disc_read_sector to disc_read_sectors
This commit is contained in:
parent
7cb3f56f54
commit
df67ffc63d
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue