Previous 199869 Revisions Next

r23602 Monday 10th June, 2013 at 17:34:27 UTC by smf
converted to device_timer() (nw)
[src/emu/machine]idectrl.c idectrl.h

trunk/src/emu/machine/idectrl.c
r23601r23602
107107{
108108}
109109
110enum
111{
112   TID_NULL,
113   TID_DELAYED_INTERRUPT,
114   TID_DELAYED_INTERRUPT_BUFFER_READY,
115   TID_RESET_CALLBACK,
116   TID_SECURITY_ERROR_DONE,
117   TID_READ_SECTOR_DONE_CALLBACK,
118   TID_WRITE_SECTOR_DONE_CALLBACK
119};
110120
121void ide_controller_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
122{
123   switch(id)
124   {
125   case TID_DELAYED_INTERRUPT:
126      status &= ~IDE_STATUS_BUSY;
127      set_irq(ASSERT_LINE);
128      break;
111129
112/***************************************************************************
113    DELAYED INTERRUPT HANDLING
114***************************************************************************/
130   case TID_DELAYED_INTERRUPT_BUFFER_READY:
131      status &= ~IDE_STATUS_BUSY;
132      status |= IDE_STATUS_BUFFER_READY;
133      set_irq(ASSERT_LINE);
134      break;
115135
116static TIMER_CALLBACK( delayed_interrupt )
117{
118   ide_controller_device *ide = (ide_controller_device *)ptr;
119   ide->status &= ~IDE_STATUS_BUSY;
120   ide->set_irq(ASSERT_LINE);
121}
136   case TID_RESET_CALLBACK:
137      reset();
138      break;
122139
140   case TID_SECURITY_ERROR_DONE:
141      /* clear error state */
142      status &= ~IDE_STATUS_ERROR;
143      status |= IDE_STATUS_DRIVE_READY;
144      break;
123145
124static TIMER_CALLBACK( delayed_interrupt_buffer_ready )
125{
126   ide_controller_device *ide = (ide_controller_device *)ptr;
127   ide->status &= ~IDE_STATUS_BUSY;
128   ide->status |= IDE_STATUS_BUFFER_READY;
129   ide->set_irq(ASSERT_LINE);
146   case TID_READ_SECTOR_DONE_CALLBACK:
147      read_sector_done();
148      break;
149
150   case TID_WRITE_SECTOR_DONE_CALLBACK:
151      write_sector_done();
152      break;
153   }
130154}
131155
132156
r23601r23602
138162
139163   /* set a timer */
140164   if (buffer_ready)
141      machine().scheduler().timer_set(time, FUNC(delayed_interrupt_buffer_ready), 0, this);
165      timer_set(time, TID_DELAYED_INTERRUPT_BUFFER_READY);
142166   else
143      machine().scheduler().timer_set(time, FUNC(delayed_interrupt), 0, this);
167      timer_set(time, TID_DELAYED_INTERRUPT);
144168}
145169
146170
r23601r23602
173197}
174198
175199
176static TIMER_CALLBACK( reset_callback )
177{
178   reinterpret_cast<device_t *>(ptr)->reset();
179}
180200
181
182
183201/*************************************
184202 *
185203 *  Advance to the next sector
r23601r23602
230248 *
231249 *************************************/
232250
233static TIMER_CALLBACK( security_error_done )
234{
235   ide_controller_device *ide = (ide_controller_device *)ptr;
236
237   /* clear error state */
238   ide->status &= ~IDE_STATUS_ERROR;
239   ide->status |= IDE_STATUS_DRIVE_READY;
240}
241
242251void ide_controller_device::security_error()
243252{
244253   /* set error state */
r23601r23602
246255   status &= ~IDE_STATUS_DRIVE_READY;
247256
248257   /* just set a timer and mark ourselves error */
249   machine().scheduler().timer_set(TIME_SECURITY_ERROR, FUNC(security_error_done), 0, this);
258   timer_set(TIME_SECURITY_ERROR, TID_SECURITY_ERROR_DONE);
250259}
251260
252261
r23601r23602
350359}
351360
352361
353static TIMER_CALLBACK( read_sector_done_callback )
354{
355   ide_controller_device *ide = (ide_controller_device *)ptr;
356
357   ide->read_sector_done();
358}
359
360
361362void ide_controller_device::read_first_sector()
362363{
363364   ide_device_interface *dev = slot[cur_drive]->dev();
r23601r23602
376377         seek_time = TIME_SEEK_MULTISECTOR;
377378
378379      dev->cur_lba = new_lba;
379      machine().scheduler().timer_set(seek_time, FUNC(read_sector_done_callback), 0, this);
380      timer_set(seek_time, TID_READ_SECTOR_DONE_CALLBACK);
380381   }
381382   else
382      machine().scheduler().timer_set(TIME_PER_SECTOR, FUNC(read_sector_done_callback), 0, this);
383      timer_set(TIME_PER_SECTOR, TID_READ_SECTOR_DONE_CALLBACK);
383384}
384385
385386
r23601r23602
395396         read_sector_done();
396397      else
397398         /* just set a timer */
398         machine().scheduler().timer_set(attotime::from_usec(1), FUNC(read_sector_done_callback), 0, this);
399         timer_set(attotime::from_usec(1), TID_READ_SECTOR_DONE_CALLBACK);
399400   }
400401   else
401402      /* just set a timer */
402      machine().scheduler().timer_set(TIME_PER_SECTOR, FUNC(read_sector_done_callback), 0, this);
403      timer_set(TIME_PER_SECTOR, TID_READ_SECTOR_DONE_CALLBACK);
403404}
404405
405406
r23601r23602
410411 *
411412 *************************************/
412413
413static TIMER_CALLBACK( write_sector_done_callback );
414
415414void ide_controller_device::continue_write()
416415{
417416   /* reset the totals */
r23601r23602
431430      else
432431      {
433432         /* set a timer to do the write */
434         machine().scheduler().timer_set(TIME_PER_SECTOR, FUNC(write_sector_done_callback), 0, this);
433         timer_set(TIME_PER_SECTOR, TID_WRITE_SECTOR_DONE_CALLBACK);
435434      }
436435   }
437436   else
438437   {
439438      /* set a timer to do the write */
440      machine().scheduler().timer_set(TIME_PER_SECTOR, FUNC(write_sector_done_callback), 0, this);
439      timer_set(TIME_PER_SECTOR, TID_WRITE_SECTOR_DONE_CALLBACK);
441440   }
442441}
443442
r23601r23602
569568}
570569
571570
572static TIMER_CALLBACK( write_sector_done_callback )
573{
574   ide_controller_device *ide = (ide_controller_device *)ptr;
575   ide->write_sector_done();
576}
577571
578
579
580572/*************************************
581573 *
582574 *  Handle IDE commands
r23601r23602
13301322   slot[1] = owner()->subdevice<ide_slot_device>("drive_1");
13311323
13321324   /* create a timer for timing status */
1333   last_status_timer = machine().scheduler().timer_alloc(FUNC_NULL);
1334   reset_timer = machine().scheduler().timer_alloc(FUNC(reset_callback), this);
1325   last_status_timer = timer_alloc(TID_NULL);
1326   reset_timer = timer_alloc(TID_RESET_CALLBACK);
13351327
13361328   /* register ide states */
13371329   save_item(NAME(adapter_control));
trunk/src/emu/machine/idectrl.h
r23601r23602
112112   // device-level overrides
113113   virtual void device_start();
114114   virtual void device_reset();
115   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
115116
116117   void read_next_sector();
117118   void continue_write();

Previous 199869 Revisions Next


© 1997-2024 The MAME Team