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)
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;
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;
if (v == -2)
goto readerr;
} else {
- goto notdatatrack;
+ goto wrongtracktype;
}
}
break;
if (v == -2)
goto readerr;
} else {
- goto notdatatrack;
+ goto wrongtracktype;
}
}
break;
if (v == -2)
goto readerr;
} else {
- goto notdatatrack;
+ goto wrongtracktype;
}
}
break;
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;
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;
}
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;
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;
}
if (start < end) {
sys_command_cd_pause (unitnum, 0);
if (!sys_command_cd_play (unitnum, start, end, 0))
- goto notdatatrack;
+ goto wrongtracktype;
}
}
break;
s[12] = 0x11; /* UNRECOVERED READ ERROR */
ls = 0x12;
break;
-notdatatrack:
+wrongtracktype:
status = 2;
s[0] = 0x70;
s[2] = 5;
// 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;
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
} 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;
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)