scsi_emulate_analyze(sd);
//write_log (_T("%02x.%02x.%02x.%02x.%02x.%02x\n"), sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5]);
- if (sd->direction < 0)
+ if (sd->direction <= 0)
scsi_emulate_cmd(sd);
if (sd->direction == 0)
return 1;
scsi_emulate_analyze (sd);
//write_log (_T("%02x.%02x.%02x.%02x.%02x.%02x\n"), sd->cmd[0], sd->cmd[1], sd->cmd[2], sd->cmd[3], sd->cmd[4], sd->cmd[5]);
- if (sd->direction < 0)
+ if (sd->direction <= 0)
scsi_emulate_cmd(sd);
if (sd->direction == 0)
return 1;
special_mem |= S_READ;
#endif
addr &= ncr->board_mask;
- if (addr >= A4091_IO_ALT) {
- v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
- (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+ if (ncr == &ncr_we) {
+ addr &= ~0x80;
+ v = (ncr_bget2(ncr, addr + 3) << 0) | (ncr_bget2(ncr, addr + 2) << 8) |
+ (ncr_bget2(ncr, addr + 1) << 16) | (ncr_bget2(ncr, addr + 0) << 24);
} else {
- v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
- (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+ if (addr >= A4091_IO_ALT) {
+ v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
+ (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+ } else {
+ v = (ncr_bget2 (ncr, addr + 3) << 0) | (ncr_bget2 (ncr, addr + 2) << 8) |
+ (ncr_bget2 (ncr, addr + 1) << 16) | (ncr_bget2 (ncr, addr + 0) << 24);
+ }
}
return v;
}
special_mem |= S_WRITE;
#endif
addr &= ncr->board_mask;
- if (addr >= A4091_IO_ALT) {
- ncr_bput2 (ncr, addr + 3, l >> 0);
- ncr_bput2 (ncr, addr + 2, l >> 8);
- ncr_bput2 (ncr, addr + 1, l >> 16);
- ncr_bput2 (ncr, addr + 0, l >> 24);
+ if (ncr == &ncr_we) {
+ addr &= ~0x80;
+ ncr_bput2(ncr, addr + 3, l >> 0);
+ ncr_bput2(ncr, addr + 2, l >> 8);
+ ncr_bput2(ncr, addr + 1, l >> 16);
+ ncr_bput2(ncr, addr + 0, l >> 24);
} else {
- ncr_bput2 (ncr, addr + 3, l >> 0);
- ncr_bput2 (ncr, addr + 2, l >> 8);
- ncr_bput2 (ncr, addr + 1, l >> 16);
- ncr_bput2 (ncr, addr + 0, l >> 24);
+ if (addr >= A4091_IO_ALT) {
+ ncr_bput2 (ncr, addr + 3, l >> 0);
+ ncr_bput2 (ncr, addr + 2, l >> 8);
+ ncr_bput2 (ncr, addr + 1, l >> 16);
+ ncr_bput2 (ncr, addr + 0, l >> 24);
+ } else {
+ ncr_bput2 (ncr, addr + 3, l >> 0);
+ ncr_bput2 (ncr, addr + 2, l >> 8);
+ ncr_bput2 (ncr, addr + 1, l >> 16);
+ ncr_bput2 (ncr, addr + 0, l >> 24);
+ }
}
}
}
static const uae_u8 warpengine_a4000_autoconfig[16] = {
- 0x90, 0x13, 0x75, 0x00, 0x08, 0x9b, 0x00, 0x19, 0x01, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00
+ 0x90, 0x13, 0x75, 0x00, 0x08, 0x9b, 0x00, 0x19, 0x02, 0x0e, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00
};
#define WARP_ENGINE_ROM_SIZE 32768
ncr->rom_offset = 0;
ncr->rom_end = WARP_ENGINE_ROM_SIZE * 4;
ncr->io_start = WARP_ENGINE_IO_OFFSET;
- ncr->io_start = WARP_ENGINE_IO_END;
+ ncr->io_end = WARP_ENGINE_IO_END;
struct romlist *rl = getromlistbyids(roms);
if (rl) {
ncr->rom = xcalloc (uae_u8, WARP_ENGINE_ROM_SIZE * 4);
if (z) {
for (int i = 0; i < WARP_ENGINE_ROM_SIZE; i++) {
- uae_u8 b;
+ uae_u8 b = 0xff;
zfile_fread(&b, 1, 1, z);
ncr->rom[i * 4 + 0] = b | 0x0f;
ncr->rom[i * 4 + 1] = 0xff;
struct ncr_state *ncr = ncra4091[devnum];
int roms[3];
- if (!ncr->enabled && devnum > 0) {
- expamem_next();
- return NULL;
- }
+ if (!ncr->enabled && devnum > 0)
+ return &expamem_null;
roms[0] = 58;
roms[1] = 57;
#ifndef QEMU_HW_ESP_H
#define QEMU_HW_ESP_H
-#include "hw/scsi/scsi.h"
-
/* esp.c */
#define ESP_MAX_DEVS 7
typedef void (*ESPDMAMemoryReadWriteFunc)(void *opaque, uint8_t *buf, int len);
void esp_reg_write(ESPState *s, uint32_t saddr, uint64_t val);
extern const VMStateDescription vmstate_esp;
+extern void esp_irq_raise(qemu_irq);
+extern void esp_irq_lower(qemu_irq);
+
+void scsiesp_req_continue(SCSIRequest *req);
+SCSIRequest *scsiesp_req_new(SCSIDevice *d, uint32_t tag, uint32_t lun, uint8_t *buf, void *hba_private);
+int32_t scsiesp_req_enqueue(SCSIRequest *req);
+void scsiesp_req_unref(SCSIRequest *req);
+uint8_t *scsiesp_req_get_buf(SCSIRequest *req);
+SCSIDevice *scsiesp_device_find(SCSIBus *bus, int channel, int target, int lun);
+void scsiesp_req_cancel(SCSIRequest *req);
+
+uint64_t esp_reg_read(void *s, uint32_t saddr);
+void esp_reg_write(void *s, uint32_t saddr, uint64_t val);
+
+void esp_dma_enable(void *opaque, int level);
+
+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);
+void esp_scsi_reset(DeviceState *dev, void *privdata);
+
#endif
return 1; // requested length got
return 0;
}
+
+// raw scsi
+#define SCSI_SIGNAL_PHASE_DATA_OUT 0
+#define SCSI_SIGNAL_PHASE_DATA_IN 1
+#define SCSI_SIGNAL_PHASE_COMMAND 2
+#define SCSI_SIGNAL_PHASE_STATUS 3
+#define SCSI_SIGNAL_PHASE_MESSAGE_OUT 6
+#define SCSI_SIGNAL_PHASE_MESSAGE_IN 7
+
+#define SCSI_BUS_PHASE_FREE 0
+#define SCSI_BUS_PHASE_ARBITRATION 1
+#define SCSI_BUS_PHASE_SELECTION 2
+#define SCSI_BUS_PHASE_RESELECTION 3
+#define SCSI_BUS_PHASE_COMMAND 4
+#define SCSI_BUS_PHASE_DATA_IN 5
+#define SCSI_BUS_PHASE_DATA_OUT 6
+#define SCSI_BUS_PHASE_STATUS 7
+#define SCSI_BUS_PHASE_MESSAGE_IN 8
+#define SCSI_BUS_PHASE_MESSAGE_OUT 9
+
+struct raw_scsi_device
+{
+ int x;
+ int id;
+};
+struct raw_scsi
+{
+ int signal_phase;
+ int old_signal_phase;
+ int bus_phase;
+ uae_u8 data;
+ int initiator;
+ int target;
+ uae_u8 cmd[16];
+ int len;
+ struct raw_scsi_device *device[8];
+};
+
+struct raw_scsi *new_raw_scsi(void)
+{
+ struct raw_scsi *rs = xcalloc(struct raw_scsi, 1);
+ return rs;
+}
+
+void free_raw_scsi(struct raw_scsi *rs)
+{
+ if (!rs)
+ return;
+ for (int i = 0; i < 8; i++)
+ xfree(rs->device[i]);
+ xfree(rs);
+}
+
+struct raw_scsi_device *new_raw_scsi_device(struct raw_scsi *rs, int id)
+{
+ rs->device[id] = xcalloc(struct raw_scsi_device, 1);
+ rs->device[id]->id = id;
+ return rs->device[id];
+}
+
+void free_raw_scsi_device(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+ if (!dev)
+ return;
+ rs->device[dev->id] = NULL;
+ xfree(dev);
+}
+
+int raw_scsi_get_signal_phase(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+ return rs->signal_phase;
+}
+
+void raw_scsi_put_signal_phase(struct raw_scsi *rs, struct raw_scsi_device *dev, uae_u8 phase)
+{
+ if (rs->signal_phase == phase)
+ return;
+ rs->old_signal_phase = rs->signal_phase;
+ rs->signal_phase = phase;
+ switch(rs->bus_phase)
+ {
+ case SCSI_BUS_PHASE_FREE:
+
+ break;
+
+ }
+}
+
+uae_u16 raw_scsi_get_data(struct raw_scsi *rs, struct raw_scsi_device *dev)
+{
+ return rs->data;
+}
+
+void raw_scsi_put_data(struct raw_scsi *rs, struct raw_scsi_device *dev, uae_u16 data)
+{
+}