Previous 199869 Revisions Next

r20628 Thursday 31st January, 2013 at 11:13:03 UTC by Miodrag Milanović
Made IRQ_CALLBACK as members to work and made usage of delegates, with few updated drivers, rest will follow, this require clean build (no whatsnew)
[src/emu]diexec.c diexec.h
[src/mess/drivers]cat.c pc100.c
[src/mess/includes]vector06.h
[src/mess/machine]vector06.c

trunk/src/emu/diexec.c
r20627r20628
7979      m_timed_interrupt_period(attotime::zero),
8080      m_is_octal(false),
8181      m_nextexec(NULL),
82      m_driver_irq(0),
82      m_driver_irq_legacy(0),
8383      m_timedint_timer(NULL),
8484      m_profiler(PROFILER_IDLE),
8585      m_icountptr(NULL),
r20627r20628
263263
264264void device_execute_interface::set_irq_acknowledge_callback(device_irq_acknowledge_callback callback)
265265{
266   m_driver_irq = callback;
266   m_driver_irq_legacy = callback;
267267}
268268
269269
270270//-------------------------------------------------
271//  set_irq_acknowledge_callback - install a driver-specific
272//  callback for IRQ acknowledge
273//-------------------------------------------------
274
275void device_execute_interface::set_irq_acknowledge_callback(device_irq_acknowledge_delegate callback)
276{
277   m_driver_irq = callback;
278   m_driver_irq_legacy = NULL;
279}
280
281//-------------------------------------------------
271282//  suspend - set a suspend reason for this device
272283//-------------------------------------------------
273284
r20627r20628
512523   // bind delegates
513524   m_vblank_interrupt.bind_relative_to(device());
514525   m_timed_interrupt.bind_relative_to(device());
515//  m_driver_irq.bind_relative_to(device());
526   m_driver_irq.bind_relative_to(device());
516527
517528   // fill in the initial states
518529   execute_interface_iterator iter(device().machine().root_device());
r20627r20628
653664   LOG(("static_standard_irq_callback('%s', %d) $%04x\n", device().tag(), irqline, vector));
654665
655666   // if there's a driver callback, run it to get the vector
656   if (m_driver_irq != NULL)
657      vector = (*m_driver_irq)(&device(), irqline);
667   if (m_driver_irq_legacy != NULL)
668      vector = (*m_driver_irq_legacy)(&device(), irqline);
669   else if (!m_driver_irq.isnull())
670      vector = m_driver_irq(device(),irqline);
658671
659672   // notify the debugger
660673   debugger_interrupt_hook(&device(), irqline);
trunk/src/emu/diexec.h
r20627r20628
101101
102102// IRQ callback to be called by device implementations when an IRQ is actually taken
103103#define IRQ_CALLBACK(func)              int func(device_t *device, int irqline)
104#define IRQ_CALLBACK_MEMBER(func)       int func(device_t &device, int irqline)
104105
105106// interrupt generator callback called as a VBLANK or periodic interrupt
106107#define INTERRUPT_GEN(func)             void func(device_t *device)
r20627r20628
141142typedef void (*device_interrupt_func)(device_t *device);
142143
143144// IRQ callback to be called by executing devices when an IRQ is actually taken
144typedef device_delegate<void (device_t &, int)> device_irq_acknowledge_delegate;
145typedef device_delegate<int (device_t &, int)> device_irq_acknowledge_delegate;
145146typedef int (*device_irq_acknowledge_callback)(device_t *device, int irqnum);
146147
147148
r20627r20628
190191   void set_input_line_and_vector(int linenum, int state, int vector) { m_input[linenum].set_state_synced(state, vector); }
191192   int input_state(int linenum) { return m_input[linenum].m_curstate; }
192193   void set_irq_acknowledge_callback(device_irq_acknowledge_callback callback);
194   void set_irq_acknowledge_callback(device_irq_acknowledge_delegate callback);
193195
194196   // suspend/resume
195197   void suspend(UINT32 reason, bool eatcycles);
r20627r20628
292294   device_execute_interface *m_nextexec;               // pointer to the next device to execute, in order
293295
294296   // input states and IRQ callbacks
295   device_irq_acknowledge_callback m_driver_irq;       // driver-specific IRQ callback
297   device_irq_acknowledge_callback m_driver_irq_legacy;// driver-specific IRQ callback
298   device_irq_acknowledge_delegate m_driver_irq;       // driver-specific IRQ callback
296299   device_input            m_input[MAX_INPUT_LINES];   // data about inputs
297300   emu_timer *             m_timedint_timer;           // reference to this device's periodic interrupt timer
298301
trunk/src/mess/machine/vector06.c
r20627r20628
130130
131131}
132132
133static IRQ_CALLBACK( vector06_irq_callback )
133IRQ_CALLBACK_MEMBER(vector06_state::vector06_irq_callback)
134134{
135135   // Interupt is RST 7
136136   return 0xff;
r20627r20628
170170{
171171   address_space &space = machine().device("maincpu")->memory().space(AS_PROGRAM);
172172
173   machine().device("maincpu")->execute().set_irq_acknowledge_callback(vector06_irq_callback);
173   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(vector06_state::vector06_irq_callback),this));
174174   space.install_read_bank (0x0000, 0x7fff, "bank1");
175175   space.install_write_bank(0x0000, 0x7fff, "bank2");
176176   space.install_read_bank (0x8000, 0xffff, "bank3");
trunk/src/mess/includes/vector06.h
r20627r20628
6666   UINT32 screen_update_vector06(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
6767   INTERRUPT_GEN_MEMBER(vector06_interrupt);
6868   TIMER_CALLBACK_MEMBER(reset_check_callback);
69   IRQ_CALLBACK_MEMBER(vector06_irq_callback);
6970};
7071
7172
trunk/src/mess/drivers/cat.c
r20627r20628
205205   TIMER_CALLBACK_MEMBER(keyboard_callback);
206206   TIMER_CALLBACK_MEMBER(counter_6ms_callback);
207207   TIMER_CALLBACK_MEMBER(swyft_reset);
208   IRQ_CALLBACK_MEMBER(cat_int_ack);
208209};
209210
210211// TODO: this init doesn't actually work yet! please fix me!
r20627r20628
681682   m_6ms_counter++;
682683}
683684
684static IRQ_CALLBACK(cat_int_ack)
685IRQ_CALLBACK_MEMBER(cat_state::cat_int_ack)
685686{
686   device->machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1,CLEAR_LINE);
687   machine().device("maincpu")->execute().set_input_line(M68K_IRQ_1,CLEAR_LINE);
687688   return M68K_INT_ACK_AUTOVECTOR;
688689}
689690
r20627r20628
700701
701702MACHINE_RESET_MEMBER(cat_state,cat)
702703{
703   machine().device("maincpu")->execute().set_irq_acknowledge_callback(cat_int_ack);
704   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(cat_state::cat_int_ack),this));
704705   m_6ms_counter = 0;
705706   m_keyboard_timer->adjust(attotime::zero, 0, attotime::from_hz(120));
706707   m_6ms_timer->adjust(attotime::zero, 0, attotime::from_hz((XTAL_19_968MHz/2)/65536));
trunk/src/mess/drivers/pc100.c
r20627r20628
115115   TIMER_DEVICE_CALLBACK_MEMBER(pc100_100hz_irq);
116116   TIMER_DEVICE_CALLBACK_MEMBER(pc100_50hz_irq);
117117   TIMER_DEVICE_CALLBACK_MEMBER(pc100_10hz_irq);
118   IRQ_CALLBACK_MEMBER(pc100_irq_callback);
118119};
119120
120121void pc100_state::video_start()
r20627r20628
399400   DEVCB_DRIVER_MEMBER(pc100_state, crtc_bank_w)
400401};
401402
402static IRQ_CALLBACK(pc100_irq_callback)
403IRQ_CALLBACK_MEMBER(pc100_state::pc100_irq_callback)
403404{
404   return pic8259_acknowledge( device->machine().device( "pic8259" ) );
405   return pic8259_acknowledge( device.machine().device( "pic8259" ) );
405406}
406407
407408WRITE_LINE_MEMBER( pc100_state::pc100_set_int_line )
r20627r20628
419420
420421void pc100_state::machine_start()
421422{
422   machine().device("maincpu")->execute().set_irq_acknowledge_callback(pc100_irq_callback);
423   machine().device("maincpu")->execute().set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(pc100_state::pc100_irq_callback),this));
423424   m_kanji_rom = (UINT16 *)(*machine().root_device().memregion("kanji"));
424425   m_vram = (UINT16 *)(*memregion("vram"));
425426}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team