Fixed both the ATAPI and SCSI implementations of the READ TRACK INFORMATION command.

This commit is contained in:
OBattler
2016-12-25 17:38:01 +01:00
parent 8fac789295
commit e9327bbc84
2 changed files with 61 additions and 24 deletions

View File

@@ -2551,24 +2551,36 @@ static void atapicommand(int ide_board)
break; break;
case GPCMD_READ_TRACK_INFORMATION: case GPCMD_READ_TRACK_INFORMATION:
max_len = idebufferb[7];
max_len <<= 8;
max_len |= idebufferb[8];
if (cdrom->read_track_information)
{
cdrom->read_track_information(idebufferb, idebufferb);
len = idebufferb[0];
len <<= 8;
len |= idebufferb[1];
len += 2;
}
else
{
if ((idebufferb[3] != 1) || (idebufferb[2] != 1)) if ((idebufferb[3] != 1) || (idebufferb[2] != 1))
{ {
ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/ ide->atastat = READY_STAT | ERR_STAT; /*CHECK CONDITION*/
ide->error = (SENSE_ILLEGAL_REQUEST << 4) | ABRT_ERR; ide->error = (SENSE_ILLEGAL_REQUEST << 4) | ABRT_ERR;
if (SCSISense.SenseKey == SENSE_UNIT_ATTENTION) /* if (SCSISense.SenseKey == SENSE_UNIT_ATTENTION)
ide->error |= MCR_ERR; ide->error |= MCR_ERR; */
SCSISense.Asc = ASC_INV_FIELD_IN_CMD_PACKET; SCSISense.Asc = ASC_INV_FIELD_IN_CMD_PACKET;
ide->packetstatus = ATAPI_STATUS_ERROR; ide->packetstatus = ATAPI_STATUS_ERROR;
idecallback[ide_board]=50*IDE_TIME; idecallback[ide_board]=50*IDE_TIME;
return; return;
} }
if (cdrom->read_track_information) len = 36;
{
cdrom->read_track_information(idebufferb, idebufferb); idebufferb[0] = 0;
}
else
{
idebufferb[1] = 34; idebufferb[1] = 34;
idebufferb[2] = 1; /* track number (LSB) */ idebufferb[2] = 1; /* track number (LSB) */
idebufferb[3] = 1; /* session number (LSB) */ idebufferb[3] = 1; /* session number (LSB) */
@@ -2584,7 +2596,13 @@ static void atapicommand(int ide_board)
idebufferb[33] = 0; /* session number (MSB) */ idebufferb[33] = 0; /* session number (MSB) */
} }
len=36; if (len > max_len)
{
len = max_len;
idebufferb[0] = ((max_len - 2) >> 8) & 0xff;
idebufferb[1] = (max_len - 2) & 0xff;
}
ide->packetstatus = ATAPI_STATUS_DATA; ide->packetstatus = ATAPI_STATUS_DATA;
ide->cylinder=len; ide->cylinder=len;
ide->secount=2; ide->secount=2;

View File

@@ -46,6 +46,7 @@ uint8_t SCSICommandTable[0x100] =
[GPCMD_PAUSE_RESUME] = CHECK_READY, [GPCMD_PAUSE_RESUME] = CHECK_READY,
[GPCMD_STOP_PLAY_SCAN] = CHECK_READY, [GPCMD_STOP_PLAY_SCAN] = CHECK_READY,
[GPCMD_READ_DISC_INFORMATION] = CHECK_READY, [GPCMD_READ_DISC_INFORMATION] = CHECK_READY,
[GPCMD_READ_TRACK_INFORMATION] = CHECK_READY,
[GPCMD_MODE_SELECT_10] = 0, [GPCMD_MODE_SELECT_10] = 0,
[GPCMD_MODE_SENSE_10] = 0, [GPCMD_MODE_SENSE_10] = 0,
[GPCMD_PLAY_AUDIO_12] = CHECK_READY, [GPCMD_PLAY_AUDIO_12] = CHECK_READY,
@@ -1156,6 +1157,7 @@ void SCSICDROM_ReadData(uint8_t id, uint8_t *cdb, uint8_t *data, int datalen)
unsigned PreambleLen; unsigned PreambleLen;
unsigned char Temp; unsigned char Temp;
int read_length = 0; int read_length = 0;
int max_length = 0;
msf = cdb[1] & 2; msf = cdb[1] & 2;
@@ -1553,6 +1555,21 @@ SCSIOut:
break; break;
case GPCMD_READ_TRACK_INFORMATION: case GPCMD_READ_TRACK_INFORMATION:
max_length = SCSIDevices[id].Cdb[7];
max_length <<= 8;
max_length |= SCSIDevices[id].Cdb[8];
if (cdrom->read_track_information)
{
cdrom->read_track_information(SCSIDevices[id].Cdb, SCSIDevices[id].CmdBuffer);
datalen = SCSIDevices[id].CmdBuffer[0];
datalen <<= 8;
datalen |= SCSIDevices[id].CmdBuffer[1];
datalen += 2;
}
else
{
if ((SCSIDevices[id].Cdb[3] != 1) || (SCSIDevices[id].Cdb[2] != 1)) if ((SCSIDevices[id].Cdb[3] != 1) || (SCSIDevices[id].Cdb[2] != 1))
{ {
SCSIStatus = SCSI_STATUS_CHECK_CONDITION; SCSIStatus = SCSI_STATUS_CHECK_CONDITION;
@@ -1565,12 +1582,7 @@ SCSIOut:
return; return;
} }
if (cdrom->read_track_information) datalen = 36;
{
cdrom->read_track_information(SCSIDevices[id].Cdb, SCSIDevices[id].CmdBuffer);
}
else
{
SCSIDevices[id].CmdBuffer[1] = 34; SCSIDevices[id].CmdBuffer[1] = 34;
SCSIDevices[id].CmdBuffer[2] = 1; /* track number (LSB) */ SCSIDevices[id].CmdBuffer[2] = 1; /* track number (LSB) */
SCSIDevices[id].CmdBuffer[3] = 1; /* session number (LSB) */ SCSIDevices[id].CmdBuffer[3] = 1; /* session number (LSB) */
@@ -1585,6 +1597,13 @@ SCSIOut:
SCSIDevices[id].CmdBuffer[32] = 0; /* track number (MSB) */ SCSIDevices[id].CmdBuffer[32] = 0; /* track number (MSB) */
SCSIDevices[id].CmdBuffer[33] = 0; /* session number (MSB) */ SCSIDevices[id].CmdBuffer[33] = 0; /* session number (MSB) */
} }
if (datalen > max_length)
{
datalen = max_length;
SCSIDevices[id].CmdBuffer[0] = ((max_length - 2) >> 8) & 0xff;
SCSIDevices[id].CmdBuffer[1] = (max_length - 2) & 0xff;
}
break; break;
case GPCMD_READ_DVD_STRUCTURE: case GPCMD_READ_DVD_STRUCTURE: