summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2011-06-25 03:21:55 +0000
committer R. Belmont <rb6502@users.noreply.github.com>2011-06-25 03:21:55 +0000
commit3caf68495956be78802e98b35f734462507a5ede (patch)
treee5d4e7547d0a3b319cda7264a5196db290ab0e4e
parentf294d03e939094a97b14ea5d3f4a275dff781a54 (diff)
cdrom: convert Mode 1 Form 1 sectors to Mode 1 raw if requested [R. Belmont]
-rw-r--r--src/lib/util/cdrom.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/lib/util/cdrom.c b/src/lib/util/cdrom.c
index 3c84bb5bb02..297615dee1b 100644
--- a/src/lib/util/cdrom.c
+++ b/src/lib/util/cdrom.c
@@ -233,6 +233,7 @@ UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32
{
UINT32 tracktype, tracknum, sectoroffs;
chd_error err;
+ static const UINT8 syncbytes[12] = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00};
if (file == NULL)
return 0;
@@ -256,6 +257,22 @@ UINT32 cdrom_read_data(cdrom_file *file, UINT32 lbasector, void *buffer, UINT32
memcpy(buffer, &file->cache[(sectoroffs * CD_FRAME_SIZE) + 16], 2048);
return 1;
}
+
+ /* return 2352 byte mode 1 raw sector from 2048 bytes of mode 1 data */
+ if ((datatype == CD_TRACK_MODE1_RAW) && (tracktype == CD_TRACK_MODE1))
+ {
+ UINT8 *bufptr = (UINT8 *)buffer;
+ UINT32 msf = lba_to_msf(lbasector);
+
+ memcpy(bufptr, syncbytes, 12);
+ bufptr[12] = msf>>16;
+ bufptr[13] = msf>>8;
+ bufptr[14] = msf&0xff;
+ bufptr[15] = 1; // mode 1
+ memcpy(bufptr+16, &file->cache[(sectoroffs * CD_FRAME_SIZE)], 2048);
+ LOG(("CDROM: promotion of mode1/form1 sector to mode1 raw is not complete!\n"));
+ return 1;
+ }
/* return 2048 bytes of mode 1 data from a mode2 form1 or raw sector */
if ((datatype == CD_TRACK_MODE1) && ((tracktype == CD_TRACK_MODE2_FORM1)||(tracktype == CD_TRACK_MODE2_RAW)))