The NCR 5380 bus state machine now uses a switch block.

This commit is contained in:
OBattler
2020-12-05 09:33:07 +01:00
parent 8832f9d0e9
commit 645ed3fdcd

View File

@@ -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;