CD-ROM emulation now reads multiple sectors at once.
This commit is contained in:
parent
8e52c00ffc
commit
bab6695b2c
7 changed files with 59 additions and 50 deletions
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
#define BUFFER_SIZE (256*1024)
|
||||
|
||||
#define MAX_NR_SECTORS 2
|
||||
#define MAX_NR_SECTORS 16
|
||||
|
||||
enum
|
||||
{
|
||||
|
|
@ -638,28 +638,32 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
|||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
|
||||
for (c = 0; c < MAX_NR_SECTORS; c++)
|
||||
{
|
||||
if (rcdmode == 0x10)
|
||||
{
|
||||
if (atapi->readsector(&data->data_in[c*2048], data->cdpos))
|
||||
{
|
||||
// pclog("Read sector failed\n");
|
||||
atapi_cmd_error(data, SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
|
||||
data->cmd_pos = CMD_POS_IDLE;
|
||||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
atapi->readsector_raw(&data->data_in[c*2352], data->cdpos);
|
||||
}
|
||||
data->cdpos++;
|
||||
data->cdlen--;
|
||||
if (!data->cdlen)
|
||||
if (rcdmode == 0x10)
|
||||
{
|
||||
c = MIN(data->cdlen, MAX_NR_SECTORS);
|
||||
if (atapi->readsector(data->data_in, data->cdpos, c))
|
||||
{
|
||||
c++;
|
||||
break;
|
||||
// pclog("Read sector failed\n");
|
||||
atapi_cmd_error(data, SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
|
||||
data->cmd_pos = CMD_POS_IDLE;
|
||||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
data->cdpos += c;
|
||||
data->cdlen -= c;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (c = 0; c < MAX_NR_SECTORS; c++)
|
||||
{
|
||||
atapi->readsector_raw(&data->data_in[c*2352], data->cdpos);
|
||||
|
||||
data->cdpos++;
|
||||
data->cdlen--;
|
||||
if (!data->cdlen)
|
||||
{
|
||||
c++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
readflash_set(READFLASH_HDC, data->id);
|
||||
|
|
@ -704,23 +708,16 @@ static int scsi_cd_command(uint8_t *cdb, void *p)
|
|||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
readflash_set(READFLASH_HDC, data->id);
|
||||
for (c = 0; c < MAX_NR_SECTORS; c++)
|
||||
c = MIN(data->cdlen, MAX_NR_SECTORS);
|
||||
if (atapi->readsector(data->data_in, data->cdpos, c))
|
||||
{
|
||||
if (atapi->readsector(&data->data_in[c*2048], data->cdpos))
|
||||
{
|
||||
pclog("Read sector failed\n");
|
||||
atapi_cmd_error(data, SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
|
||||
data->cmd_pos = CMD_POS_IDLE;
|
||||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
data->cdpos++;
|
||||
data->cdlen--;
|
||||
if (!data->cdlen)
|
||||
{
|
||||
c++;
|
||||
break;
|
||||
}
|
||||
// pclog("Read sector failed\n");
|
||||
atapi_cmd_error(data, SENSE_ILLEGAL_REQUEST, ASC_LBA_OUT_OF_RANGE, 0);
|
||||
data->cmd_pos = CMD_POS_IDLE;
|
||||
return SCSI_PHASE_STATUS;
|
||||
}
|
||||
data->cdpos += c;
|
||||
data->cdlen -= c;
|
||||
|
||||
data->data_pos_read = 0;
|
||||
data->data_pos_write = c * 2048;
|
||||
|
|
|
|||
Loading…
Reference in a new issue