]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
READ CD-DA/CD-DA MSF fix.
authorToni Wilen <twilen@winuae.net>
Sat, 2 Dec 2017 16:40:47 +0000 (18:40 +0200)
committerToni Wilen <twilen@winuae.net>
Sat, 2 Dec 2017 16:40:47 +0000 (18:40 +0200)
blkdev.cpp
blkdev_cdimage.cpp
scsi.cpp

index ed81ccb6a86577820f32e9ec8b5bf7465303d94a..77aa132778bfd133fda42f890d5d1a077fca0563 100644 (file)
@@ -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;
index b4ca0dbe392793e6d414fb09ebeb5aa3901d9661..2c71bf804c66e92db0412f4b896a9eb4fc52297d 100644 (file)
@@ -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;
index c06ea64799e4055c473f49ca2d9dbe3bb9e5f707..b7b2e082c40688bb5b50e1a975b4ab93fef59ec7 100644 (file)
--- 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)