CD-ROM READ SUBCHANNEL command now does not pass through if requested data type is 1 (current position), instead the current position held by the emulator is returned;
CD-ROM READ SUBCHANNEL command now respects the allocated length set in the CDB.
This commit is contained in:
12
src/cdrom.c
12
src/cdrom.c
@@ -2243,8 +2243,12 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case GPCMD_READ_SUBCHANNEL:
|
case GPCMD_READ_SUBCHANNEL:
|
||||||
|
max_len = cdb[7];
|
||||||
|
max_len <<= 8;
|
||||||
|
max_len |= cdb[8];
|
||||||
|
|
||||||
cdrom_log("CD-ROM %i: Getting page %i\n", id, cdb[3]);
|
cdrom_log("CD-ROM %i: Getting page %i\n", id, cdb[3]);
|
||||||
if (cdrom_drives[id].handler->pass_through)
|
if ((cdrom_drives[id].handler->pass_through) && (cdb[3] != 1))
|
||||||
{
|
{
|
||||||
ret = cdrom_pass_through(id, &len);
|
ret = cdrom_pass_through(id, &len);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@@ -2315,7 +2319,7 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
|||||||
cdbufferb[pos++] = 0; /*Audio status*/
|
cdbufferb[pos++] = 0; /*Audio status*/
|
||||||
cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/
|
cdbufferb[pos++] = 0; cdbufferb[pos++] = 0; /*Subchannel length*/
|
||||||
cdbufferb[pos++] = cdb[3] & 3; /*Format code*/
|
cdbufferb[pos++] = cdb[3] & 3; /*Format code*/
|
||||||
if ((temp & 3) == 1)
|
if (cdb[3] == 1)
|
||||||
{
|
{
|
||||||
cdbufferb[1] = cdrom_drives[id].handler->getcurrentsubchannel(id, &cdbufferb[5], msf);
|
cdbufferb[1] = cdrom_drives[id].handler->getcurrentsubchannel(id, &cdbufferb[5], msf);
|
||||||
if (((cdbufferb[1] == 0x13) && !completed) || (cd_status == CD_STATUS_DATA_ONLY))
|
if (((cdbufferb[1] == 0x13) && !completed) || (cd_status == CD_STATUS_DATA_ONLY))
|
||||||
@@ -2323,7 +2327,7 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
|||||||
cdbufferb[1] = 0x15;
|
cdbufferb[1] = 0x15;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!(cdb[2] & 0x40) || ((cdb[3] & 3) == 0))
|
if (!(cdb[2] & 0x40) || (cdb[3] == 0))
|
||||||
{
|
{
|
||||||
len = 4;
|
len = 4;
|
||||||
}
|
}
|
||||||
@@ -2333,7 +2337,7 @@ void cdrom_command(uint8_t id, uint8_t *cdb)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cdrom_data_command_finish(id, len, len, len, 0);
|
cdrom_data_command_finish(id, len, len, max_len, 0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GPCMD_READ_DVD_STRUCTURE:
|
case GPCMD_READ_DVD_STRUCTURE:
|
||||||
|
Reference in New Issue
Block a user