summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/nscsi/s1410.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/nscsi/s1410.cpp')
-rw-r--r--src/devices/bus/nscsi/s1410.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/devices/bus/nscsi/s1410.cpp b/src/devices/bus/nscsi/s1410.cpp
new file mode 100644
index 00000000000..5ecf65ef693
--- /dev/null
+++ b/src/devices/bus/nscsi/s1410.cpp
@@ -0,0 +1,152 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+#include "emu.h"
+#include "bus/nscsi/s1410.h"
+
+DEFINE_DEVICE_TYPE(NSCSI_S1410, nscsi_s1410_device, "scsi_s1410", "S1410 Hard Disk")
+
+nscsi_s1410_device::nscsi_s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ nscsi_harddisk_device(mconfig, NSCSI_S1410, tag, owner, clock)
+{
+}
+
+void nscsi_s1410_device::device_reset()
+{
+ nscsi_harddisk_device::device_reset();
+
+ // initialize drive characteristics
+ params[0] = 0;
+ params[1] = 153;
+ params[2] = 4;
+ params[3] = 0;
+ params[4] = 128;
+ params[5] = 0;
+ params[6] = 64;
+ params[7] = 11;
+}
+
+void nscsi_s1410_device::scsi_command()
+{
+ switch(scsi_cmdbuf[0]) {
+ case SC_TEST_UNIT_READY:
+ case SC_REZERO:
+ case SC_REQUEST_SENSE:
+ case SC_REASSIGN_BLOCKS:
+ case SC_READ:
+ case SC_WRITE:
+ case SC_SEEK:
+ if (scsi_cmdbuf[1] >> 5) {
+ scsi_status_complete(SS_NOT_READY);
+ } else {
+ nscsi_harddisk_device::scsi_command();
+ }
+ break;
+
+ case SC_FORMAT_UNIT:
+ if (scsi_cmdbuf[1] >> 5) {
+ scsi_status_complete(SS_NOT_READY);
+ return;
+ }
+
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_FORMAT_TRACK: {
+ if (scsi_cmdbuf[1] >> 5) {
+ scsi_status_complete(SS_NOT_READY);
+ return;
+ }
+
+ lba = ((scsi_cmdbuf[1] & 0x1f)<<16) | (scsi_cmdbuf[2]<<8) | scsi_cmdbuf[3];
+ blocks = (bytes_per_sector == 256) ? 32 : 17;
+
+ int track_length = blocks*bytes_per_sector;
+ std::vector<uint8_t> data(track_length);
+ memset(&data[0], 0xc6, track_length);
+
+ if(!hard_disk_write(harddisk, lba, &data[0])) {
+ logerror("%s: HD WRITE ERROR !\n", tag());
+ scsi_status_complete(SS_FORMAT_ERROR);
+ } else {
+ scsi_status_complete(SS_GOOD);
+ }
+ }
+ break;
+
+ case SC_FORMAT_ALT_TRACK:
+ if (scsi_cmdbuf[1] >> 5) {
+ scsi_status_complete(SS_NOT_READY);
+ return;
+ }
+
+ scsi_data_in(2, 3);
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_INIT_DRIVE_PARAMS:
+ scsi_data_in(2, 8);
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_WRITE_SECTOR_BUFFER:
+ scsi_data_in(2, 512);
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_READ_SECTOR_BUFFER:
+ scsi_data_out(2, 512);
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_CHECK_TRACK_FORMAT:
+ if (scsi_cmdbuf[1] >> 5) {
+ scsi_status_complete(SS_NOT_READY);
+ return;
+ }
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ case SC_READ_ECC_BURST:
+ case SC_RAM_DIAG:
+ case SC_DRIVE_DIAG:
+ case SC_CONTROLLER_DIAG:
+ case SC_READ_LONG:
+ case SC_WRITE_LONG:
+ scsi_status_complete(SS_GOOD);
+ break;
+
+ default:
+ logerror("%s: command %02x ***UNKNOWN***\n", tag(), scsi_cmdbuf[0]);
+ break;
+ }
+}
+
+uint8_t nscsi_s1410_device::scsi_get_data(int id, int pos)
+{
+ switch(scsi_cmdbuf[0]) {
+ case SC_READ_SECTOR_BUFFER:
+ return block[pos];
+
+ default:
+ return nscsi_harddisk_device::scsi_get_data(id, pos);
+ }
+}
+
+void nscsi_s1410_device::scsi_put_data(int id, int pos, uint8_t data)
+{
+ switch(scsi_cmdbuf[0]) {
+ case SC_FORMAT_ALT_TRACK:
+ break;
+
+ case SC_INIT_DRIVE_PARAMS:
+ params[pos] = data;
+ break;
+
+ case SC_WRITE_SECTOR_BUFFER:
+ block[pos] = data;
+ break;
+
+ default:
+ return nscsi_harddisk_device::scsi_put_data(id, pos, data);
+ }
+}