Calls to SCSI command phase 0 with an ID and LUN no device is attached to now correctly end with status phase and CHECK CONDITION status, fixes the DOS Trantor CD-ROM driver.

This commit is contained in:
OBattler
2017-10-16 20:42:04 +02:00
parent 500b2bc855
commit cca76f55a4
2 changed files with 31 additions and 28 deletions

View File

@@ -80,10 +80,10 @@ static int get_dev_id(uint8_t data)
for (c = 0; c < SCSI_ID_MAX; c++)
{
if (data & (1 << c))
{
return c;
}
if (data & (1 << c))
{
return c;
}
}
return -1;
@@ -104,16 +104,17 @@ int scsi_bus_update(scsi_bus_t *bus, int bus_assert)
bus->clear_req = bus->change_state_delay = bus->new_req_delay = 0;
if ((bus_assert & BUS_SEL) && !(bus_assert & BUS_BSY))
{
uint8_t sel_data = BUS_GETDATA(bus_assert);
uint8_t sel_data = BUS_GETDATA(bus_assert);
bus->dev_id = get_dev_id(sel_data);
bus->dev_id = get_dev_id(sel_data);
if (scsi_device_present(bus->dev_id, 0))
{
bus->bus_out |= BUS_BSY;
bus->state = STATE_PHASESEL;
}
//scsi_bus_log("Device id %i\n", bus->dev_id);
break;
if ((bus->dev_id != -1) && scsi_device_present(bus->dev_id, 0))
{
bus->bus_out |= BUS_BSY;
bus->state = STATE_PHASESEL;
}
//scsi_bus_log("Device id %i\n", bus->dev_id);
break;
}
break;
@@ -123,17 +124,17 @@ int scsi_bus_update(scsi_bus_t *bus, int bus_assert)
{
if (!(bus_assert & BUS_ATN))
{
if (scsi_device_present(bus->dev_id, 0))
if ((bus->dev_id != -1) && scsi_device_present(bus->dev_id, 0))
{
bus->state = STATE_COMMAND;
bus->bus_out = BUS_BSY | BUS_REQ;
bus->command_pos = 0;
SET_BUS_STATE(bus, SCSI_PHASE_COMMAND);
bus->state = STATE_COMMAND;
bus->bus_out = BUS_BSY | BUS_REQ;
bus->command_pos = 0;
SET_BUS_STATE(bus, SCSI_PHASE_COMMAND);
}
else
{
bus->state = STATE_IDLE;
bus->bus_out = 0;
bus->state = STATE_IDLE;
bus->bus_out = 0;
}
}
else
@@ -270,11 +271,11 @@ int scsi_bus_update(scsi_bus_t *bus, int bus_assert)
if ((bus_assert & BUS_ACK) && !(bus->bus_in & BUS_ACK))
{
/* scsi_bus_log("Preparing for message in\n"); */
bus->bus_out &= ~BUS_REQ;
bus->new_state = SCSI_PHASE_MESSAGE_IN;
bus->change_state_delay = 4;
bus->new_req_delay = 8;
/* scsi_bus_log("Preparing for message in\n"); */
bus->bus_out &= ~BUS_REQ;
bus->new_state = SCSI_PHASE_MESSAGE_IN;
bus->change_state_delay = 4;
bus->new_req_delay = 8;
}
break;
@@ -283,9 +284,9 @@ int scsi_bus_update(scsi_bus_t *bus, int bus_assert)
if ((bus_assert & BUS_ACK) && !(bus->bus_in & BUS_ACK))
{
bus->bus_out &= ~BUS_REQ;
bus->new_state = BUS_IDLE;
bus->change_state_delay = 4;
bus->bus_out &= ~BUS_REQ;
bus->new_state = BUS_IDLE;
bus->change_state_delay = 4;
}
break;
}

View File

@@ -295,6 +295,8 @@ void scsi_device_command_phase0(uint8_t scsi_id, uint8_t scsi_lun, int cdb_len,
break;
default:
id = 0;
SCSIPhase = SCSI_PHASE_STATUS;
SCSIStatus = SCSI_STATUS_CHECK_CONDITION;
return;
}