Assorted CD-ROM fixes (now cue sheets starting at a non-zero sector work correctly) and increased the maximum number of CD-ROM drives to 8.
This commit is contained in:
@@ -73,7 +73,7 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count)
|
|||||||
track_file_t *tf = (track_file_t *) priv;
|
track_file_t *tf = (track_file_t *) priv;
|
||||||
|
|
||||||
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu\n",
|
cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu\n",
|
||||||
tf->file, seek, count);
|
tf->fp, seek, count);
|
||||||
|
|
||||||
if (tf->fp == NULL)
|
if (tf->fp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
@@ -101,14 +101,14 @@ bin_get_length(void *priv)
|
|||||||
off64_t len;
|
off64_t len;
|
||||||
track_file_t *tf = (track_file_t *) priv;
|
track_file_t *tf = (track_file_t *) priv;
|
||||||
|
|
||||||
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->file);
|
cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->fp);
|
||||||
|
|
||||||
if (tf->fp == NULL)
|
if (tf->fp == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fseeko64(tf->fp, 0, SEEK_END);
|
fseeko64(tf->fp, 0, SEEK_END);
|
||||||
len = ftello64(tf->fp);
|
len = ftello64(tf->fp);
|
||||||
cdrom_image_backend_log("CDROM: binary_length(%08lx) = %" PRIu64 "\n", tf->file, len);
|
cdrom_image_backend_log("CDROM: binary_length(%08lx) = %" PRIu64 "\n", tf->fp, len);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
@@ -145,7 +145,7 @@ bin_init(const char *filename, int *error)
|
|||||||
memset(tf->fn, 0x00, sizeof(tf->fn));
|
memset(tf->fn, 0x00, sizeof(tf->fn));
|
||||||
strncpy(tf->fn, filename, sizeof(tf->fn) - 1);
|
strncpy(tf->fn, filename, sizeof(tf->fn) - 1);
|
||||||
tf->fp = plat_fopen64(tf->fn, "rb");
|
tf->fp = plat_fopen64(tf->fn, "rb");
|
||||||
cdrom_image_backend_log("CDROM: binary_open(%s) = %08lx\n", tf->fn, tf->file);
|
cdrom_image_backend_log("CDROM: binary_open(%s) = %08lx\n", tf->fn, tf->fp);
|
||||||
|
|
||||||
if (stat(tf->fn, &stats) != 0) {
|
if (stat(tf->fn, &stats) != 0) {
|
||||||
/* Use a blank structure if stat failed. */
|
/* Use a blank structure if stat failed. */
|
||||||
@@ -332,6 +332,11 @@ cdi_get_track(cd_img_t *cdi, uint32_t sector)
|
|||||||
for (int i = 0; i < (cdi->tracks_num - 1); i++) {
|
for (int i = 0; i < (cdi->tracks_num - 1); i++) {
|
||||||
cur = &cdi->tracks[i];
|
cur = &cdi->tracks[i];
|
||||||
next = &cdi->tracks[i + 1];
|
next = &cdi->tracks[i + 1];
|
||||||
|
|
||||||
|
/* Take into account cue sheets that do not start on sector 0. */
|
||||||
|
if ((i == 0) && (sector < cur->start))
|
||||||
|
return cur->number;
|
||||||
|
|
||||||
if ((cur->start <= sector) && (sector < next->start))
|
if ((cur->start <= sector) && (sector < next->start))
|
||||||
return cur->number;
|
return cur->number;
|
||||||
}
|
}
|
||||||
@@ -425,9 +430,10 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector)
|
|||||||
return 1;
|
return 1;
|
||||||
} else if (!raw && track_is_raw)
|
} else if (!raw && track_is_raw)
|
||||||
return trk->file->read(trk->file, buffer, seek + offset, length);
|
return trk->file->read(trk->file, buffer, seek + offset, length);
|
||||||
else
|
else {
|
||||||
return trk->file->read(trk->file, buffer, seek, length);
|
return trk->file->read(trk->file, buffer, seek, length);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num)
|
||||||
|
@@ -15,7 +15,7 @@
|
|||||||
#ifndef EMU_CDROM_H
|
#ifndef EMU_CDROM_H
|
||||||
#define EMU_CDROM_H
|
#define EMU_CDROM_H
|
||||||
|
|
||||||
#define CDROM_NUM 4
|
#define CDROM_NUM 8
|
||||||
|
|
||||||
#define CD_STATUS_EMPTY 0
|
#define CD_STATUS_EMPTY 0
|
||||||
#define CD_STATUS_DATA_ONLY 1
|
#define CD_STATUS_DATA_ONLY 1
|
||||||
|
@@ -224,12 +224,12 @@
|
|||||||
#define RW_DELAY (TIMER_USEC * 500)
|
#define RW_DELAY (TIMER_USEC * 500)
|
||||||
|
|
||||||
/* Some generally useful CD-ROM information */
|
/* Some generally useful CD-ROM information */
|
||||||
#define CD_MINS 75 /* max. minutes per CD */
|
#define CD_MINS 90 /* max. minutes per CD */
|
||||||
#define CD_SECS 60 /* seconds per minute */
|
#define CD_SECS 60 /* seconds per minute */
|
||||||
#define CD_FRAMES 75 /* frames per second */
|
#define CD_FRAMES 75 /* frames per second */
|
||||||
#define CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */
|
#define CD_FRAMESIZE 2048 /* bytes per frame, "cooked" mode */
|
||||||
#define CD_MAX_BYTES (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
|
#define CD_MAX_BYTES (CD_MINS * CD_SECS * CD_FRAMES * CD_FRAMESIZE)
|
||||||
#define CD_MAX_SECTORS (CD_MAX_BYTES / 512)
|
#define CD_MAX_SECTORS (CD_MAX_BYTES / 2048)
|
||||||
|
|
||||||
/* Event notification classes for GET EVENT STATUS NOTIFICATION */
|
/* Event notification classes for GET EVENT STATUS NOTIFICATION */
|
||||||
#define GESN_NO_EVENTS 0
|
#define GESN_NO_EVENTS 0
|
||||||
|
@@ -2256,7 +2256,7 @@ begin:
|
|||||||
another variable. */
|
another variable. */
|
||||||
if (dev->drv->cd_status == CD_STATUS_EMPTY)
|
if (dev->drv->cd_status == CD_STATUS_EMPTY)
|
||||||
max_len = 70; /* No media inserted. */
|
max_len = 70; /* No media inserted. */
|
||||||
else if (dev->drv->cdrom_capacity > 405000)
|
else if (dev->drv->cdrom_capacity > CD_MAX_SECTORS)
|
||||||
max_len = 65; /* DVD. */
|
max_len = 65; /* DVD. */
|
||||||
else if (dev->drv->cd_status == CD_STATUS_DATA_ONLY)
|
else if (dev->drv->cd_status == CD_STATUS_DATA_ONLY)
|
||||||
max_len = 1; /* Data CD. */
|
max_len = 1; /* Data CD. */
|
||||||
|
Reference in New Issue
Block a user