Previous 199869 Revisions Next

r31891 Wednesday 3rd September, 2014 at 16:20:35 UTC by Fabio Priuli
updated pokey to use delegates for its callbacks. nw.
[src/emu/sound]pokey.c pokey.h
[src/mame/drivers]bartop52.c maxaflex.c
[src/mame/includes]atari.h
[src/mame/machine]atari.c
[src/mess/drivers]atari400.c

trunk/src/mame/machine/atari.c
r31890r31891
1818#define VERBOSE_SERIAL  1
1919#define VERBOSE_TIMERS  1
2020
21void atari_interrupt_cb(pokey_device *device, int mask)
21
22POKEY_INTERRUPT_CB_MEMBER(atari_common_state::interrupt_cb)
2223{
2324   if (VERBOSE_POKEY)
2425   {
r31890r31891
4647         logerror("atari interrupt_cb TIMR1\n");
4748   }
4849
49   device->machine().device("maincpu")->execute().set_input_line(0, HOLD_LINE);
50   machine().device("maincpu")->execute().set_input_line(0, HOLD_LINE);
5051}
5152
5253
r31890r31891
8788
8889 **************************************************************/
8990
90POKEY_KEYBOARD_HANDLER(atari_a800_keyboard)
91POKEY_KEYBOARD_CB_MEMBER(atari_common_state::a800_keyboard)
9192{
9293   int ipt;
9394   static const char *const tag[] = {
r31890r31891
101102   {
102103   case pokey_device::POK_KEY_BREAK:
103104      /* special case ... */
104      ret |= ((device->machine().root_device().ioport(tag[0])->read_safe(0) & 0x08) ? 0x02 : 0x00);
105      ret |= ((machine().root_device().ioport(tag[0])->read_safe(0) & 0x08) ? 0x02 : 0x00);
105106      break;
106107   case pokey_device::POK_KEY_CTRL:
107108      /* CTRL */
108      ret |= ((device->machine().root_device().ioport("fake")->read_safe(0) & 0x02) ? 0x02 : 0x00);
109      ret |= ((machine().root_device().ioport("fake")->read_safe(0) & 0x02) ? 0x02 : 0x00);
109110      break;
110111   case pokey_device::POK_KEY_SHIFT:
111112      /* SHIFT */
112      ret |= ((device->machine().root_device().ioport("fake")->read_safe(0) & 0x01) ? 0x02 : 0x00);
113      ret |= ((machine().root_device().ioport("fake")->read_safe(0) & 0x01) ? 0x02 : 0x00);
113114      break;
114115   }
115116
r31890r31891
118119      return ret;
119120
120121   /* decode regular key */
121   ipt = device->machine().root_device().ioport(tag[k543210 >> 3])->read_safe(0);
122   ipt = machine().root_device().ioport(tag[k543210 >> 3])->read_safe(0);
122123
123124   if (ipt & (1 << (k543210 & 0x07)))
124125      ret |= 0x01;
r31890r31891
155156
156157 **************************************************************/
157158
158POKEY_KEYBOARD_HANDLER(atari_a5200_keypads)
159POKEY_KEYBOARD_CB_MEMBER(atari_common_state::a5200_keypads)
159160{
160161   int ipt;
161162   static const char *const tag[] = { "keypad_0", "keypad_1", "keypad_2", "keypad_3" };
r31890r31891
166167   {
167168   case pokey_device::POK_KEY_BREAK:
168169      /* special case ... */
169      ret |= ((device->machine().root_device().ioport(tag[0])->read_safe(0) & 0x01) ? 0x02 : 0x00);
170      ret |= ((machine().root_device().ioport(tag[0])->read_safe(0) & 0x01) ? 0x02 : 0x00);
170171      break;
171172   case pokey_device::POK_KEY_CTRL:
172173   case pokey_device::POK_KEY_SHIFT:
r31890r31891
184185   if (k543210 == 0)
185186      return ret;
186187
187   ipt = device->machine().root_device().ioport(tag[k543210 >> 2])->read_safe(0);
188   ipt = machine().root_device().ioport(tag[k543210 >> 2])->read_safe(0);
188189
189   if (ipt & (1 <<(k543210 & 0x03)))
190   if (ipt & (1 << (k543210 & 0x03)))
190191      ret |= 0x01;
191192
192193   return ret;
trunk/src/mame/includes/atari.h
r31890r31891
3939   DECLARE_READ8_MEMBER ( atari_antic_r );
4040   DECLARE_WRITE8_MEMBER ( atari_antic_w );
4141
42   POKEY_INTERRUPT_CB_MEMBER(interrupt_cb);
43   POKEY_KEYBOARD_CB_MEMBER(a5200_keypads);
44   POKEY_KEYBOARD_CB_MEMBER(a800_keyboard);
45
4246private:
4347   UINT32 tv_artifacts ;
4448   void prio_init();
r31890r31891
5559   inline void LMS(int new_cmd);
5660   void antic_scanline_dma(int param);
5761   void generic_atari_interrupt(int button_count);
58
5962};
6063
61void atari_interrupt_cb(pokey_device *device, int mask);
62POKEY_KEYBOARD_HANDLER(atari_a800_keyboard);
63POKEY_KEYBOARD_HANDLER(atari_a5200_keypads);
64
6564/* video */
6665
6766#define CYCLES_PER_LINE 114     /* total number of cpu cycles per scanline (incl. hblank) */
trunk/src/mame/drivers/maxaflex.c
r31890r31891
457457   MCFG_SPEAKER_STANDARD_MONO("mono")
458458
459459   MCFG_SOUND_ADD("pokey", POKEY, FREQ_17_EXACT)
460   MCFG_POKEY_INTERRUPT_HANDLER(atari_interrupt_cb)
460   MCFG_POKEY_INTERRUPT_CB(atari_common_state, interrupt_cb)
461461   MCFG_POKEY_OUTPUT_RC(RES_K(1), CAP_U(0.0), 5.0)
462462
463463   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
trunk/src/mame/drivers/bartop52.c
r31890r31891
147147   MCFG_POKEY_POT1_R_CB(IOPORT("analog_1"))
148148   MCFG_POKEY_POT2_R_CB(IOPORT("analog_2"))
149149   MCFG_POKEY_POT3_R_CB(IOPORT("analog_3"))
150   MCFG_POKEY_KEYBOARD_HANDLER(atari_a5200_keypads)
151   MCFG_POKEY_INTERRUPT_HANDLER(atari_interrupt_cb)
150   MCFG_POKEY_KEYBOARD_CB(atari_common_state, a5200_keypads)
151   MCFG_POKEY_INTERRUPT_CB(atari_common_state, interrupt_cb)
152152
153153   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
154154
trunk/src/emu/sound/pokey.c
r31890r31891
185185      device_sound_interface(mconfig, *this),
186186      device_execute_interface(mconfig, *this),
187187      device_state_interface(mconfig, *this),
188      m_kbd_r(NULL),
189      m_irq_f(NULL),
190188      m_output_type(LEGACY_LINEAR),
191189      m_icount(0),
192190      m_stream(NULL),
r31890r31891
225223   m_channel[CHAN2].m_INTMask = IRQ_TIMR2;
226224   m_channel[CHAN4].m_INTMask = IRQ_TIMR4;
227225
226   // bind callbacks
227   m_keyboard_r.bind_relative_to(*owner());
228   m_irq_f.bind_relative_to(*owner());
229
228230   /* calculate the A/D times
229231    * In normal, slow mode (SKCTL bit SK_PADDLE is clear) the conversion
230232    * takes N scanlines, where N is the paddle value. A single scanline
r31890r31891
391393   {
392394   case 3:
393395      /* serout_ready_cb */
394      if( m_IRQEN & IRQ_SEROR )
396      if (m_IRQEN & IRQ_SEROR)
395397      {
396398         m_IRQST |= IRQ_SEROR;
397         if( m_irq_f )
398            (m_irq_f)(this, IRQ_SEROR);
399         if (!m_irq_f.isnull())
400            m_irq_f(IRQ_SEROR);
399401      }
400402      break;
401403   case 4:
402404      /* serout_complete */
403      if( m_IRQEN & IRQ_SEROC )
405      if (m_IRQEN & IRQ_SEROC)
404406      {
405407         m_IRQST |= IRQ_SEROC;
406         if( m_irq_f )
407            (m_irq_f)(this, IRQ_SEROC);
408         if (!m_irq_f.isnull())
409            m_irq_f(IRQ_SEROC);
408410      }
409411      break;
410412   case 5:
411413      /* serin_ready */
412      if( m_IRQEN & IRQ_SERIN )
414      if (m_IRQEN & IRQ_SERIN)
413415      {
414         /* set the enabled timer irq status bits */
415416         m_IRQST |= IRQ_SERIN;
416         /* call back an application supplied function to handle the interrupt */
417         if( m_irq_f )
418            (m_irq_f)(this, IRQ_SERIN);
417         if (!m_irq_f.isnull())
418            m_irq_f(IRQ_SERIN);
419419      }
420420      break;
421421   case SYNC_WRITE:
r31890r31891
477477{
478478   if (++m_kbd_cnt > 63)
479479      m_kbd_cnt = 0;
480   if (m_kbd_r) {
481      UINT8 ret = m_kbd_r(this, m_kbd_cnt);
480   if (!m_keyboard_r.isnull())
481   {
482      UINT8 ret = m_keyboard_r(m_kbd_cnt);
483
482484      switch (m_kbd_cnt)
483485      {
484486      case POK_KEY_BREAK:
485487         if (ret & 2)
486488         {
487489            /* check if the break IRQ is enabled */
488            if( m_IRQEN & IRQ_BREAK )
490            if (m_IRQEN & IRQ_BREAK)
489491            {
490               /* set break IRQ status and call back the interrupt handler */
491492               m_IRQST |= IRQ_BREAK;
492               if( m_irq_f )
493                  (*m_irq_f)(this, IRQ_BREAK);
493               if (!m_irq_f.isnull())
494                  m_irq_f(IRQ_BREAK);
494495            }
495496         }
496497         break;
497498      case POK_KEY_SHIFT:
498499         m_kbd_latch = (m_kbd_latch & 0xbf) | ((ret & 2) << 5);
499         if( m_kbd_latch & 0x40 )
500         if (m_kbd_latch & 0x40)
500501            m_SKSTAT |= SK_SHIFT;
501502         else
502503            m_SKSTAT &= ~SK_SHIFT;
r31890r31891
522523            {
523524               m_KBCODE = m_kbd_latch;
524525               m_SKSTAT |= SK_KEYBD;
525               if( m_IRQEN & IRQ_KEYBD )
526               if (m_IRQEN & IRQ_KEYBD)
526527               {
527528                  /* last interrupt not acknowledged ? */
528                  if( m_IRQST & IRQ_KEYBD )
529                  if(m_IRQST & IRQ_KEYBD)
529530                     m_SKSTAT |= SK_KBERR;
530531                  m_IRQST |= IRQ_KEYBD;
531                  if( m_irq_f )
532                     (*m_irq_f)(this, IRQ_KEYBD);
532                  if (!m_irq_f.isnull())
533                     m_irq_f(IRQ_KEYBD);
533534               }
534535               m_kbd_state++;
535536            }
r31890r31891
646647      process_channel(CHAN2);
647648
648649      /* check if some of the requested timer interrupts are enabled */
649      if ((m_IRQST & IRQ_TIMR2) && m_irq_f )
650         (*m_irq_f)(this, IRQ_TIMR2);
650      if ((m_IRQST & IRQ_TIMR2) && !m_irq_f.isnull())
651            m_irq_f(IRQ_TIMR2);
651652   }
652653
653654   if (m_channel[CHAN1].check_borrow())
r31890r31891
659660         m_channel[CHAN1].reset_channel();
660661      process_channel(CHAN1);
661662      /* check if some of the requested timer interrupts are enabled */
662      if ((m_IRQST & IRQ_TIMR1) && m_irq_f )
663         (*m_irq_f)(this, IRQ_TIMR1);
663      if ((m_IRQST & IRQ_TIMR1) && !m_irq_f.isnull())
664         m_irq_f(IRQ_TIMR1);
664665   }
665666
666667   /* do CHAN4 before CHAN3 because CHAN3 may set borrow! */
r31890r31891
676677         m_channel[CHAN2].sample();
677678      else
678679         m_channel[CHAN2].m_filter_sample = 1;
679      if ((m_IRQST & IRQ_TIMR4) && m_irq_f )
680         (*m_irq_f)(this, IRQ_TIMR4);
680      if ((m_IRQST & IRQ_TIMR4) && !m_irq_f.isnull())
681         m_irq_f(IRQ_TIMR4);
681682   }
682683
683684   if (m_channel[CHAN3].check_borrow())
trunk/src/emu/sound/pokey.h
r31890r31891
5858//  CALLBACK HANDLERS
5959//**************************************************************************
6060
61#define POKEY_KEYBOARD_HANDLER(_name) UINT8 _name(pokey_device *device, UINT8 k543210)
62#define POKEY_INTERRUPT_HANDLER(_name) void _name(pokey_device *device, int mask)
61typedef device_delegate<UINT8 (UINT8 k543210)> pokey_kb_cb_delegate;
62typedef device_delegate<void (int mask)> pokey_int_cb_delegate;
6363
64#define POKEY_KEYBOARD_CB_MEMBER(_name) UINT8 _name(UINT8 k543210)
65#define POKEY_INTERRUPT_CB_MEMBER(_name) void _name(int mask)
6466
67
6568//**************************************************************************
6669//  INTERFACE CONFIGURATION MACROS
6770//**************************************************************************
r31890r31891
101104
102105/* k543210 = k5 ... k0 returns bit0: kr1, bit1: kr2 */
103106/* all are, in contrast to actual hardware, ACTIVE_HIGH */
104#define MCFG_POKEY_KEYBOARD_HANDLER(_kbd) \
105   (downcast<pokey_device *>(device))->m_kbd_r = _kbd;
107#define MCFG_POKEY_KEYBOARD_CB(_class, _method) \
108   pokey_device::set_keyboard_callback(*device, pokey_kb_cb_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
106109
107#define MCFG_POKEY_INTERRUPT_HANDLER(_irqf) \
108   (downcast<pokey_device *>(device))->m_irq_f = _irqf;
110#define MCFG_POKEY_INTERRUPT_CB(_class, _method) \
111   pokey_device::set_interrupt_callback(*device, pokey_int_cb_delegate(&_class::_method, #_class "::" #_method, downcast<_class *>(owner)));
109112
113
110114#define MCFG_POKEY_OUTPUT_RC(_R, _C, _V) \
111115   (downcast<pokey_device *>(device))->m_output_type = pokey_device::RC_LOWPASS; \
112116   (downcast<pokey_device *>(device))->m_r_pullup = (_R); \
r31890r31891
221225   template<class _Object> static devcb_base &set_serin_r_callback(device_t &device, _Object object) { return downcast<pokey_device &>(device).m_serin_r_cb.set_callback(object); }
222226   template<class _Object> static devcb_base &set_serout_w_callback(device_t &device, _Object object) { return downcast<pokey_device &>(device).m_serout_w_cb.set_callback(object); }
223227
228   static void set_keyboard_callback(device_t &device, pokey_kb_cb_delegate callback) { downcast<pokey_device &>(device).m_keyboard_r = callback; }
229   static void set_interrupt_callback(device_t &device, pokey_int_cb_delegate callback) { downcast<pokey_device &>(device).m_irq_f = callback; }
230
224231   DECLARE_READ8_MEMBER( read );
225232   DECLARE_WRITE8_MEMBER( write );
226233
r31890r31891
229236
230237   void serin_ready(int after);
231238
232   // internal configuration
233
234   POKEY_KEYBOARD_HANDLER((*m_kbd_r));
235   POKEY_INTERRUPT_HANDLER((*m_irq_f));
236
237239   // analog output configuration
238240
239241   output_type  m_output_type;
r31890r31891
346348   devcb_read8 m_serin_r_cb;
347349   devcb_write8 m_serout_w_cb;
348350
351   pokey_kb_cb_delegate m_keyboard_r;
352   pokey_int_cb_delegate m_irq_f;
353
349354   UINT8 m_POTx[8];        /* POTx   (R/D200-D207) */
350355   UINT8 m_AUDCTL;         /* AUDCTL (W/D208) */
351356   UINT8 m_ALLPOT;         /* ALLPOT (R/D208) */
trunk/src/mess/drivers/atari400.c
r31890r31891
20282028   MCFG_POKEY_POT7_R_CB(IOPORT("analog_7"))
20292029   MCFG_POKEY_SERIN_R_CB(DEVREAD8("fdc", atari_fdc_device, serin_r))
20302030   MCFG_POKEY_SEROUT_W_CB(DEVWRITE8("fdc", atari_fdc_device, serout_w))
2031   MCFG_POKEY_KEYBOARD_HANDLER(atari_a800_keyboard)
2032   MCFG_POKEY_INTERRUPT_HANDLER(atari_interrupt_cb)
2031   MCFG_POKEY_KEYBOARD_CB(atari_common_state, a800_keyboard)
2032   MCFG_POKEY_INTERRUPT_CB(atari_common_state, interrupt_cb)
20332033
20342034   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
20352035MACHINE_CONFIG_END
r31890r31891
22222222   MCFG_SOUND_MODIFY("pokey")
22232223   MCFG_POKEY_SERIN_R_CB(NULL)
22242224   MCFG_POKEY_SEROUT_W_CB(NULL)
2225   MCFG_POKEY_KEYBOARD_HANDLER(atari_a5200_keypads)
2226   MCFG_POKEY_INTERRUPT_HANDLER(atari_interrupt_cb)
2225   MCFG_POKEY_KEYBOARD_CB(atari_common_state, a5200_keypads)
2226   MCFG_POKEY_INTERRUPT_CB(atari_common_state, interrupt_cb)
22272227
22282228   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
22292229

Previous 199869 Revisions Next


© 1997-2024 The MAME Team