Previous 199869 Revisions Next

r26159 Thursday 14th November, 2013 at 17:16:05 UTC by Curt Coder
(MESS) Added nscsi versions of the SCSI callback device and Xebec S1410. [Curt Coder]
[src/emu/machine]machine.mak nscsi_cb.c* nscsi_cb.h* nscsi_hd.c nscsi_hd.h nscsi_s1410.c* nscsi_s1410.h*

trunk/src/emu/machine/nscsi_cb.c
r0r26159
1#include "nscsi_cb.h"
2
3const device_type NSCSI_CB = &device_creator<nscsi_callback_device>;
4
5nscsi_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
19void 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
36void 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
42void 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}
Property changes on: trunk/src/emu/machine/nscsi_cb.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/machine/nscsi_cb.h
r0r26159
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
34class nscsi_callback_device : public nscsi_device
35{
36public:
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
76protected:
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
93extern const device_type NSCSI_CB;
94
95#endif
Property changes on: trunk/src/emu/machine/nscsi_cb.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/machine/nscsi_hd.c
r26158r26159
88{
99}
1010
11nscsi_harddisk_device::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) :
12   nscsi_full_device(mconfig, type, name, tag, owner, clock, shortname, source)
13{
14}
15
1116void nscsi_harddisk_device::device_start()
1217{
1318   nscsi_full_device::device_start();
trunk/src/emu/machine/nscsi_hd.h
r26158r26159
88{
99public:
1010   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);
1112
1213   virtual machine_config_constructor device_mconfig_additions() const;
1314
1415   static struct harddisk_interface hd_intf;
16
1517protected:
1618   virtual void device_start();
1719   virtual void device_reset();
r26158r26159
2022   virtual UINT8 scsi_get_data(int id, int pos);
2123   virtual void scsi_put_data(int buf, int offset, UINT8 data);
2224
23private:
2425   UINT8 block[512];
2526   hard_disk_file *harddisk;
2627   int lba, cur_lba, blocks;
trunk/src/emu/machine/machine.mak
r26158r26159
10221022#-------------------------------------------------
10231023#
10241024#@src/emu/machine/nscsi_bus.h,MACHINES += NSCSI
1025#@src/emu/machine/nscsi_cb.h,MACHINES += NSCSI
10251026#@src/emu/machine/nscsi_cd.h,MACHINES += NSCSI
10261027#@src/emu/machine/nscsi_hd.h,MACHINES += NSCSI
1028#@src/emu/machine/nscsi_s1410.h,MACHINES += NSCSI
10271029#-------------------------------------------------
10281030
10291031ifneq ($(filter NSCSI,$(MACHINES)),)
10301032MACHINEOBJS += $(MACHINEOBJ)/nscsi_bus.o
1033MACHINEOBJS += $(MACHINEOBJ)/nscsi_cb.o
10311034MACHINEOBJS += $(MACHINEOBJ)/nscsi_cd.o
10321035MACHINEOBJS += $(MACHINEOBJ)/nscsi_hd.o
1036MACHINEOBJS += $(MACHINEOBJ)/nscsi_s1410.o
10331037endif
10341038
10351039#-------------------------------------------------
trunk/src/emu/machine/nscsi_s1410.c
r0r26159
1#include "machine/nscsi_s1410.h"
2
3const device_type NSCSI_S1410 = &device_creator<nscsi_s1410_device>;
4
5nscsi_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
10void 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
25void 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
121UINT8 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
132void 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}
Property changes on: trunk/src/emu/machine/nscsi_s1410.c
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native
trunk/src/emu/machine/nscsi_s1410.h
r0r26159
1#ifndef __NSCSI_S1410_H__
2#define __NSCSI_S1410_H__
3
4#include "machine/nscsi_bus.h"
5#include "machine/nscsi_hd.h"
6
7class nscsi_s1410_device : public nscsi_harddisk_device
8{
9public:
10   nscsi_s1410_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
11
12protected:
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
72extern const device_type NSCSI_S1410;
73
74#endif
Property changes on: trunk/src/emu/machine/nscsi_s1410.h
Added: svn:mime-type
   + text/plain
Added: svn:eol-style
   + native

Previous 199869 Revisions Next


© 1997-2024 The MAME Team