From 1223c22a39affba32f3768d71fd49f7d0c1b8413 Mon Sep 17 00:00:00 2001 From: Toni Wilen Date: Fri, 27 Feb 2015 18:13:51 +0200 Subject: [PATCH] Better data track last accessible sector check. --- blkdev.cpp | 18 ++++++++++-------- blkdev_cdimage.cpp | 1 + od-win32/blkdev_win32_ioctl.cpp | 1 + 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/blkdev.cpp b/blkdev.cpp index 1dd87fc2..7d2ed0df 100644 --- a/blkdev.cpp +++ b/blkdev.cpp @@ -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) diff --git a/blkdev_cdimage.cpp b/blkdev_cdimage.cpp index 512d9236..7b0a9408 100644 --- a/blkdev_cdimage.cpp +++ b/blkdev_cdimage.cpp @@ -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; diff --git a/od-win32/blkdev_win32_ioctl.cpp b/od-win32/blkdev_win32_ioctl.cpp index a8d2665f..1cf26c10 100644 --- a/od-win32/blkdev_win32_ioctl.cpp +++ b/od-win32/blkdev_win32_ioctl.cpp @@ -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; -- 2.47.3