mirror of
https://github.com/holub/mame
synced 2025-07-04 17:38:08 +03:00
nscsi_cd: minor fixes (nw)
* correct inquiry with missing lun behaviour * return error on mode sense for unsupported page
This commit is contained in:
parent
966251cc35
commit
6e361ab9ff
@ -202,21 +202,16 @@ void nscsi_cdrom_device::scsi_command()
|
|||||||
* is returned with sense data ILLEGAL REQUEST and LOGICAL UNIT NOT
|
* is returned with sense data ILLEGAL REQUEST and LOGICAL UNIT NOT
|
||||||
* SUPPORTED.
|
* SUPPORTED.
|
||||||
*/
|
*/
|
||||||
if(lun) {
|
|
||||||
bad_lun();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int page = scsi_cmdbuf[2];
|
int page = scsi_cmdbuf[2];
|
||||||
int size = scsi_cmdbuf[4];
|
int size = scsi_cmdbuf[4];
|
||||||
switch(page) {
|
switch(page) {
|
||||||
case 0:
|
case 0:
|
||||||
std::fill_n(scsi_cmdbuf, 36, 0);
|
std::fill_n(scsi_cmdbuf, 36, 0);
|
||||||
|
|
||||||
// vendor and product information must be padded with spaces
|
if (lun != 0)
|
||||||
std::fill_n(&scsi_cmdbuf[8], 28, 0x20);
|
scsi_cmdbuf[0] = 0x7f;
|
||||||
|
else
|
||||||
scsi_cmdbuf[0] = 0x05; // device is present, device is CD/DVD (MMC-3)
|
scsi_cmdbuf[0] = 0x05; // device is present, device is CD/DVD (MMC-3)
|
||||||
scsi_cmdbuf[1] = 0x80; // media is removable
|
scsi_cmdbuf[1] = 0x80; // media is removable
|
||||||
scsi_cmdbuf[2] = compliance; // device complies with SPC-3 standard
|
scsi_cmdbuf[2] = compliance; // device complies with SPC-3 standard
|
||||||
scsi_cmdbuf[3] = 0x02; // response data format = SPC-3 standard
|
scsi_cmdbuf[3] = 0x02; // response data format = SPC-3 standard
|
||||||
@ -225,6 +220,8 @@ void nscsi_cdrom_device::scsi_command()
|
|||||||
strncpy((char *)&scsi_cmdbuf[8], manufacturer, 8);
|
strncpy((char *)&scsi_cmdbuf[8], manufacturer, 8);
|
||||||
strncpy((char *)&scsi_cmdbuf[16], product, 16);
|
strncpy((char *)&scsi_cmdbuf[16], product, 16);
|
||||||
strncpy((char *)&scsi_cmdbuf[32], revision, 4);
|
strncpy((char *)&scsi_cmdbuf[32], revision, 4);
|
||||||
|
|
||||||
|
// vendor and product information must be padded with spaces
|
||||||
for(int i = 8; i < 36; i++)
|
for(int i = 8; i < 36; i++)
|
||||||
if(scsi_cmdbuf[i] == 0)
|
if(scsi_cmdbuf[i] == 0)
|
||||||
scsi_cmdbuf[i] = 0x20;
|
scsi_cmdbuf[i] = 0x20;
|
||||||
@ -321,10 +318,11 @@ void nscsi_cdrom_device::scsi_command()
|
|||||||
scsi_cmdbuf[pos++] = (bytes_per_block>>8)&0xff;
|
scsi_cmdbuf[pos++] = (bytes_per_block>>8)&0xff;
|
||||||
scsi_cmdbuf[pos++] = (bytes_per_block & 0xff);
|
scsi_cmdbuf[pos++] = (bytes_per_block & 0xff);
|
||||||
|
|
||||||
|
bool fail = false;
|
||||||
int pmax = page == 0x3f ? 0x3e : page;
|
int pmax = page == 0x3f ? 0x3e : page;
|
||||||
int pmin = page == 0x3f ? 0x00 : page;
|
int pmin = page == 0x3f ? 0x00 : page;
|
||||||
for(int page=pmax; page >= pmin; page--) {
|
for(int p=pmax; p >= pmin; p--) {
|
||||||
switch(page) {
|
switch(p) {
|
||||||
case 0x00: // Vendor specific (does not require page format)
|
case 0x00: // Vendor specific (does not require page format)
|
||||||
scsi_cmdbuf[pos++] = 0x80; // PS, page id
|
scsi_cmdbuf[pos++] = 0x80; // PS, page id
|
||||||
scsi_cmdbuf[pos++] = 0x02; // Page length
|
scsi_cmdbuf[pos++] = 0x02; // Page length
|
||||||
@ -352,7 +350,10 @@ void nscsi_cdrom_device::scsi_command()
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
LOG("mode sense page %02x unhandled\n", page);
|
if (page != 0x3f) {
|
||||||
|
LOG("mode sense page %02x unhandled\n", p);
|
||||||
|
fail = true;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -360,8 +361,13 @@ void nscsi_cdrom_device::scsi_command()
|
|||||||
if(pos > size)
|
if(pos > size)
|
||||||
pos = size;
|
pos = size;
|
||||||
|
|
||||||
scsi_data_in(0, pos);
|
if (!fail) {
|
||||||
scsi_status_complete(SS_GOOD);
|
scsi_data_in(0, pos);
|
||||||
|
scsi_status_complete(SS_GOOD);
|
||||||
|
} else {
|
||||||
|
scsi_status_complete(SS_CHECK_CONDITION);
|
||||||
|
sense(false, SK_ILLEGAL_REQUEST, SK_ASC_INVALID_FIELD_IN_CDB);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user