diff options
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 |
commit | 3caf68495956be78802e98b35f734462507a5ede (patch) | |
tree | e5d4e7547d0a3b319cda7264a5196db290ab0e4e | |
parent | f294d03e939094a97b14ea5d3f4a275dff781a54 (diff) |
cdrom: convert Mode 1 Form 1 sectors to Mode 1 raw if requested [R. Belmont]
-rw-r--r-- | src/lib/util/cdrom.c | 17 |
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))) |