From: Toni Wilen Date: Sat, 2 Dec 2017 16:40:47 +0000 (+0200) Subject: READ CD-DA/CD-DA MSF fix. X-Git-Tag: 3600~57 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=3015a506a07ff8f4270eb075a134b14d13008940;p=francis%2Fwinuae.git READ CD-DA/CD-DA MSF fix. --- diff --git a/blkdev.cpp b/blkdev.cpp index ed81ccb6..77aa1327 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -1252,7 +1252,7 @@ static int scsi_read_cd_da(int unitnum, uae_u8 *cmd, uae_u8 *data, struct device struct blkdevstate *st = &state[unitnum]; int msf = cmd[0] == 0xd9; int start = msf ? msf2lsn(rl(cmd + 2) & 0x00ffffff) : rl(cmd + 2); - int len = rl(cmd + 5) & 0x00ffffff; + int len = rl(cmd + 6) & 0x00ffffff; int sectorsize; uae_u8 subcode = cmd[10]; switch (subcode) @@ -1440,7 +1440,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, goto nodisk; scsi_len = scsi_read_cd_da(unitnum, cmdbuf, scsi_data, &di); if (scsi_len == -2) - goto notdatatrack; + goto wrongtracktype; if (scsi_len == -1) goto errreq; break; @@ -1450,7 +1450,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, goto nodisk; scsi_len = scsi_read_cd(unitnum, cmdbuf, scsi_data, &di); if (scsi_len == -2) - goto notdatatrack; + goto wrongtracktype; if (scsi_len == -1) goto errreq; break; @@ -1660,7 +1660,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (v == -2) goto readerr; } else { - goto notdatatrack; + goto wrongtracktype; } } break; @@ -1697,7 +1697,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (v == -2) goto readerr; } else { - goto notdatatrack; + goto wrongtracktype; } } break; @@ -1720,7 +1720,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (v == -2) goto readerr; } else { - goto notdatatrack; + goto wrongtracktype; } } break; @@ -1941,7 +1941,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, int end = etrack == toc->last_track ? toc->lastaddress : toc->toc[toc->first_track_offset + etrack - 1 + 1].paddress; sys_command_cd_pause (unitnum, 0); if (!sys_command_cd_play (unitnum, start, end, 0)) - goto notdatatrack; + goto wrongtracktype; scsi_len = 0; } break; @@ -1963,7 +1963,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (len > 0) { sys_command_cd_pause (unitnum, 0); if (!sys_command_cd_play (unitnum, start, start + len, 0)) - goto notdatatrack; + goto wrongtracktype; } scsi_len = 0; } @@ -1987,7 +1987,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (start < end) sys_command_cd_pause (unitnum, 0); if (!sys_command_cd_play (unitnum, start, end, 0)) - goto notdatatrack; + goto wrongtracktype; scsi_len = 0; } break; @@ -2013,7 +2013,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, end = di.toc.lastaddress; sys_command_cd_pause (unitnum, 0); if (!sys_command_cd_play (unitnum, start, end, 0)) - goto notdatatrack; + goto wrongtracktype; } scsi_len = 0; } @@ -2038,7 +2038,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, if (start < end) { sys_command_cd_pause (unitnum, 0); if (!sys_command_cd_play (unitnum, start, end, 0)) - goto notdatatrack; + goto wrongtracktype; } } break; @@ -2083,7 +2083,7 @@ readerr: s[12] = 0x11; /* UNRECOVERED READ ERROR */ ls = 0x12; break; -notdatatrack: +wrongtracktype: status = 2; s[0] = 0x70; s[2] = 5; diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index b4ca0dbe..2c71bf80 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -916,13 +916,17 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int // 2336 -> 2352 while (size-- > 0) { int address = asector + 150; - data[0] = 0x00; - memset(data + 1, 0xff, 11); - data[12] = tobcd((uae_u8)(address / (60 * 75))); - data[13] = tobcd((uae_u8)((address / 75) % 60)); - data[14] = tobcd((uae_u8)(address % 75)); - data[15] = 2; /* MODE2 */ - do_read(cdu, t, data + 16, sector, 0, t->size, false); + if (isaudiotrack(&cdu->di.toc, sector)) { + do_read(cdu, t, data, sector, 0, t->size, true); + } else { + data[0] = 0x00; + memset(data + 1, 0xff, 11); + data[12] = tobcd((uae_u8)(address / (60 * 75))); + data[13] = tobcd((uae_u8)((address / 75) % 60)); + data[14] = tobcd((uae_u8)(address % 75)); + data[15] = 2; /* MODE2 */ + do_read(cdu, t, data + 16, sector, 0, t->size, false); + } sector++; asector++; data += sectorsize; @@ -935,7 +939,7 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int uae_u8 subs[SUB_CHANNEL_SIZE]; getsub_deinterleaved(subs, cdu, t, sector); memcpy(data - SUBQ_SIZE, subs + SUBQ_SIZE, SUBQ_SIZE); - } +} } } else if ((sectorsize == 2352 || sectorsize == 2368 || sectorsize == 2448) && t->size == 2048) { // 2048 -> 2352 @@ -984,7 +988,11 @@ static int command_rawread (int unitnum, uae_u8 *data, int sector, int size, int } else if (sectorsize == t->size) { // no change while (size -- > 0) { - do_read (cdu, t, data, sector, 0, sectorsize, false); + if (sectorsize == 2352 && isaudiotrack(&cdu->di.toc, sector)) { + do_read(cdu, t, data, sector, 0, sectorsize, true); + } else { + do_read(cdu, t, data, sector, 0, sectorsize, false); + } sector++; asector++; data += sectorsize; diff --git a/scsi.cpp b/scsi.cpp index c06ea647..b7b2e082 100644 --- a/scsi.cpp +++ b/scsi.cpp @@ -72,7 +72,7 @@ extern int log_scsiemu; static const int outcmd[] = { 0x04, 0x0a, 0x0c, 0x2a, 0xaa, 0x15, 0x55, 0x0f, -1 }; static const int incmd[] = { 0x01, 0x03, 0x08, 0x0e, 0x12, 0x1a, 0x5a, 0x25, 0x28, 0x34, 0x37, 0x42, 0x43, 0xa8, 0x51, 0x52, 0xb9, 0xbd, 0xd8, 0xd9, 0xbe, -1 }; -static const int nonecmd[] = { 0x00, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x2b, 0x35, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4e, 0xa5, 0xa9, 0xba, 0xbc, 0xe0, 0xe3, 0xe4, -1 }; +static const int nonecmd[] = { 0x00, 0x05, 0x06, 0x07, 0x09, 0x0b, 0x10, 0x11, 0x16, 0x17, 0x19, 0x1b, 0x1d, 0x1e, 0x2b, 0x35, 0x45, 0x47, 0x48, 0x49, 0x4b, 0x4e, 0xa5, 0xa9, 0xba, 0xbc, 0xe0, 0xe3, 0xe4, -1 }; static const int scsicmdsizes[] = { 6, 10, 10, 12, 16, 12, 10, 6 }; static void scsi_illegal_command(struct scsi_data *sd)