Previous 199869 Revisions Next

r29456 Tuesday 8th April, 2014 at 15:34:44 UTC by Osso
wd2010_device: converted to devcb2 (nw)
[src/emu/bus/isa]p1_hdc.c wdxt_gen.c
[src/emu/machine]wd2010.c wd2010.h

trunk/src/emu/machine/wd2010.c
r29455r29456
9999const device_type WD2010 = &device_creator<wd2010_device>;
100100
101101
102//-------------------------------------------------
103//  device_config_complete - perform any
104//  operations now that the configuration is
105//  complete
106//-------------------------------------------------
107
108void wd2010_device::device_config_complete()
109{
110   // inherit a copy of the static data
111   const wd2010_interface *intf = reinterpret_cast<const wd2010_interface *>(static_config());
112   if (intf != NULL)
113      *static_cast<wd2010_interface *>(this) = *intf;
114
115   // or initialize to defaults if none provided
116   else
117   {
118      memset(&m_out_intrq_cb, 0, sizeof(m_out_intrq_cb));
119      memset(&m_out_bdrq_cb, 0, sizeof(m_out_bdrq_cb));
120      memset(&m_out_bcr_cb, 0, sizeof(m_out_bcr_cb));
121      memset(&m_in_bcs_cb, 0, sizeof(m_in_bcs_cb));
122      memset(&m_out_bcs_cb, 0, sizeof(m_out_bcs_cb));
123      memset(&m_out_dirin_cb, 0, sizeof(m_out_dirin_cb));
124      memset(&m_out_step_cb, 0, sizeof(m_out_step_cb));
125      memset(&m_out_rwc_cb, 0, sizeof(m_out_rwc_cb));
126      memset(&m_in_drdy_cb, 0, sizeof(m_in_drdy_cb));
127      memset(&m_in_index_cb, 0, sizeof(m_in_index_cb));
128      memset(&m_in_wf_cb, 0, sizeof(m_in_wf_cb));
129      memset(&m_in_tk000_cb, 0, sizeof(m_in_tk000_cb));
130      memset(&m_in_sc_cb, 0, sizeof(m_in_sc_cb));
131   }
132}
133
134
135
136102//**************************************************************************
137103//  LIVE DEVICE
138104//**************************************************************************
r29455r29456
143109
144110wd2010_device::wd2010_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
145111   : device_t(mconfig, WD2010, "Western Digital WD2010", tag, owner, clock, "wd2010", __FILE__),
112   m_out_intrq_cb(*this),
113   m_out_bdrq_cb(*this),
114   m_out_bcr_cb(*this),
115   m_in_bcs_cb(*this),
116   m_out_bcs_cb(*this),
117   m_out_dirin_cb(*this),
118   m_out_step_cb(*this),
119   m_out_rwc_cb(*this),
120   m_in_drdy_cb(*this),
121   m_in_index_cb(*this),
122   m_in_wf_cb(*this),
123   m_in_tk000_cb(*this),
124   m_in_sc_cb(*this),
146125   m_status(0),
147126   m_error(0)
148127{
r29455r29456
156135void wd2010_device::device_start()
157136{
158137   // resolve callbacks
159   m_out_intrq_func.resolve(m_out_intrq_cb, *this);
160   m_out_bdrq_func.resolve(m_out_bdrq_cb, *this);
161   m_out_bcr_func.resolve(m_out_bcr_cb, *this);
162   m_in_bcs_func.resolve(m_in_bcs_cb, *this);
163   m_out_bcs_func.resolve(m_out_bcs_cb, *this);
164   m_out_dirin_func.resolve(m_out_dirin_cb, *this);
165   m_out_step_func.resolve(m_out_step_cb, *this);
166   m_out_rwc_func.resolve(m_out_rwc_cb, *this);
167   m_in_drdy_func.resolve(m_in_drdy_cb, *this);
168   m_in_index_func.resolve(m_in_index_cb, *this);
169   m_in_wf_func.resolve(m_in_wf_cb, *this);
170   m_in_tk000_func.resolve(m_in_tk000_cb, *this);
171   m_in_sc_func.resolve(m_in_sc_cb, *this);
138   m_out_intrq_cb.resolve_safe();
139   m_out_bdrq_cb.resolve_safe();
140   m_out_bcr_cb.resolve_safe();
141   m_in_bcs_cb.resolve_safe(0);
142   m_out_bcs_cb.resolve_safe();
143   m_out_dirin_cb.resolve_safe();
144   m_out_step_cb.resolve_safe();
145   m_out_rwc_cb.resolve_safe();
146   m_in_drdy_cb.resolve_safe(0);
147   m_in_index_cb.resolve_safe(0);
148   m_in_wf_cb.resolve_safe(0);
149   m_in_tk000_cb.resolve_safe(0);
150   m_in_sc_cb.resolve_safe(0);
172151}
173152
174153
r29455r29456
196175      break;
197176
198177   case TASK_FILE_STATUS:
199      m_out_intrq_func(CLEAR_LINE);
178      m_out_intrq_cb(CLEAR_LINE);
200179      data = m_status | STATUS_RDY | STATUS_SC;
201180      break;
202181
r29455r29456
324303void wd2010_device::restore(UINT8 data)
325304{
326305   // reset INTRQ, errors, set BUSY, CIP
327   m_out_intrq_func(CLEAR_LINE);
306   m_out_intrq_cb(CLEAR_LINE);
328307   m_error = 0;
329308   m_status = STATUS_BSY | STATUS_CIP;
330309
331310   // reset RWC, set direction=OUT, store step rate
332   m_out_rwc_func(0);
333   m_out_dirin_func(0);
311   m_out_rwc_cb(0);
312   m_out_dirin_cb(0);
334313
335314   int step_pulses = 0;
336315
337316   while (step_pulses < 2048)
338317   {
339      while (!m_in_sc_func())
318      while (!m_in_sc_cb())
340319      {
341320         // drive not ready or write fault?
342         if (!m_in_drdy_func() || m_in_wf_func())
321         if (!m_in_drdy_cb() || m_in_wf_cb())
343322         {
344323            // pulse BCR, set AC, INTRQ, reset BSY, CIP
345            m_out_bcr_func(0);
346            m_out_bcr_func(1);
324            m_out_bcr_cb(0);
325            m_out_bcr_cb(1);
347326            m_error = ERROR_AC;
348            m_status = (m_in_drdy_func() << 6) | (m_in_wf_func() << 5) | STATUS_ERR;
349            m_out_intrq_func(ASSERT_LINE);
327            m_status = (m_in_drdy_cb() << 6) | (m_in_wf_cb() << 5) | STATUS_ERR;
328            m_out_intrq_cb(ASSERT_LINE);
350329            return;
351330         }
352331      }
353332
354      if (m_in_tk000_func())
333      if (m_in_tk000_cb())
355334      {
356335         // pulse BCR, set INTRQ, reset BSY, CIP
357         m_out_bcr_func(0);
358         m_out_bcr_func(1);
336         m_out_bcr_cb(0);
337         m_out_bcr_cb(1);
359338         m_status &= ~(STATUS_BSY | STATUS_CIP);
360         m_out_intrq_func(ASSERT_LINE);
339         m_out_intrq_cb(ASSERT_LINE);
361340         return;
362341      }
363342
r29455r29456
368347         m_status |= STATUS_ERR;
369348
370349         // pulse BCR, set INTRQ, reset BSY, CIP
371         m_out_bcr_func(0);
372         m_out_bcr_func(1);
350         m_out_bcr_cb(0);
351         m_out_bcr_cb(1);
373352         m_status &= ~(STATUS_BSY | STATUS_CIP);
374         m_out_intrq_func(ASSERT_LINE);
353         m_out_intrq_cb(ASSERT_LINE);
375354         return;
376355      }
377356
378357      // issue a step pulse
379      m_out_step_func(1);
380      m_out_step_func(0);
358      m_out_step_cb(1);
359      m_out_step_cb(0);
381360      step_pulses++;
382361   }
383362}
trunk/src/emu/machine/wd2010.h
r29455r29456
2323//  INTERFACE CONFIGURATION MACROS
2424//**************************************************************************
2525
26#define MCFG_WD2010_ADD(_tag, _clock, _config) \
27   MCFG_DEVICE_ADD(_tag, WD2010, _clock) \
28   MCFG_DEVICE_CONFIG(_config)
26#define MCFG_WD2010_OUT_INTRQ_CB(_devcb) \
27   devcb = &wd2010_device::set_out_intrq_callback(*device, DEVCB2_##_devcb);
2928
29#define MCFG_WD2010_OUT_BDRQ_CB(_devcb) \
30   devcb = &wd2010_device::set_out_bdrq_callback(*device, DEVCB2_##_devcb);
3031
31#define WD2010_INTERFACE(_name) \
32   const wd2010_interface (_name) =
32#define MCFG_WD2010_OUT_BCR_CB(_devcb) \
33   devcb = &wd2010_device::set_out_bcr_callback(*device, DEVCB2_##_devcb);
3334
35#define MCFG_WD2010_IN_BCS_CB(_devcb) \
36   devcb = &wd2010_device::set_in_bcs_callback(*device, DEVCB2_##_devcb);
3437
38#define MCFG_WD2010_OUT_BCS_CB(_devcb) \
39   devcb = &wd2010_device::set_out_bcs_callback(*device, DEVCB2_##_devcb);
3540
41#define MCFG_WD2010_OUT_DIRIN_CB(_devcb) \
42   devcb = &wd2010_device::set_out_dirin_callback(*device, DEVCB2_##_devcb);
43
44#define MCFG_WD2010_OUT_STEP_CB(_devcb) \
45   devcb = &wd2010_device::set_out_step_callback(*device, DEVCB2_##_devcb);
46
47#define MCFG_WD2010_OUT_RWC_CB(_devcb) \
48   devcb = &wd2010_device::set_out_rwc_callback(*device, DEVCB2_##_devcb);
49
50#define MCFG_WD2010_IN_DRDY_CB(_devcb) \
51   devcb = &wd2010_device::set_in_drdy_callback(*device, DEVCB2_##_devcb);
52
53#define MCFG_WD2010_IN_INDEX_CB(_devcb) \
54   devcb = &wd2010_device::set_in_index_callback(*device, DEVCB2_##_devcb);
55
56#define MCFG_WD2010_IN_WF_CB(_devcb) \
57   devcb = &wd2010_device::set_in_wf_callback(*device, DEVCB2_##_devcb);
58
59#define MCFG_WD2010_IN_TK000_CB(_devcb) \
60   devcb = &wd2010_device::set_in_tk000_callback(*device, DEVCB2_##_devcb);
61
62#define MCFG_WD2010_IN_SC_CB(_devcb) \
63   devcb = &wd2010_device::set_in_sc_callback(*device, DEVCB2_##_devcb);
64
3665//**************************************************************************
3766//  TYPE DEFINITIONS
3867//**************************************************************************
3968
40// ======================> wd2010_interface
41
42struct wd2010_interface
43{
44   devcb_write_line    m_out_intrq_cb;
45   devcb_write_line    m_out_bdrq_cb;
46   devcb_write_line    m_out_bcr_cb;
47   devcb_read8         m_in_bcs_cb;
48   devcb_write8        m_out_bcs_cb;
49   devcb_write_line    m_out_dirin_cb;
50   devcb_write_line    m_out_step_cb;
51   devcb_write_line    m_out_rwc_cb;
52   devcb_read_line     m_in_drdy_cb;
53   devcb_read_line     m_in_index_cb;
54   devcb_read_line     m_in_wf_cb;
55   devcb_read_line     m_in_tk000_cb;
56   devcb_read_line     m_in_sc_cb;
57};
58
59
6069// ======================> wd2010_device
6170
62class wd2010_device :   public device_t,
63                  public wd2010_interface
71class wd2010_device :   public device_t
6472{
6573public:
6674   // construction/destruction
6775   wd2010_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
6876
77   template<class _Object> static devcb2_base &set_out_intrq_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_intrq_cb.set_callback(object); }
78   template<class _Object> static devcb2_base &set_out_bdrq_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_bdrq_cb.set_callback(object); }
79   template<class _Object> static devcb2_base &set_out_bcr_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_bcr_cb.set_callback(object); }
80   template<class _Object> static devcb2_base &set_in_bcs_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_bcs_cb.set_callback(object); }
81   template<class _Object> static devcb2_base &set_out_bcs_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_bcs_cb.set_callback(object); }
82   template<class _Object> static devcb2_base &set_out_dirin_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_dirin_cb.set_callback(object); }
83   template<class _Object> static devcb2_base &set_out_step_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_step_cb.set_callback(object); }
84   template<class _Object> static devcb2_base &set_out_rwc_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_out_rwc_cb.set_callback(object); }
85   template<class _Object> static devcb2_base &set_in_drdy_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_drdy_cb.set_callback(object); }
86   template<class _Object> static devcb2_base &set_in_index_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_index_cb.set_callback(object); }
87   template<class _Object> static devcb2_base &set_in_wf_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_wf_cb.set_callback(object); }
88   template<class _Object> static devcb2_base &set_in_tk000_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_tk000_cb.set_callback(object); }
89   template<class _Object> static devcb2_base &set_in_sc_callback(device_t &device, _Object object) { return downcast<wd2010_device &>(device).m_in_sc_cb.set_callback(object); }
90   
6991   DECLARE_READ8_MEMBER( read );
7092   DECLARE_WRITE8_MEMBER( write );
7193
r29455r29456
7395   // device-level overrides
7496   virtual void device_start();
7597   virtual void device_reset();
76   virtual void device_config_complete();
7798
7899private:
79100   void compute_correction(UINT8 data);
r29455r29456
85106   void scan_id(UINT8 data);
86107   void format(UINT8 data);
87108
88   devcb_resolved_write_line   m_out_intrq_func;
89   devcb_resolved_write_line   m_out_bdrq_func;
90   devcb_resolved_write_line   m_out_bcr_func;
91   devcb_resolved_read8        m_in_bcs_func;
92   devcb_resolved_write8       m_out_bcs_func;
93   devcb_resolved_write_line   m_out_dirin_func;
94   devcb_resolved_write_line   m_out_step_func;
95   devcb_resolved_write_line   m_out_rwc_func;
96   devcb_resolved_read_line    m_in_drdy_func;
97   devcb_resolved_read_line    m_in_index_func;
98   devcb_resolved_read_line    m_in_wf_func;
99   devcb_resolved_read_line    m_in_tk000_func;
100   devcb_resolved_read_line    m_in_sc_func;
109   devcb2_write_line    m_out_intrq_cb;
110   devcb2_write_line    m_out_bdrq_cb;
111   devcb2_write_line    m_out_bcr_cb;
112   devcb2_read8         m_in_bcs_cb;
113   devcb2_write8        m_out_bcs_cb;
114   devcb2_write_line    m_out_dirin_cb;
115   devcb2_write_line    m_out_step_cb;
116   devcb2_write_line    m_out_rwc_cb;
117   devcb2_read_line     m_in_drdy_cb;
118   devcb2_read_line     m_in_index_cb;
119   devcb2_read_line     m_in_wf_cb;
120   devcb2_read_line     m_in_tk000_cb;
121   devcb2_read_line     m_in_sc_cb;
101122
102123   UINT8 m_status;
103124   UINT8 m_error;
trunk/src/emu/bus/isa/wdxt_gen.c
r29455r29456
157157
158158
159159//-------------------------------------------------
160//  WD2010_INTERFACE( hdc_intf )
161//-------------------------------------------------
162
163static WD2010_INTERFACE( hdc_intf )
164{
165   DEVCB_NULL,
166   DEVCB_NULL,
167   DEVCB_DEVICE_LINE_MEMBER(WD11C00_17_TAG, wd11c00_17_device, clct_w),
168   DEVCB_DEVICE_MEMBER(WD11C00_17_TAG, wd11c00_17_device, read),
169   DEVCB_DEVICE_MEMBER(WD11C00_17_TAG, wd11c00_17_device, write),
170   DEVCB_NULL,
171   DEVCB_NULL,
172   DEVCB_NULL,
173   DEVCB_LINE_VCC,
174   DEVCB_LINE_VCC,
175   DEVCB_LINE_VCC,
176   DEVCB_LINE_VCC,
177   DEVCB_LINE_VCC
178};
179
180
181//-------------------------------------------------
182160//  MACHINE_DRIVER( wdxt_gen )
183161//-------------------------------------------------
184162
r29455r29456
187165   MCFG_CPU_IO_MAP(wd1015_io)
188166
189167   MCFG_WD11C00_17_ADD(WD11C00_17_TAG, 5000000, host_intf)
190   MCFG_WD2010_ADD(WD2010A_TAG, 5000000, hdc_intf)
168   MCFG_DEVICE_ADD(WD2010A_TAG, WD2010, 5000000)
169   MCFG_WD2010_OUT_BCR_CB(DEVWRITELINE(WD11C00_17_TAG, wd11c00_17_device, clct_w))
170   MCFG_WD2010_IN_BCS_CB(DEVREAD8(WD11C00_17_TAG, wd11c00_17_device, read))
171   MCFG_WD2010_OUT_BCS_CB(DEVWRITE8(WD11C00_17_TAG, wd11c00_17_device, write))
172   MCFG_WD2010_IN_DRDY_CB(VCC)
173   MCFG_WD2010_IN_INDEX_CB(VCC)
174   MCFG_WD2010_IN_WF_CB(VCC)
175   MCFG_WD2010_IN_TK000_CB(VCC)
176   MCFG_WD2010_IN_SC_CB(VCC)
191177
192178   MCFG_HARDDISK_ADD("hard0")
193179   MCFG_HARDDISK_ADD("hard1")
trunk/src/emu/bus/isa/p1_hdc.c
r29455r29456
3737
3838const device_type P1_HDC = &device_creator<p1_hdc_device>;
3939
40static WD2010_INTERFACE( hdc_intf )
41{
42   DEVCB_NULL,
43   DEVCB_NULL,
44   DEVCB_NULL,
45   DEVCB_NULL,
46   DEVCB_NULL,
47   DEVCB_NULL,
48   DEVCB_NULL,
49   DEVCB_NULL,
50   DEVCB_LINE_VCC,
51   DEVCB_LINE_VCC,
52   DEVCB_LINE_VCC,
53   DEVCB_LINE_VCC,
54   DEVCB_LINE_VCC
55};
56
5740static MACHINE_CONFIG_FRAGMENT( hdc_b942 )
58   MCFG_WD2010_ADD(KM1809VG7_TAG, 5000000, hdc_intf) // XXX clock?
59
41   MCFG_DEVICE_ADD(KM1809VG7_TAG, WD2010, 5000000) // XXX clock?
42   MCFG_WD2010_IN_DRDY_CB(VCC)
43   MCFG_WD2010_IN_INDEX_CB(VCC)
44   MCFG_WD2010_IN_WF_CB(VCC)
45   MCFG_WD2010_IN_TK000_CB(VCC)
46   MCFG_WD2010_IN_SC_CB(VCC)
47   
6048   MCFG_HARDDISK_ADD("hard0")
6149   MCFG_HARDDISK_ADD("hard1")
6250MACHINE_CONFIG_END

Previous 199869 Revisions Next


© 1997-2024 The MAME Team