]> git.unchartedbackwaters.co.uk Git - francis/winuae.git/commitdiff
Better data track last accessible sector check.
authorToni Wilen <twilen@winuae.net>
Fri, 27 Feb 2015 16:13:51 +0000 (18:13 +0200)
committerToni Wilen <twilen@winuae.net>
Fri, 27 Feb 2015 16:13:51 +0000 (18:13 +0200)
blkdev.cpp
blkdev_cdimage.cpp
od-win32/blkdev_win32_ioctl.cpp

index 1dd87fc2015c3e9c4fdc0cef1e0741752a38615b..7d2ed0df7703cd21945baca5fc37a06dc86826f9 100644 (file)
@@ -1260,16 +1260,18 @@ static int scsi_read_cd (int unitnum, uae_u8 *cmd, uae_u8 *data, struct device_i
        return v;
 }
 
-static int scsi_read_cd_data (int unitnum, uae_u8 *scsi_data, uae_u32 offset, uae_u32 len, struct device_info *di, int *scsi_len)
+static int scsi_read_cd_data (int unitnum, uae_u8 *scsi_data, uae_u32 offset, uae_u32 len, struct device_info *di, int *scsi_len, struct cd_toc *t)
 {
        struct blkdevstate *st = &state[unitnum];
+       int end = t[1].paddress;
+
        if (len == 0) {
-               if (offset >= di->sectorspertrack * di->cylinders * di->trackspercylinder)
+               if (offset >= end)
                        return -1;
                *scsi_len = 0;
                return 0;
        } else {
-               if (offset >= di->sectorspertrack * di->cylinders * di->trackspercylinder)
+               if (offset >= end)
                        return -1;
                int v = cmd_readx (unitnum, scsi_data, offset, len) * di->bytespersector;
                if (v > 0) {
@@ -1582,7 +1584,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                        stopplay (unitnum);
                        offset = ((cmdbuf[1] & 31) << 16) | (cmdbuf[2] << 8) | cmdbuf[3];
                        struct cd_toc *t = gettoc (&di.toc, offset);
-                       v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len);
+                       v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len, t);
                        if (v == -1)
                                goto outofbounds;
                }
@@ -1598,7 +1600,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                        len = cmdbuf[4];
                        if (!len)
                                len = 256;
-                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len);
+                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len, t);
                        if (v == -1)
                                goto outofbounds;
                        if (v == -2)
@@ -1617,7 +1619,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                        stopplay (unitnum);
                        offset = rl (cmdbuf + 2);
                        struct cd_toc *t = gettoc (&di.toc, offset);
-                       v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len);
+                       v = scsi_read_cd_data (unitnum, scsi_data, offset, 0, &di, &scsi_len, t);
                        if (v == -1)
                                goto outofbounds;
                }
@@ -1631,7 +1633,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                struct cd_toc *t = gettoc (&di.toc, offset);
                if ((t->control & 0x0c) == 0x04) {
                        len = rl (cmdbuf + 7 - 2) & 0xffff;
-                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len);
+                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len, t);
                        if (v == -1)
                                goto outofbounds;
                        if (v == -2)
@@ -1652,7 +1654,7 @@ int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len,
                struct cd_toc *t = gettoc (&di.toc, offset);
                if ((t->control & 0x0c) == 0x04) {
                        len = rl (cmdbuf + 6);
-                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len);
+                       v = scsi_read_cd_data (unitnum, scsi_data, offset, len, &di, &scsi_len, t);
                        if (v == -1)
                                goto outofbounds;
                        if (v == -2)
index 512d9236d9615e41193c57b67c27768fb748b17b..7b0a9408d9477df43a28d48a11831eb099ae1cac 100644 (file)
@@ -1044,6 +1044,7 @@ static int command_toc (int unitnum, struct cd_toc_head *th)
        toc->adr = 1;
        toc->point = 0xa1;
        toc->track = th->last_track;
+       toc->paddress = th->lastaddress;
        toc++;
 
        toc->adr = 1;
index a8d2665f75e17a98bf22e784019fd3fa352763e1..1cf26c106ce15bb1b1e0493a044c807e07a1f6ab 100644 (file)
@@ -1197,6 +1197,7 @@ static int ioctl_command_toc2 (int unitnum, struct cd_toc_head *tocout, bool hid
        t->adr = 1;
        t->point = 0xa1;
        t->track = th->last_track;
+       t->paddress = th->lastaddress;
        t++;
 
        t->adr = 1;