| 1430 | } |
| 1431 | |
| 1432 | int scsi_cd_emulate (int unitnum, uae_u8 *cmdbuf, int scsi_cmd_len, |
| 1433 | uae_u8 *scsi_data, int *data_len, uae_u8 *r, int *reply_len, uae_u8 *s, int *sense_len, bool atapi) |
| 1434 | { |
| 1435 | struct blkdevstate *st = &state[unitnum]; |
| 1436 | uae_u32 len, offset; |
| 1437 | int lr = 0, ls = 0; |
| 1438 | int scsi_len = -1; |
| 1439 | int v; |
| 1440 | int status = 0; |
| 1441 | struct device_info di; |
| 1442 | uae_u8 cmd; |
| 1443 | int dlen, lun; |
| 1444 | |
| 1445 | if (cmdbuf == NULL) { |
| 1446 | if (st->mediawaschanged) { |
| 1447 | st->mediawaschanged = false; |
| 1448 | return (0x28 << 8) | (0x00); |
| 1449 | } |
| 1450 | return 0; |
| 1451 | } |
| 1452 | |
| 1453 | cmd = cmdbuf[0]; |
| 1454 | |
| 1455 | if (cmd == 0x03) { |
| 1456 | return 0; |
| 1457 | } |
| 1458 | |
| 1459 | dlen = *data_len; |
| 1460 | *reply_len = *sense_len = 0; |
| 1461 | |
| 1462 | if (log_scsiemu) { |
| 1463 | write_log (_T("CD SCSIEMU %d: %02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X.%02X CMDLEN=%d DATA=%p LEN=%d\n"), unitnum, |
| 1464 | cmdbuf[0], cmdbuf[1], cmdbuf[2], cmdbuf[3], cmdbuf[4], cmdbuf[5], cmdbuf[6], |
| 1465 | cmdbuf[7], cmdbuf[8], cmdbuf[9], cmdbuf[10], cmdbuf[11], |
| 1466 | scsi_cmd_len, scsi_data, dlen); |
| 1467 | } |
| 1468 | |
| 1469 | lun = cmdbuf[1] >> 5; |
| 1470 | if (cmdbuf[0] != 0x03 && cmdbuf[0] != 0x12 && lun) { |
| 1471 | status = 2; /* CHECK CONDITION */ |
| 1472 | s[0] = 0x70; |
| 1473 | s[2] = 5; /* ILLEGAL REQUEST */ |
| 1474 | s[12] = 0x25; /* INVALID LUN */ |
| 1475 | ls = 0x12; |
| 1476 | write_log (_T("CD SCSIEMU %d: CMD=%02X LUN=%d ignored\n"), unitnum, cmdbuf[0], lun); |
| 1477 | goto end; |
| 1478 | } |
| 1479 | |
| 1480 | sys_command_info (unitnum, &di, 1); |
| 1481 | |
| 1482 | switch (cmdbuf[0]) |
| 1483 | { |
| 1484 | case 0x00: /* TEST UNIT READY */ |
| 1485 | if (nodisk (&di)) |
| 1486 | goto nodisk; |
| 1487 | scsi_len = 0; |
| 1488 | break; |
| 1489 | case 0x1e: /* PREVENT/ALLOW MEDIUM REMOVAL */ |
no test coverage detected