This commit is contained in:
OBattler
2025-01-13 23:22:46 +01:00
3 changed files with 5 additions and 2 deletions

View File

@@ -104,6 +104,7 @@ typedef struct ncr_t {
int state; int state;
int clear_req; int clear_req;
int wait_data; int wait_data;
int wait_data_back;
int wait_complete; int wait_complete;
int command_pos; int command_pos;
int data_pos; int data_pos;

View File

@@ -197,7 +197,7 @@ ncr5380_bus_read(ncr_t *ncr)
phase = (ncr->cur_bus & SCSI_PHASE_MESSAGE_IN); phase = (ncr->cur_bus & SCSI_PHASE_MESSAGE_IN);
if (phase == SCSI_PHASE_DATA_IN) { if (phase == SCSI_PHASE_DATA_IN) {
if ((ncr->dma_mode == DMA_IDLE) || ncr->dma_initiator_receive_ext) { if ((ncr->dma_mode == DMA_IDLE) || ncr->dma_initiator_receive_ext || (ncr->wait_data_back == 1)) {
ncr5380_log("Phase Data In.\n"); ncr5380_log("Phase Data In.\n");
if ((dev->sc != NULL) && (dev->sc->temp_buffer != NULL)) if ((dev->sc != NULL) && (dev->sc->temp_buffer != NULL))
ncr->tx_data = dev->sc->temp_buffer[ncr->data_pos++]; ncr->tx_data = dev->sc->temp_buffer[ncr->data_pos++];
@@ -210,11 +210,12 @@ ncr5380_bus_read(ncr_t *ncr)
ncr->state = STATE_IDLE; ncr->state = STATE_IDLE;
ncr->cur_bus &= ~BUS_BSY; ncr->cur_bus &= ~BUS_BSY;
} else { } else {
if ((ncr->dma_mode == DMA_IDLE) || ncr->dma_send_ext) if ((ncr->dma_mode == DMA_IDLE) || ncr->dma_send_ext || (ncr->wait_data_back == 1))
ncr->state = STATE_DATAOUT; ncr->state = STATE_DATAOUT;
} }
} else if (phase == SCSI_PHASE_STATUS) { } else if (phase == SCSI_PHASE_STATUS) {
ncr5380_log("Phase Status.\n"); ncr5380_log("Phase Status.\n");
ncr->wait_data_back = 0;
ncr->cur_bus |= BUS_REQ; ncr->cur_bus |= BUS_REQ;
ncr->state = STATE_STATUS; ncr->state = STATE_STATUS;
ncr->cur_bus = (ncr->cur_bus & ~BUS_DATAMASK) | BUS_SETDATA(dev->status) | BUS_DBP; ncr->cur_bus = (ncr->cur_bus & ~BUS_DATAMASK) | BUS_SETDATA(dev->status) | BUS_DBP;

View File

@@ -193,6 +193,7 @@ ncr53c400_write(uint32_t addr, uint8_t val, void *priv)
else else
timer_on_auto(&ncr400->timer, ncr->period); timer_on_auto(&ncr400->timer, ncr->period);
ncr->wait_data_back = ncr->wait_data;
ncr53c400_log("DMA timer on=%02x, callback=%lf, scsi buflen=%d, waitdata=%d, waitcomplete=%d, clearreq=%d, datawait=%d, enabled=%d.\n", ncr53c400_log("DMA timer on=%02x, callback=%lf, scsi buflen=%d, waitdata=%d, waitcomplete=%d, clearreq=%d, datawait=%d, enabled=%d.\n",
ncr->mode & MODE_MONITOR_BUSY, scsi_device_get_callback(dev), dev->buffer_length, ncr->wait_data, ncr->wait_complete, ncr->clear_req, ncr->data_wait, timer_is_enabled(&ncr400->timer)); ncr->mode & MODE_MONITOR_BUSY, scsi_device_get_callback(dev), dev->buffer_length, ncr->wait_data, ncr->wait_complete, ncr->clear_req, ncr->data_wait, timer_is_enabled(&ncr400->timer));
} }