Previous 199869 Revisions Next

r21785 Sunday 10th March, 2013 at 14:02:22 UTC by Nathan Woods
[COCO] Cleanups/modernization to cartridge slot code (nw)
[src/mess/machine]cococart.c cococart.h

trunk/src/mess/machine/cococart.c
r21784r21785
4343
4444
4545//-------------------------------------------------
46//  cococart_slot_device - destructor
47//-------------------------------------------------
48
49cococart_slot_device::~cococart_slot_device()
50{
51}
52
53
54
55//-------------------------------------------------
5646//  device_start - device-specific startup
5747//-------------------------------------------------
5848
r21784r21785
6050{
6151   for(int i=0; i<TIMER_POOL; i++ )
6252   {
63      m_cart_line.timer[i]        = machine().scheduler().timer_alloc(FUNC(cart_timer_callback), (void *) this);
64      m_nmi_line.timer[i]     = machine().scheduler().timer_alloc(FUNC(nmi_timer_callback), (void *)  this);
65      m_halt_line.timer[i]        = machine().scheduler().timer_alloc(FUNC(halt_timer_callback), (void *) this);
53      m_cart_line.timer[i]   = timer_alloc(TIMER_CART);
54      m_nmi_line.timer[i]     = timer_alloc(TIMER_NMI);
55      m_halt_line.timer[i]    = timer_alloc(TIMER_HALT);
6656   }
6757
6858   m_cart_line.timer_index     = 0;
r21784r21785
123113
124114
125115//-------------------------------------------------
116//  device_timer - handle timer callbacks
117//-------------------------------------------------
118
119void cococart_slot_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
120{
121   switch(id)
122   {
123      case TIMER_CART:
124         set_line("CART", m_cart_line, (cococart_line_value) param);
125         break;
126
127      case TIMER_NMI:
128         set_line("NMI", m_nmi_line, (cococart_line_value) param);
129         break;
130
131      case TIMER_HALT:
132         set_line("HALT", m_halt_line, (cococart_line_value) param);
133         break;
134   }
135}
136
137
138
139//-------------------------------------------------
126140//  coco_cartridge_r
127141//-------------------------------------------------
128142
r21784r21785
178192//  set_line
179193//-------------------------------------------------
180194
181void cococart_slot_device::set_line(const char *line_name, coco_cartridge_line *line, cococart_line_value value)
195void cococart_slot_device::set_line(const char *line_name, coco_cartridge_line &line, cococart_line_value value)
182196{
183   if ((line->value != value) || (value == COCOCART_LINE_VALUE_Q))
197   if ((line.value != value) || (value == COCOCART_LINE_VALUE_Q))
184198   {
185      line->value = value;
199      line.value = value;
186200
187201      if (LOG_LINE)
188202         logerror("[%s]: set_line(): %s <= %s\n", machine().describe_context(), line_name, line_value_string(value));
189203      /* engage in a bit of gymnastics for this odious 'Q' value */
190      switch(line->value)
204      switch(line.value)
191205      {
192206         case COCOCART_LINE_VALUE_CLEAR:
193            line->line = 0x00;
194            line->q_count = 0;
207            line.line = 0x00;
208            line.q_count = 0;
195209            break;
196210
197211         case COCOCART_LINE_VALUE_ASSERT:
198            line->line = 0x01;
199            line->q_count = 0;
212            line.line = 0x01;
213            line.q_count = 0;
200214            break;
201215
202216         case COCOCART_LINE_VALUE_Q:
203            line->line = line->line ? 0x00 : 0x01;
204            if (line->q_count++ < 4)
217            line.line = line.line ? 0x00 : 0x01;
218            if (line.q_count++ < 4)
205219               set_line_timer(line, value);
206220            break;
207221      }
208222
209223      /* invoke the callback, if present */
210      if (!line->callback.isnull())
211         line->callback(line->line);
224      if (!line.callback.isnull())
225         line.callback(line.line);
212226   }
213227}
214228
215229
216230
217231//-------------------------------------------------
218//  TIMER_CALLBACK( cart_timer_callback )
219//-------------------------------------------------
220
221TIMER_CALLBACK( cococart_slot_device::cart_timer_callback )
222{
223   cococart_slot_device *device = (cococart_slot_device *) ptr;
224   device->set_line("CART", &device->m_cart_line, (cococart_line_value) param);
225}
226
227
228
229//-------------------------------------------------
230//  TIMER_CALLBACK( nmi_timer_callback )
231//-------------------------------------------------
232
233TIMER_CALLBACK( cococart_slot_device::nmi_timer_callback )
234{
235   cococart_slot_device *device = (cococart_slot_device *) ptr;
236   device->set_line("NMI", &device->m_nmi_line, (cococart_line_value) param);
237}
238
239
240//-------------------------------------------------
241//  TIMER_CALLBACK( halt_timer_callback )
242//-------------------------------------------------
243
244TIMER_CALLBACK( cococart_slot_device::halt_timer_callback )
245{
246   cococart_slot_device *device = (cococart_slot_device *) ptr;
247   device->set_line("HALT", &device->m_halt_line, (cococart_line_value) param);
248}
249
250
251
252//-------------------------------------------------
253232//  set_line_timer()
254233//-------------------------------------------------
255234
256void cococart_slot_device::set_line_timer(coco_cartridge_line *line, cococart_line_value value)
235void cococart_slot_device::set_line_timer(coco_cartridge_line &line, cococart_line_value value)
257236{
258237   /* calculate delay; delay dependant on cycles per second */
259   attotime delay = (line->delay != 0)
260      ? machine().firstcpu->cycles_to_attotime(line->delay)
238   attotime delay = (line.delay != 0)
239      ? machine().firstcpu->cycles_to_attotime(line.delay)
261240      : attotime::zero;
262241
263   line->timer[line->timer_index]->adjust(delay, (int) value);
264   line->timer_index = (line->timer_index + 1) % TIMER_POOL;
242   line.timer[line.timer_index]->adjust(delay, (int) value);
243   line.timer_index = (line.timer_index + 1) % TIMER_POOL;
265244}
266245
267246
r21784r21785
270249//  twiddle_line_if_q
271250//-------------------------------------------------
272251
273void cococart_slot_device::twiddle_line_if_q(coco_cartridge_line *line)
252void cococart_slot_device::twiddle_line_if_q(coco_cartridge_line &line)
274253{
275   if (line->value == COCOCART_LINE_VALUE_Q)
254   if (line.value == COCOCART_LINE_VALUE_Q)
276255   {
277      line->q_count = 0;
256      line.q_count = 0;
278257      set_line_timer(line, COCOCART_LINE_VALUE_Q);
279258   }
280259}
r21784r21785
288267
289268void cococart_slot_device::twiddle_q_lines()
290269{
291   twiddle_line_if_q(&m_cart_line);
292   twiddle_line_if_q(&m_nmi_line);
293   twiddle_line_if_q(&m_halt_line);
270   twiddle_line_if_q(m_cart_line);
271   twiddle_line_if_q(m_nmi_line);
272   twiddle_line_if_q(m_halt_line);
294273}
295274
296275
r21784r21785
303282   switch (line)
304283   {
305284      case COCOCART_LINE_CART:
306         set_line_timer(&m_cart_line, value);
285         set_line_timer(m_cart_line, value);
307286         break;
308287
309288      case COCOCART_LINE_NMI:
310         set_line_timer(&m_nmi_line, value);
289         set_line_timer(m_nmi_line, value);
311290         break;
312291
313292      case COCOCART_LINE_HALT:
314         set_line_timer(&m_halt_line, value);
293         set_line_timer(m_halt_line, value);
315294         break;
316295
317296      case COCOCART_LINE_SOUND_ENABLE:
318         /* do nothing for now */
297         // do nothing for now
319298         break;
320299   }
321300}
trunk/src/mess/machine/cococart.h
r21784r21785
7676public:
7777   // construction/destruction
7878   cococart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
79   virtual ~cococart_slot_device();
8079
8180   // device-level overrides
8281   virtual void device_start();
8382   virtual void device_config_complete();
83   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
8484
8585   // image-level overrides
8686   virtual bool call_load();
r21784r21785
100100   // slot interface overrides
101101   virtual const char * get_default_card_software(const machine_config &config, emu_options &options);
102102
103   /* reading and writing to $FF40-$FF7F */
103   // reading and writing to $FF40-$FF7F
104104   DECLARE_READ8_MEMBER(read);
105105   DECLARE_WRITE8_MEMBER(write);
106106
107   /* sets a cartridge line */
107   // sets a cartridge line
108108   void cart_set_line(cococart_line line, cococart_line_value value);
109109
110   /* hack to support twiddling the Q line */
110   // hack to support twiddling the Q line
111111   void twiddle_q_lines();
112112
113   /* cart base */
113   // cart base
114114   UINT8* get_cart_base();
115115   void set_cart_base_update(cococart_base_update_delegate update);
116116
117protected:
118   static TIMER_CALLBACK( cart_timer_callback );
119   static TIMER_CALLBACK( nmi_timer_callback );
120   static TIMER_CALLBACK( halt_timer_callback );
117private:
118   enum
119   {
120      TIMER_CART,
121      TIMER_NMI,
122      TIMER_HALT
123   };
121124
122   void set_line(const char *line_name, coco_cartridge_line *line, cococart_line_value value);
123   void set_line_timer(coco_cartridge_line *line, cococart_line_value value);
124   void twiddle_line_if_q(coco_cartridge_line *line);
125
126125   // configuration
127126   coco_cartridge_line         m_cart_line;
128127   coco_cartridge_line         m_nmi_line;
129128   coco_cartridge_line         m_halt_line;
130129
130   // cartridge
131131   device_cococart_interface   *m_cart;
132
133   // methods
134   void set_line(const char *line_name, coco_cartridge_line &line, cococart_line_value value);
135   void set_line_timer(coco_cartridge_line &line, cococart_line_value value);
136   void twiddle_line_if_q(coco_cartridge_line &line);
132137};
133138
134139// device type definition

Previous 199869 Revisions Next


© 1997-2024 The MAME Team