trunk/src/emu/machine/nscsi_cb.c
| r0 | r26159 | |
| 1 | #include "nscsi_cb.h" |
| 2 | |
| 3 | const device_type NSCSI_CB = &device_creator<nscsi_callback_device>; |
| 4 | |
| 5 | nscsi_callback_device::nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 6 | : nscsi_device(mconfig, NSCSI_CB, "SCSI callback (new)", tag, owner, clock, "nscsi_cb", __FILE__), |
| 7 | m_write_rst(*this), |
| 8 | m_write_atn(*this), |
| 9 | m_write_ack(*this), |
| 10 | m_write_req(*this), |
| 11 | m_write_msg(*this), |
| 12 | m_write_io(*this), |
| 13 | m_write_cd(*this), |
| 14 | m_write_sel(*this), |
| 15 | m_write_bsy(*this) |
| 16 | { |
| 17 | } |
| 18 | |
| 19 | void nscsi_callback_device::device_start() |
| 20 | { |
| 21 | // resolve callbacks |
| 22 | m_write_rst.resolve_safe(); |
| 23 | m_write_atn.resolve_safe(); |
| 24 | m_write_ack.resolve_safe(); |
| 25 | m_write_req.resolve_safe(); |
| 26 | m_write_msg.resolve_safe(); |
| 27 | m_write_io.resolve_safe(); |
| 28 | m_write_cd.resolve_safe(); |
| 29 | m_write_sel.resolve_safe(); |
| 30 | m_write_bsy.resolve_safe(); |
| 31 | |
| 32 | // state saving |
| 33 | save_item(NAME(m_ctrl)); |
| 34 | } |
| 35 | |
| 36 | void nscsi_callback_device::device_reset() |
| 37 | { |
| 38 | scsi_bus->ctrl_w(scsi_refid, 0, S_ALL); |
| 39 | scsi_bus->ctrl_wait(scsi_refid, S_ALL, S_ALL); |
| 40 | } |
| 41 | |
| 42 | void nscsi_callback_device::scsi_ctrl_changed() |
| 43 | { |
| 44 | m_ctrl = scsi_bus->ctrl_r(); |
| 45 | |
| 46 | m_write_rst((m_ctrl & S_RST) ? 1 : 0); |
| 47 | m_write_atn((m_ctrl & S_ATN) ? 1 : 0); |
| 48 | m_write_ack((m_ctrl & S_ACK) ? 1 : 0); |
| 49 | m_write_req((m_ctrl & S_REQ) ? 1 : 0); |
| 50 | m_write_msg((m_ctrl & S_MSG) ? 1 : 0); |
| 51 | m_write_io((m_ctrl & S_INP) ? 1 : 0); |
| 52 | m_write_cd((m_ctrl & S_CTL) ? 1 : 0); |
| 53 | m_write_sel((m_ctrl & S_SEL) ? 1 : 0); |
| 54 | m_write_bsy((m_ctrl & S_BSY) ? 1 : 0); |
| 55 | } |
trunk/src/emu/machine/nscsi_cb.h
| r0 | r26159 | |
| 1 | #ifndef NSCSI_CB_H |
| 2 | #define NSCSI_CB_H |
| 3 | |
| 4 | #include "emu.h" |
| 5 | #include "machine/nscsi_bus.h" |
| 6 | |
| 7 | #define MCFG_NSCSICB_RST_HANDLER(_line) \ |
| 8 | downcast<nscsi_callback_device *>(device)->set_rst_callback(DEVCB2_##_line); |
| 9 | |
| 10 | #define MCFG_NSCSICB_ATN_HANDLER(_line) \ |
| 11 | downcast<nscsi_callback_device *>(device)->set_atn_callback(DEVCB2_##_line); |
| 12 | |
| 13 | #define MCFG_NSCSICB_ACK_HANDLER(_line) \ |
| 14 | downcast<nscsi_callback_device *>(device)->set_ack_callback(DEVCB2_##_line); |
| 15 | |
| 16 | #define MCFG_NSCSICB_REQ_HANDLER(_line) \ |
| 17 | downcast<nscsi_callback_device *>(device)->set_req_callback(DEVCB2_##_line); |
| 18 | |
| 19 | #define MCFG_NSCSICB_MSG_HANDLER(_line) \ |
| 20 | downcast<nscsi_callback_device *>(device)->set_msg_callback(DEVCB2_##_line); |
| 21 | |
| 22 | #define MCFG_NSCSICB_IO_HANDLER(_line) \ |
| 23 | downcast<nscsi_callback_device *>(device)->set_io_callback(DEVCB2_##_line); |
| 24 | |
| 25 | #define MCFG_NSCSICB_CD_HANDLER(_line) \ |
| 26 | downcast<nscsi_callback_device *>(device)->set_cd_callback(DEVCB2_##_line); |
| 27 | |
| 28 | #define MCFG_NSCSICB_SEL_HANDLER(_line) \ |
| 29 | downcast<nscsi_callback_device *>(device)->set_sel_callback(DEVCB2_##_line); |
| 30 | |
| 31 | #define MCFG_NSCSICB_BSY_HANDLER(_line) \ |
| 32 | downcast<nscsi_callback_device *>(device)->set_bsy_callback(DEVCB2_##_line); |
| 33 | |
| 34 | class nscsi_callback_device : public nscsi_device |
| 35 | { |
| 36 | public: |
| 37 | nscsi_callback_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 38 | |
| 39 | template<class _line> void set_rst_callback(_line line) { m_write_rst.set_callback(line); } |
| 40 | template<class _line> void set_atn_callback(_line line) { m_write_atn.set_callback(line); } |
| 41 | template<class _line> void set_ack_callback(_line line) { m_write_ack.set_callback(line); } |
| 42 | template<class _line> void set_req_callback(_line line) { m_write_req.set_callback(line); } |
| 43 | template<class _line> void set_msg_callback(_line line) { m_write_msg.set_callback(line); } |
| 44 | template<class _line> void set_io_callback(_line line) { m_write_io.set_callback(line); } |
| 45 | template<class _line> void set_cd_callback(_line line) { m_write_cd.set_callback(line); } |
| 46 | template<class _line> void set_sel_callback(_line line) { m_write_sel.set_callback(line); } |
| 47 | template<class _line> void set_bsy_callback(_line line) { m_write_bsy.set_callback(line); } |
| 48 | |
| 49 | virtual void scsi_ctrl_changed(); |
| 50 | |
| 51 | UINT8 read() { return scsi_bus->data_r(); } |
| 52 | DECLARE_READ8_MEMBER( read ) { return read(); } |
| 53 | void write(UINT8 data) { scsi_bus->data_w(scsi_refid, data); } |
| 54 | DECLARE_WRITE8_MEMBER( write ) { write(data); } |
| 55 | |
| 56 | DECLARE_READ_LINE_MEMBER( rst_r ) { return (m_ctrl & S_RST) ? 1 : 0; } |
| 57 | DECLARE_READ_LINE_MEMBER( atn_r ) { return (m_ctrl & S_ATN) ? 1 : 0; } |
| 58 | DECLARE_READ_LINE_MEMBER( ack_r ) { return (m_ctrl & S_ACK) ? 1 : 0; } |
| 59 | DECLARE_READ_LINE_MEMBER( req_r ) { return (m_ctrl & S_REQ) ? 1 : 0; } |
| 60 | DECLARE_READ_LINE_MEMBER( msg_r ) { return (m_ctrl & S_MSG) ? 1 : 0; } |
| 61 | DECLARE_READ_LINE_MEMBER( io_r ) { return (m_ctrl & S_INP) ? 1 : 0; } |
| 62 | DECLARE_READ_LINE_MEMBER( cd_r ) { return (m_ctrl & S_CTL) ? 1 : 0; } |
| 63 | DECLARE_READ_LINE_MEMBER( sel_r ) { return (m_ctrl & S_SEL) ? 1 : 0; } |
| 64 | DECLARE_READ_LINE_MEMBER( bsy_r ) { return (m_ctrl & S_BSY) ? 1 : 0; } |
| 65 | |
| 66 | DECLARE_WRITE_LINE_MEMBER( rst_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_RST : 0, S_RST); } |
| 67 | DECLARE_WRITE_LINE_MEMBER( atn_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_ATN : 0, S_ATN); } |
| 68 | DECLARE_WRITE_LINE_MEMBER( ack_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_ACK : 0, S_ACK); } |
| 69 | DECLARE_WRITE_LINE_MEMBER( req_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_REQ : 0, S_REQ); } |
| 70 | DECLARE_WRITE_LINE_MEMBER( msg_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_MSG : 0, S_MSG); } |
| 71 | DECLARE_WRITE_LINE_MEMBER( io_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_INP : 0, S_INP); } |
| 72 | DECLARE_WRITE_LINE_MEMBER( cd_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_CTL : 0, S_CTL); } |
| 73 | DECLARE_WRITE_LINE_MEMBER( sel_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_SEL : 0, S_SEL); } |
| 74 | DECLARE_WRITE_LINE_MEMBER( bsy_w ) { scsi_bus->ctrl_w(scsi_refid, state ? S_BSY : 0, S_BSY); } |
| 75 | |
| 76 | protected: |
| 77 | virtual void device_start(); |
| 78 | virtual void device_reset(); |
| 79 | |
| 80 | devcb2_write_line m_write_rst; |
| 81 | devcb2_write_line m_write_atn; |
| 82 | devcb2_write_line m_write_ack; |
| 83 | devcb2_write_line m_write_req; |
| 84 | devcb2_write_line m_write_msg; |
| 85 | devcb2_write_line m_write_io; |
| 86 | devcb2_write_line m_write_cd; |
| 87 | devcb2_write_line m_write_sel; |
| 88 | devcb2_write_line m_write_bsy; |
| 89 | |
| 90 | UINT32 m_ctrl; |
| 91 | }; |
| 92 | |
| 93 | extern const device_type NSCSI_CB; |
| 94 | |
| 95 | #endif |
trunk/src/emu/machine/nscsi_hd.h
| r26158 | r26159 | |
| 8 | 8 | { |
| 9 | 9 | public: |
| 10 | 10 | nscsi_harddisk_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 11 | nscsi_harddisk_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); |
| 11 | 12 | |
| 12 | 13 | virtual machine_config_constructor device_mconfig_additions() const; |
| 13 | 14 | |
| 14 | 15 | static struct harddisk_interface hd_intf; |
| 16 | |
| 15 | 17 | protected: |
| 16 | 18 | virtual void device_start(); |
| 17 | 19 | virtual void device_reset(); |
| r26158 | r26159 | |
| 20 | 22 | virtual UINT8 scsi_get_data(int id, int pos); |
| 21 | 23 | virtual void scsi_put_data(int buf, int offset, UINT8 data); |
| 22 | 24 | |
| 23 | | private: |
| 24 | 25 | UINT8 block[512]; |
| 25 | 26 | hard_disk_file *harddisk; |
| 26 | 27 | int lba, cur_lba, blocks; |
trunk/src/emu/machine/machine.mak
| r26158 | r26159 | |
| 1022 | 1022 | #------------------------------------------------- |
| 1023 | 1023 | # |
| 1024 | 1024 | #@src/emu/machine/nscsi_bus.h,MACHINES += NSCSI |
| 1025 | #@src/emu/machine/nscsi_cb.h,MACHINES += NSCSI |
| 1025 | 1026 | #@src/emu/machine/nscsi_cd.h,MACHINES += NSCSI |
| 1026 | 1027 | #@src/emu/machine/nscsi_hd.h,MACHINES += NSCSI |
| 1028 | #@src/emu/machine/nscsi_s1410.h,MACHINES += NSCSI |
| 1027 | 1029 | #------------------------------------------------- |
| 1028 | 1030 | |
| 1029 | 1031 | ifneq ($(filter NSCSI,$(MACHINES)),) |
| 1030 | 1032 | MACHINEOBJS += $(MACHINEOBJ)/nscsi_bus.o |
| 1033 | MACHINEOBJS += $(MACHINEOBJ)/nscsi_cb.o |
| 1031 | 1034 | MACHINEOBJS += $(MACHINEOBJ)/nscsi_cd.o |
| 1032 | 1035 | MACHINEOBJS += $(MACHINEOBJ)/nscsi_hd.o |
| 1036 | MACHINEOBJS += $(MACHINEOBJ)/nscsi_s1410.o |
| 1033 | 1037 | endif |
| 1034 | 1038 | |
| 1035 | 1039 | #------------------------------------------------- |
trunk/src/emu/machine/nscsi_s1410.c
| r0 | r26159 | |
| 1 | #include "machine/nscsi_s1410.h" |
| 2 | |
| 3 | const device_type NSCSI_S1410 = &device_creator<nscsi_s1410_device>; |
| 4 | |
| 5 | nscsi_s1410_device::nscsi_s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : |
| 6 | nscsi_harddisk_device(mconfig, NSCSI_S1410, "S1410", tag, owner, clock, "scsi_s1410", __FILE__) |
| 7 | { |
| 8 | } |
| 9 | |
| 10 | void nscsi_s1410_device::device_reset() |
| 11 | { |
| 12 | nscsi_harddisk_device::device_reset(); |
| 13 | |
| 14 | // initialize drive characteristics |
| 15 | params[0] = 0; |
| 16 | params[1] = 153; |
| 17 | params[2] = 4; |
| 18 | params[3] = 0; |
| 19 | params[4] = 128; |
| 20 | params[5] = 0; |
| 21 | params[6] = 64; |
| 22 | params[7] = 11; |
| 23 | } |
| 24 | |
| 25 | void nscsi_s1410_device::scsi_command() |
| 26 | { |
| 27 | switch(scsi_cmdbuf[0]) { |
| 28 | case SC_TEST_UNIT_READY: |
| 29 | case SC_REZERO: |
| 30 | case SC_REQUEST_SENSE: |
| 31 | case SC_REASSIGN_BLOCKS: |
| 32 | case SC_READ: |
| 33 | case SC_WRITE: |
| 34 | case SC_SEEK: |
| 35 | if (scsi_cmdbuf[1] >> 5) { |
| 36 | scsi_status_complete(SS_NOT_READY); |
| 37 | } else { |
| 38 | nscsi_harddisk_device::scsi_command(); |
| 39 | } |
| 40 | break; |
| 41 | |
| 42 | case SC_FORMAT_UNIT: |
| 43 | if (scsi_cmdbuf[1] >> 5) { |
| 44 | scsi_status_complete(SS_NOT_READY); |
| 45 | return; |
| 46 | } |
| 47 | |
| 48 | scsi_status_complete(SS_GOOD); |
| 49 | break; |
| 50 | |
| 51 | case SC_FORMAT_TRACK: { |
| 52 | if (scsi_cmdbuf[1] >> 5) { |
| 53 | scsi_status_complete(SS_NOT_READY); |
| 54 | return; |
| 55 | } |
| 56 | |
| 57 | lba = ((scsi_cmdbuf[1] & 0x1f)<<16) | (scsi_cmdbuf[2]<<8) | scsi_cmdbuf[3]; |
| 58 | blocks = (bytes_per_sector == 256) ? 32 : 17; |
| 59 | |
| 60 | int track_length = blocks*bytes_per_sector; |
| 61 | UINT8 data[track_length]; |
| 62 | memset(data, 0xc6, track_length); |
| 63 | |
| 64 | if(!hard_disk_write(harddisk, lba, data)) { |
| 65 | logerror("%s: HD WRITE ERROR !\n", tag()); |
| 66 | scsi_status_complete(SS_FORMAT_ERROR); |
| 67 | } else { |
| 68 | scsi_status_complete(SS_GOOD); |
| 69 | } |
| 70 | } |
| 71 | break; |
| 72 | |
| 73 | case SC_FORMAT_ALT_TRACK: |
| 74 | if (scsi_cmdbuf[1] >> 5) { |
| 75 | scsi_status_complete(SS_NOT_READY); |
| 76 | return; |
| 77 | } |
| 78 | |
| 79 | scsi_data_in(2, 3); |
| 80 | scsi_status_complete(SS_GOOD); |
| 81 | break; |
| 82 | |
| 83 | case SC_INIT_DRIVE_PARAMS: |
| 84 | scsi_data_in(2, 8); |
| 85 | scsi_status_complete(SS_GOOD); |
| 86 | break; |
| 87 | |
| 88 | case SC_WRITE_SECTOR_BUFFER: |
| 89 | scsi_data_in(2, 512); |
| 90 | scsi_status_complete(SS_GOOD); |
| 91 | break; |
| 92 | |
| 93 | case SC_READ_SECTOR_BUFFER: |
| 94 | scsi_data_out(2, 512); |
| 95 | scsi_status_complete(SS_GOOD); |
| 96 | break; |
| 97 | |
| 98 | case SC_CHECK_TRACK_FORMAT: |
| 99 | if (scsi_cmdbuf[1] >> 5) { |
| 100 | scsi_status_complete(SS_NOT_READY); |
| 101 | return; |
| 102 | } |
| 103 | scsi_status_complete(SS_GOOD); |
| 104 | break; |
| 105 | |
| 106 | case SC_READ_ECC_BURST: |
| 107 | case SC_RAM_DIAG: |
| 108 | case SC_DRIVE_DIAG: |
| 109 | case SC_CONTROLLER_DIAG: |
| 110 | case SC_READ_LONG: |
| 111 | case SC_WRITE_LONG: |
| 112 | scsi_status_complete(SS_GOOD); |
| 113 | break; |
| 114 | |
| 115 | default: |
| 116 | logerror("%s: command %02x ***UNKNOWN***\n", tag(), scsi_cmdbuf[0]); |
| 117 | break; |
| 118 | } |
| 119 | } |
| 120 | |
| 121 | UINT8 nscsi_s1410_device::scsi_get_data(int id, int pos) |
| 122 | { |
| 123 | switch(scsi_cmdbuf[0]) { |
| 124 | case SC_READ_SECTOR_BUFFER: |
| 125 | return block[pos]; |
| 126 | |
| 127 | default: |
| 128 | return nscsi_harddisk_device::scsi_get_data(id, pos); |
| 129 | } |
| 130 | } |
| 131 | |
| 132 | void nscsi_s1410_device::scsi_put_data(int id, int pos, UINT8 data) |
| 133 | { |
| 134 | switch(scsi_cmdbuf[0]) { |
| 135 | case SC_FORMAT_ALT_TRACK: |
| 136 | break; |
| 137 | |
| 138 | case SC_INIT_DRIVE_PARAMS: |
| 139 | params[pos] = data; |
| 140 | break; |
| 141 | |
| 142 | case SC_WRITE_SECTOR_BUFFER: |
| 143 | block[pos] = data; |
| 144 | break; |
| 145 | |
| 146 | default: |
| 147 | return nscsi_harddisk_device::scsi_put_data(id, pos, data); |
| 148 | } |
| 149 | } |
trunk/src/emu/machine/nscsi_s1410.h
| r0 | r26159 | |
| 1 | #ifndef __NSCSI_S1410_H__ |
| 2 | #define __NSCSI_S1410_H__ |
| 3 | |
| 4 | #include "machine/nscsi_bus.h" |
| 5 | #include "machine/nscsi_hd.h" |
| 6 | |
| 7 | class nscsi_s1410_device : public nscsi_harddisk_device |
| 8 | { |
| 9 | public: |
| 10 | nscsi_s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 11 | |
| 12 | protected: |
| 13 | // SCSI status returns |
| 14 | enum { |
| 15 | SS_GOOD = 0x00, |
| 16 | SS_NO_INDEX = 0x01, |
| 17 | SS_NO_SEEK_COMPLETE = 0x02, |
| 18 | SS_WRITE_FAULT = 0x03, |
| 19 | SS_NOT_READY = 0x04, |
| 20 | SS_TK00_NOT_FOUND = 0x06, |
| 21 | SS_SEEK_IN_PROGRESS = 0x08, |
| 22 | SS_ID_FIELD_ERROR = 0x10, |
| 23 | SS_DATA_ERROR = 0x11, |
| 24 | SS_SAM_NOT_FOUND = 0x12, |
| 25 | SS_SECTOR_NOT_FOUND = 0x14, |
| 26 | SS_SEEK_ERROR = 0x15, |
| 27 | SS_ECC = 0x18, |
| 28 | SS_BAD_TRACK = 0x19, |
| 29 | SS_FORMAT_ERROR = 0x1a, |
| 30 | SS_ALT_TRACK = 0x1c, |
| 31 | SS_ALT_TRACK_DEFECT = 0x1d, |
| 32 | SS_ALT_TRACK_NOT_FOUND = 0x1e, |
| 33 | SS_ALT_TRACK_SAME = 0x1f, |
| 34 | SS_RAM_ERROR = 0x30, |
| 35 | SS_ROM_ERROR = 0x31, |
| 36 | SS_ECC_CHECK_FAILURE = 0x32 |
| 37 | }; |
| 38 | |
| 39 | // SCSI commands |
| 40 | enum { |
| 41 | SC_TEST_UNIT_READY = 0x00, |
| 42 | SC_REZERO = 0x01, |
| 43 | SC_REQUEST_SENSE = 0x03, |
| 44 | SC_FORMAT_UNIT = 0x04, |
| 45 | SC_CHECK_TRACK_FORMAT = 0x05, |
| 46 | SC_FORMAT_TRACK = 0x06, |
| 47 | SC_REASSIGN_BLOCKS = 0x07, |
| 48 | SC_READ = 0x08, |
| 49 | SC_WRITE = 0x0a, |
| 50 | SC_SEEK = 0x0b, |
| 51 | SC_INIT_DRIVE_PARAMS = 0x0c, |
| 52 | SC_READ_ECC_BURST = 0x0d, |
| 53 | SC_FORMAT_ALT_TRACK = 0x0e, |
| 54 | SC_WRITE_SECTOR_BUFFER = 0x0f, |
| 55 | SC_READ_SECTOR_BUFFER = 0x10, |
| 56 | SC_RAM_DIAG = 0xe0, |
| 57 | SC_DRIVE_DIAG = 0xe3, |
| 58 | SC_CONTROLLER_DIAG = 0xe4, |
| 59 | SC_READ_LONG = 0xe5, |
| 60 | SC_WRITE_LONG = 0xe6 |
| 61 | }; |
| 62 | |
| 63 | virtual void device_reset(); |
| 64 | |
| 65 | virtual void scsi_command(); |
| 66 | virtual UINT8 scsi_get_data(int id, int pos); |
| 67 | virtual void scsi_put_data(int buf, int offset, UINT8 data); |
| 68 | |
| 69 | UINT8 params[8]; |
| 70 | }; |
| 71 | |
| 72 | extern const device_type NSCSI_S1410; |
| 73 | |
| 74 | #endif |