The NCR 5380 bus state machine now uses a switch block.
This commit is contained in:
@@ -376,7 +376,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
if (bus & BUS_ARB)
|
||||
ncr->state = STATE_IDLE;
|
||||
|
||||
if (ncr->state == STATE_IDLE) {
|
||||
switch (ncr->state) {
|
||||
case STATE_IDLE:
|
||||
ncr->clear_req = ncr->wait_data = ncr->wait_complete = 0;
|
||||
if ((bus & BUS_SEL) && !(bus & BUS_BSY)) {
|
||||
ncr_log("Selection phase\n");
|
||||
@@ -395,7 +396,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->cur_bus = 0;
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_SELECT) {
|
||||
break;
|
||||
case STATE_SELECT:
|
||||
if (!(bus & BUS_SEL)) {
|
||||
if (!(bus & BUS_ATN)) {
|
||||
if ((ncr->target_id != (uint8_t)-1) && scsi_device_present(&scsi_devices[ncr->target_id])) {
|
||||
@@ -418,7 +420,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->is_msgout = 1;
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_COMMAND) {
|
||||
break;
|
||||
case STATE_COMMAND:
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
/*Write command byte to the output data register*/
|
||||
ncr->command[ncr->command_pos++] = BUS_GETDATA(bus);
|
||||
@@ -464,7 +467,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->new_phase = dev->phase;
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_DATAIN) {
|
||||
break;
|
||||
case STATE_DATAIN:
|
||||
dev = &scsi_devices[ncr->target_id];
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
if (ncr->data_pos >= dev->buffer_length) {
|
||||
@@ -487,7 +491,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->new_phase = SCSI_PHASE_DATA_IN;
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_DATAOUT) {
|
||||
break;
|
||||
case STATE_DATAOUT:
|
||||
dev = &scsi_devices[ncr->target_id];
|
||||
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
@@ -510,7 +515,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr_log("CurBus ~REQ_DataOut=%02x\n", ncr->cur_bus);
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_STATUS) {
|
||||
break;
|
||||
case STATE_STATUS:
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
/*All transfers done, wait until next transfer*/
|
||||
ncr->cur_bus &= ~BUS_REQ;
|
||||
@@ -518,13 +524,15 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->wait_data = 4;
|
||||
ncr->wait_complete = 8;
|
||||
}
|
||||
} else if (ncr->state == STATE_MESSAGEIN) {
|
||||
break;
|
||||
case STATE_MESSAGEIN:
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
ncr->cur_bus &= ~BUS_REQ;
|
||||
ncr->new_phase = BUS_IDLE;
|
||||
ncr->wait_data = 4;
|
||||
}
|
||||
} else if (ncr->state == STATE_MESSAGEOUT) {
|
||||
break;
|
||||
case STATE_MESSAGEOUT:
|
||||
ncr_log("Ack on MSGOUT = %02x\n", (bus & BUS_ACK));
|
||||
if ((bus & BUS_ACK) && !(ncr->bus_in & BUS_ACK)) {
|
||||
ncr->msgout[ncr->msgout_pos++] = BUS_GETDATA(bus);
|
||||
@@ -536,7 +544,8 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->state = STATE_MESSAGE_ID;
|
||||
}
|
||||
}
|
||||
} else if (ncr->state == STATE_MESSAGE_ID) {
|
||||
break;
|
||||
case STATE_MESSAGE_ID:
|
||||
if ((ncr->target_id != (uint8_t)-1) && scsi_device_present(&scsi_devices[ncr->target_id])) {
|
||||
ncr_log("Device found at ID %i on MSGOUT, Current Bus BSY=%02x\n", ncr->target_id, ncr->cur_bus);
|
||||
ncr->state = STATE_COMMAND;
|
||||
@@ -545,6 +554,7 @@ ncr_bus_update(void *priv, int bus)
|
||||
ncr->command_pos = 0;
|
||||
SET_BUS_STATE(ncr, SCSI_PHASE_COMMAND);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
ncr->bus_in = bus;
|
||||
|
||||
Reference in New Issue
Block a user