ncr->board_mask = 0xffff;
ncr->irq_func = irq_func ? irq_func : set_irq2;
if (!ncr->devobject.lsistate)
- esp_scsi_init(&ncr->devobject, read, write, mode > 0);
+ esp_scsi_init(&ncr->devobject, read, write, mode > 0 ? mode : 0);
esp_scsi_reset(&ncr->devobject, ncr);
}
void cpuboard_dkb_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
ncr9x_add_scsi_unit(&ncr_dkb1200_scsi, ch, ci, rc);
- ncr9x_esp_scsi_init(ncr_dkb1200_scsi, fake_dma_read, fake_dma_write, set_irq2_dkb1200, 0);
+ ncr9x_esp_scsi_init(ncr_dkb1200_scsi, fake_dma_read, fake_dma_write, set_irq2_dkb1200, 2);
}
void fastlane_add_scsi_unit (int ch, struct uaedev_config_info *ci, struct romconfig *rc)
void rapidfire_add_scsi_unit(int ch, struct uaedev_config_info *ci, struct romconfig *rc)
{
ncr9x_add_scsi_unit(&ncr_rapidfire_scsi[ci->controller_type_unit], ch, ci, rc);
- ncr9x_esp_scsi_init(ncr_rapidfire_scsi[ci->controller_type_unit], fake_dma_read, fake_dma_write, set_irq2, 0);
+ ncr9x_esp_scsi_init(ncr_rapidfire_scsi[ci->controller_type_unit], fake_dma_read, fake_dma_write, set_irq2, 2);
esp_dma_enable(ncr_rapidfire_scsi[ci->controller_type_unit]->devobject.lsistate, 1);
}
static void fas408_check(ESPState *s)
{
- if (!s->fas4xxextra)
+ if (!(s->fas4xxextra & 1))
return;
bool irq = false;
int v = 0;
s->dma_counter -= s->dma_len;
s->rregs[ESP_TCLO] = s->dma_counter;
s->rregs[ESP_TCMID] = s->dma_counter >> 8;
- if (s->wregs[ESP_CFG2] & 0x40)
+ if ((s->wregs[ESP_CFG2] & 0x40) || (s->fas4xxextra & 2))
s->rregs[ESP_TCHI] = s->dma_counter >> 16;
esp_raise_irq(s);
{
memset(s->rregs, 0, ESP_REGS);
memset(s->wregs, 0, ESP_REGS);
- s->rregs[ESP_TCHI] = s->chip_id;
+ if (!(s->fas4xxextra & 2)) {
+ s->rregs[ESP_TCHI] = s->chip_id;
+ }
s->ti_size = 0;
s->ti_rptr = 0;
s->ti_wptr = 0;
{
ESPState *s = (ESPState*)opaque;
s->rregs[ESP_FIFO] = 0;
- if (s->fas4xxextra && (s->wregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_PIOM) && (s->fas408_buffer_size > 0 || s->fas408_buffer_offset > 0 || (s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == STAT_DO)) {
+ if ((s->fas4xxextra & 1) && (s->wregs[ESP_REGS + NCR_PSTAT] & NCRPSTAT_PIOM) && (s->fas408_buffer_size > 0 || s->fas408_buffer_offset > 0 || (s->rregs[ESP_RSTAT] & STAT_PIO_MASK) == STAT_DO)) {
bool refill = true;
if (s->ti_size > 128) {
s->rregs[ESP_FIFO] = s->async_buf[s->ti_rptr++];
ESPState *s = (ESPState*)opaque;
uint32_t old_val;
- if (s->fas4xxextra && (s->wregs[0x0d] & 0x80)) {
+ if ((s->fas4xxextra & 1) && (s->wregs[0x0d] & 0x80)) {
saddr += ESP_REGS;
}
case ESP_RES4:
return 0x80 | 0x20 | 0x2;
case ESP_TCHI:
- if (!(s->wregs[ESP_CFG2] & 0x40))
+ if (!(s->wregs[ESP_CFG2] & 0x40) && !(s->fas4xxextra & 2))
return 0;
break;
void fas408_write_fifo(void *opaque, uint64_t val)
{
ESPState *s = (ESPState*)opaque;
- if (!s->fas4xxextra)
+ if (!(s->fas4xxextra & 1))
return;
s->fas408_buffer_offset = 0;
if (s->fas408_buffer_size < 128) {
{
ESPState *s = (ESPState*)opaque;
- if (s->fas4xxextra && (s->wregs[ESP_RES3] & 0x80)) {
+ if ((s->fas4xxextra & 1) && (s->wregs[ESP_RES3] & 0x80)) {
saddr += ESP_REGS;
}
s->rregs[ESP_RSTAT] &= ~STAT_TC;
break;
case ESP_TCHI:
- if (!(s->wregs[ESP_CFG2] & 0x40))
+ if (!(s->wregs[ESP_CFG2] & 0x40) && !(s->fas4xxextra & 2))
val = 0;
else
s->rregs[ESP_RSTAT] &= ~STAT_TC;
s->rregs[ESP_TCLO] = s->wregs[ESP_TCLO];
s->rregs[ESP_TCMID] = s->wregs[ESP_TCMID];
s->rregs[ESP_TCHI] = s->wregs[ESP_TCHI];
- if (!(s->wregs[ESP_CFG2] & 0x40))
+ if (!(s->wregs[ESP_CFG2] & 0x40) && !(s->fas4xxextra & 2))
s->rregs[ESP_TCHI] = 0;
} else {
s->dma = 0;
}
switch(val & CMD_CMD) {
case CMD_NOP:
- if ((val & CMD_DMA) && (s->wregs[ESP_CFG2] & 0x40))
+ if ((val & CMD_DMA) && ((s->wregs[ESP_CFG2] & 0x40) && !(s->fas4xxextra & 2)))
s->rregs[ESP_TCHI] = s->chip_id;
break;
case CMD_FLUSH:
type_init(esp_register_types)
#endif
-void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, bool fas4xxextra)
+void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, int fas4xxextra)
{
dev->lsistate = calloc(sizeof(ESPState), 1);
ESPState *s = ESP(dev);
s->dma_memory_read = read;
s->dma_memory_write = write;
s->fas4xxextra = fas4xxextra;
- s->chip_id = 0x12;
+ s->chip_id = 0x12 | 0x80;
}
void esp_scsi_reset(DeviceState *dev, void *privdata)
qemu_irq irq;
int irq_raised;
uint8_t chip_id;
+ uint8_t tchi_has_id;
int32_t ti_size;
int32_t dma_len;
uint32_t ti_rptr, ti_wptr;
ESPDMAMemoryReadWriteFunc dma_memory_write;
void *dma_opaque;
int (*dma_cb)(ESPState *s);
- bool fas4xxextra;
+ int fas4xxextra;
int fas408sig;
uint8_t fas408_buffer[128+1];
int fas408_buffer_size;
void esp_request_cancelled(SCSIRequest *req);
void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid);
void esp_transfer_data(SCSIRequest *req, uint32_t len);
-void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, bool fas4xxextra);
+void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write, int fas4xxextra);
void esp_scsi_reset(DeviceState *dev, void *privdata);
bool esp_dreq(DeviceState *dev);