Previous 199869 Revisions Next

r19879 Friday 28th December, 2012 at 05:23:42 UTC by Barry Rodewald
s11, s11a, s11b: Changed main IRQ timing based on schematics.
    Removed YM2151 reset from s11 and s11a, as this is not
    hooked up on background music boards used on these systems.
    Made background board communications two-way.
    Added HC55516 to s11b background music hardware. [Barry Rodewald]
[src/mame/drivers]s11.c s11a.c s11b.c

trunk/src/mame/drivers/s11.c
r19878r19879
2323#include "sound/dac.h"
2424#include "s11.lh"
2525
26// Length of time in cycles between IRQs on the main 6808 CPU
27// This length is determined by the settings of the W14 and W15 jumpers
28// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
29// IRQ length is always 32 cycles
30#define S11_IRQ_CYCLES 0x700
2631
2732class s11_state : public genpin_class
2833{
r19878r19879
6267   DECLARE_WRITE8_MEMBER(pia34_pb_w);
6368   DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
6469   DECLARE_WRITE8_MEMBER(pia40_pa_w);
65   DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
6670   DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
6771   DECLARE_READ8_MEMBER(dips_r);
6872   DECLARE_READ8_MEMBER(switch_r);
r19878r19879
7074   DECLARE_READ_LINE_MEMBER(pias_ca1_r);
7175   DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
7276   DECLARE_READ8_MEMBER(pia28_w7_r);
73   DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
74   DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
7577   DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
7678   DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
7779   DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w);
r19878r19879
8183   DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
8284   DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
8385   DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
84   TIMER_DEVICE_CALLBACK_MEMBER(irq);
86   DECLARE_WRITE_LINE_MEMBER(pia_irq);
8587   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
8688   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
8789   DECLARE_MACHINE_RESET(s11);
8890   DECLARE_DRIVER_INIT(s11);
8991protected:
90
9192   // devices
9293   required_device<cpu_device> m_maincpu;
9394   required_device<cpu_device> m_audiocpu;
r19878r19879
104105   required_device<pia6821_device> m_pia34;
105106   required_device<pia6821_device> m_pia40;
106107   required_device<ym2151_device> m_ym;
108
109   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
107110private:
108111   UINT8 m_sound_data;
109112   UINT8 m_strobe;
r19878r19879
112115   UINT32 m_segment1;
113116   UINT32 m_segment2;
114117   bool m_ca1;
118   emu_timer* m_irq_timer;
119   bool m_irq_active;
120
121   static const device_timer_id TIMER_IRQ = 0;
115122};
116123
117124static ADDRESS_MAP_START( s11_main_map, AS_PROGRAM, 8, s11_state )
r19878r19879
221228   PORT_CONFSETTING( 0x10, "English" )
222229INPUT_PORTS_END
223230
231void s11_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
232{
233   switch(id)
234   {
235   case TIMER_IRQ:
236      if(param == 1)
237      {
238         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
239         m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
240         m_pias->cb1_w(0);
241         m_irq_active = true;
242         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
243         m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3));  // Up/Down
244      }
245      else
246      {
247         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
248         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
249         m_pias->cb1_w(1);
250         m_irq_active = false;
251         m_pia28->ca1_w(1);
252         m_pia28->cb1_w(1);
253      }
254      break;
255   }
256}
257
224258MACHINE_RESET_MEMBER( s11_state, s11 )
225259{
226260   membank("bank0")->set_entry(0);
r19878r19879
241275      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
242276}
243277
278WRITE_LINE_MEMBER( s11_state::pia_irq )
279{
280   if(state == CLEAR_LINE)
281   {
282      // restart IRQ timer
283      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
284      m_irq_active = false;
285   }
286   else
287   {
288      // disable IRQ timer while other IRQs are being handled
289      // (counter is reset every 32 cycles while a PIA IRQ is handled)
290      m_irq_timer->adjust(attotime::zero);
291      m_irq_active = true;
292   }
293}
294
244295WRITE8_MEMBER( s11_state::sol3_w )
245296{
246297
r19878r19879
271322   DEVCB_DRIVER_MEMBER(s11_state, sol2_w),      /* port B out */
272323   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_ca2_w),      /* line CA2 out */
273324   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_cb2_w),      /* line CB2 out */
274   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
275   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
325   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
326   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
276327};
277328
278329WRITE8_MEMBER( s11_state::lamp0_w )
r19878r19879
292343   DEVCB_DRIVER_MEMBER(s11_state, lamp1_w),      /* port B out */
293344   DEVCB_NULL,      /* line CA2 out */
294345   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia24_cb2_w),      /* line CB2 out */
295   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
296   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
346   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
347   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
297348};
298349
299READ_LINE_MEMBER( s11_state::pia28_ca1_r )
300{
301   return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
302}
303
304READ_LINE_MEMBER( s11_state::pia28_cb1_r )
305{
306   return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
307}
308
309350WRITE8_MEMBER( s11_state::dig0_w )
310351{
311352   static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447
r19878r19879
345386{
346387   DEVCB_DRIVER_MEMBER(s11_state, pia28_w7_r),      /* port A in */
347388   DEVCB_NULL,      /* port B in */
348   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca1_r),      /* line CA1 in */
349   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb1_r),      /* line CB1 in */
389   DEVCB_NULL,      /* line CA1 in */
390   DEVCB_NULL,      /* line CB1 in */
350391   DEVCB_NULL,      /* line CA2 in */
351392   DEVCB_NULL,      /* line CB2 in */
352393   DEVCB_DRIVER_MEMBER(s11_state, dig0_w),      /* port A out */
353394   DEVCB_DRIVER_MEMBER(s11_state, dig1_w),      /* port B out */
354395   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca2_w),      /* line CA2 out */
355396   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb2_w),      /* line CB2 out */
356   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
357   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
397   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
398   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
358399};
359400
360401WRITE8_MEMBER( s11_state::pia2c_pa_w )
r19878r19879
391432   DEVCB_DRIVER_MEMBER(s11_state, pia2c_pb_w),      /* port B out */
392433   DEVCB_NULL,      /* line CA2 out */
393434   DEVCB_NULL,      /* line CB2 out */
394   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
395   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
435   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
436   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
396437};
397438
398439READ8_MEMBER( s11_state::switch_r )
r19878r19879
419460   DEVCB_DRIVER_MEMBER(s11_state, switch_w),      /* port B out */
420461   DEVCB_NULL,      /* line CA2 out */
421462   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia30_cb2_w),      /* line CB2 out */
422   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
423   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
463   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
464   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
424465};
425466
426467WRITE8_MEMBER( s11_state::pia34_pa_w )
r19878r19879
456497   DEVCB_DRIVER_MEMBER(s11_state, pia34_pb_w),      /* port B out */
457498   DEVCB_NULL,      /* line CA2 out */
458499   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia34_cb2_w),      /* line CB2 out */
459   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
460   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
500   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq),      /* IRQA */
501   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq)      /* IRQB */
461502};
462503
463504WRITE8_MEMBER( s11_state::bank_w )
r19878r19879
522563      m_pia40->ca1_w(0);
523564}
524565
525WRITE_LINE_MEMBER( s11_state::pia40_ca2_w)
526{
527   if(state == ASSERT_LINE)
528      m_ym->reset();
529}
530
531566WRITE_LINE_MEMBER( s11_state::pia40_cb2_w)
532567{
533568   m_pia34->cb1_w(state);  // To Widget MCB1 through CPU Data interface
r19878r19879
543578   DEVCB_NULL,      /* line CB2 in */
544579   DEVCB_DRIVER_MEMBER(s11_state, pia40_pa_w),      /* port A out */
545580   DEVCB_DRIVER_MEMBER(s11_state, dac_w),      /* port B out */
546   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_ca2_w),      /* line CA2 out */
581   DEVCB_NULL,      /* line CA2 out */
547582   DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_cb2_w),      /* line CB2 out */
548583   DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE),      /* IRQA */
549584   DEVCB_CPU_INPUT_LINE("bgcpu", INPUT_LINE_NMI)      /* IRQB */
r19878r19879
556591   membank("bank1")->configure_entries(0, 2, &ROM[0x18000], 0x4000);
557592   membank("bank0")->set_entry(0);
558593   membank("bank1")->set_entry(0);
594   m_irq_timer = timer_alloc(TIMER_IRQ);
595   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
596   m_irq_active = false;
559597}
560598
561TIMER_DEVICE_CALLBACK_MEMBER( s11_state::irq)
562{
563   m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
564   m_pias->cb1_w(0);
565}
566
567599static MACHINE_CONFIG_START( s11, s11_state )
568600   /* basic machine hardware */
569601   MCFG_CPU_ADD("maincpu", M6802, 4000000)
570602   MCFG_CPU_PROGRAM_MAP(s11_main_map)
571   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11_state, irq, attotime::from_hz(1000))
572603   MCFG_MACHINE_RESET_OVERRIDE(s11_state, s11)
573604
574605   /* Video */
trunk/src/mame/drivers/s11a.c
r19878r19879
99ToDo:
1010- Doesn't react to the Advance button very well
1111- Some LEDs flicker
12- Diagnostic LED blinks constantly
1312
1413Note: To start a game, certain switches need to be activated.  You must first press and
1514      hold one of the trough switches (usually the left) and the ball shooter switch for
r19878r19879
2827#include "sound/dac.h"
2928#include "s11a.lh"
3029
30// Length of time in cycles between IRQs on the main 6808 CPU
31// This length is determined by the settings of the W14 and W15 jumpers
32// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
33// IRQ length is always 32 cycles
34#define S11_IRQ_CYCLES 0x700
3135
3236class s11a_state : public genpin_class
3337{
r19878r19879
6872   DECLARE_WRITE8_MEMBER(pia34_pb_w);
6973   DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
7074   DECLARE_WRITE8_MEMBER(pia40_pa_w);
71   DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
75   DECLARE_WRITE8_MEMBER(pia40_pb_w);
7276   DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
7377   DECLARE_READ8_MEMBER(dips_r);
7478   DECLARE_READ8_MEMBER(switch_r);
7579   DECLARE_WRITE8_MEMBER(switch_w);
7680   DECLARE_READ_LINE_MEMBER(pias_ca1_r);
7781   DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
78   DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
79   DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
8082   DECLARE_READ8_MEMBER(pia28_w7_r);
8183   DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
8284   DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
r19878r19879
8789   DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
8890   DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
8991   DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
92   DECLARE_WRITE_LINE_MEMBER(pia_irq);
9093   TIMER_DEVICE_CALLBACK_MEMBER(irq);
9194   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
9295   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
r19878r19879
110113   required_device<pia6821_device> m_pia34;
111114   required_device<pia6821_device> m_pia40;
112115   required_device<ym2151_device> m_ym;
116
117   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
113118private:
114119   UINT8 m_sound_data;
115120   UINT8 m_strobe;
r19878r19879
118123   UINT32 m_segment1;
119124   UINT32 m_segment2;
120125   bool m_ca1;
126   emu_timer* m_irq_timer;
127   bool m_irq_active;
128
129   static const device_timer_id TIMER_IRQ = 0;
121130};
122131
123132static ADDRESS_MAP_START( s11a_main_map, AS_PROGRAM, 8, s11a_state )
r19878r19879
222231   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11a_state, audio_nmi, 1)
223232   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s11a_state, main_nmi, 1)
224233   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
225   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9)
234   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE
226235   PORT_CONFNAME( 0x10, 0x10, "Language" )
227236   PORT_CONFSETTING( 0x00, "German" )
228237   PORT_CONFSETTING( 0x10, "English" )
229238INPUT_PORTS_END
230239
240void s11a_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
241{
242   switch(id)
243   {
244   case TIMER_IRQ:
245      if(param == 1)
246      {
247         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
248         m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
249         m_pias->cb1_w(0);
250         m_irq_active = true;
251         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
252         m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3));  // Up/Down
253      }
254      else
255      {
256         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
257         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
258         m_pias->cb1_w(1);
259         m_irq_active = false;
260         m_pia28->ca1_w(1);
261         m_pia28->cb1_w(1);
262      }
263      break;
264   }
265}
266
231267MACHINE_RESET_MEMBER( s11a_state, s11a )
232268{
233269   membank("bank0")->set_entry(0);
r19878r19879
249285      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
250286}
251287
288WRITE_LINE_MEMBER( s11a_state::pia_irq )
289{
290   if(state == CLEAR_LINE)
291   {
292      // restart IRQ timer
293      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
294      m_irq_active = false;
295   }
296   else
297   {
298      // disable IRQ timer while other IRQs are being handled
299      // (counter is reset every 32 cycles while a PIA IRQ is handled)
300      m_irq_timer->adjust(attotime::zero);
301      m_irq_active = true;
302   }
303}
304
252305WRITE8_MEMBER( s11a_state::sol3_w )
253306{
254307
r19878r19879
279332   DEVCB_DRIVER_MEMBER(s11a_state, sol2_w),      /* port B out */
280333   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_ca2_w),      /* line CA2 out */
281334   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_cb2_w),      /* line CB2 out */
282   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
283   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
335   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
336   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
284337};
285338
286339WRITE8_MEMBER( s11a_state::lamp0_w )
r19878r19879
300353   DEVCB_DRIVER_MEMBER(s11a_state, lamp1_w),      /* port B out */
301354   DEVCB_NULL,      /* line CA2 out */
302355   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia24_cb2_w),      /* line CB2 out */
303   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
304   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
356   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
357   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
305358};
306359
307READ_LINE_MEMBER( s11a_state::pia28_ca1_r )
308{
309   return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
310}
311
312READ_LINE_MEMBER( s11a_state::pia28_cb1_r )
313{
314   return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
315}
316
317360WRITE8_MEMBER( s11a_state::dig0_w )
318361{
319362   data &= 0x7f;
r19878r19879
354397{
355398   DEVCB_DRIVER_MEMBER(s11a_state, pia28_w7_r),      /* port A in */
356399   DEVCB_NULL,      /* port B in */
357   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca1_r),      /* line CA1 in */
358   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb1_r),      /* line CB1 in */
400   DEVCB_NULL,      /* line CA1 in */
401   DEVCB_NULL,      /* line CB1 in */
359402   DEVCB_NULL,      /* line CA2 in */
360403   DEVCB_NULL,      /* line CB2 in */
361404   DEVCB_DRIVER_MEMBER(s11a_state, dig0_w),      /* port A out */
362405   DEVCB_DRIVER_MEMBER(s11a_state, dig1_w),      /* port B out */
363406   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca2_w),      /* line CA2 out */
364407   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb2_w),      /* line CB2 out */
365   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
366   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
408   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
409   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
367410};
368411
369412WRITE8_MEMBER( s11a_state::pia2c_pa_w )
r19878r19879
400443   DEVCB_DRIVER_MEMBER(s11a_state, pia2c_pb_w),      /* port B out */
401444   DEVCB_NULL,      /* line CA2 out */
402445   DEVCB_NULL,      /* line CB2 out */
403   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
404   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
446   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
447   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
405448};
406449
407450READ8_MEMBER( s11a_state::switch_r )
r19878r19879
428471   DEVCB_DRIVER_MEMBER(s11a_state, switch_w),      /* port B out */
429472   DEVCB_NULL,      /* line CA2 out */
430473   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia30_cb2_w),      /* line CB2 out */
431   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
432   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
474   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
475   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
433476};
434477
435478WRITE8_MEMBER( s11a_state::pia34_pa_w )
r19878r19879
465508   DEVCB_DRIVER_MEMBER(s11a_state, pia34_pb_w),      /* port B out */
466509   DEVCB_NULL,      /* line CA2 out */
467510   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia34_cb2_w),      /* line CB2 out */
468   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
469   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
511   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq),      /* IRQA */
512   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq)      /* IRQB */
470513};
471514
472515WRITE8_MEMBER( s11a_state::bank_w )
r19878r19879
507550   m_dac->write_unsigned8(data);
508551}
509552
510WRITE_LINE_MEMBER( s11a_state::pia40_ca2_w)
511{
512   if(state == ASSERT_LINE)
513      m_ym->reset();
514}
515
516553WRITE_LINE_MEMBER( s11a_state::pia40_cb2_w)
517554{
518555   m_pia34->cb1_w(state);  // To Widget MCB1 through CPU Data interface
r19878r19879
528565   DEVCB_NULL,      /* line CB2 in */
529566   DEVCB_DRIVER_MEMBER(s11a_state, sound_w),      /* port A out */
530567   DEVCB_DRIVER_MEMBER(s11a_state, dac_w),      /* port B out */
531   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_ca2_w),      /* line CA2 out */
568   DEVCB_NULL,      /* line CA2 out */
532569   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_cb2_w),      /* line CB2 out */
533570   DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE),      /* IRQA */
534571   DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE)      /* IRQB */
r19878r19879
539576   m_dac1->write_unsigned8(data);
540577}
541578
579WRITE8_MEMBER( s11a_state::pia40_pb_w )
580{
581   m_pia34->portb_w(data);
582}
583
542584WRITE_LINE_MEMBER( s11a_state::ym2151_irq_w)
543585{
544586   if(state == CLEAR_LINE)
r19878r19879
556598   DEVCB_LINE_VCC,      /* line CA2 in */
557599   DEVCB_NULL,      /* line CB2 in */
558600   DEVCB_DRIVER_MEMBER(s11a_state, pia40_pa_w),      /* port A out */
559   DEVCB_DRIVER_MEMBER(s11a_state, dac_w),      /* port B out */
601   DEVCB_DRIVER_MEMBER(s11a_state, pia40_pb_w),      /* port B out */
560602   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_ca2_w),      /* line CA2 out */
561603   DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_cb2_w),      /* line CB2 out */
562604   DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE),      /* IRQA */
r19878r19879
573615   membank("bank0")->set_entry(0);
574616   membank("bank1")->set_entry(0);
575617   membank("bgbank")->set_entry(0);
618   m_irq_timer = timer_alloc(TIMER_IRQ);
619   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
620   m_irq_active = false;
576621}
577622
578TIMER_DEVICE_CALLBACK_MEMBER( s11a_state::irq)
579{
580   m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
581   m_pias->cb1_w(0);
582}
583
584623static MACHINE_CONFIG_START( s11a, s11a_state )
585624   /* basic machine hardware */
586   MCFG_CPU_ADD("maincpu", M6802, 4000000)
625   MCFG_CPU_ADD("maincpu", M6808, 4000000)
587626   MCFG_CPU_PROGRAM_MAP(s11a_main_map)
588   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11a_state, irq, attotime::from_hz(1000))
589627   MCFG_MACHINE_RESET_OVERRIDE(s11a_state, s11a)
590628
591629   /* Video */
r19878r19879
604642   MCFG_NVRAM_ADD_1FILL("nvram")
605643
606644   /* Add the soundcard */
607   MCFG_CPU_ADD("audiocpu", M6808, 3580000)
645   MCFG_CPU_ADD("audiocpu", M6802, 3580000)
608646   MCFG_CPU_PROGRAM_MAP(s11a_audio_map)
609647
610648   MCFG_SPEAKER_STANDARD_MONO("mono")
trunk/src/mame/drivers/s11b.c
r19878r19879
1717#include "sound/dac.h"
1818#include "s11b.lh"
1919
20// Length of time in cycles between IRQs on the main 6808 CPU
21// This length is determined by the settings of the W14 and W15 jumpers
22// It can be 0x300, 0x380, 0x700 or 0x780 cycles long.
23// IRQ length is always 32 cycles
24#define S11_IRQ_CYCLES 0x700
2025
2126class s11b_state : public genpin_class
2227{
r19878r19879
2934   m_dac(*this, "dac"),
3035   m_dac1(*this, "dac1"),
3136   m_hc55516(*this, "hc55516"),
37   m_bg_hc55516(*this, "hc55516_bg"),
3238   m_pias(*this, "pias"),
3339   m_pia21(*this, "pia21"),
3440   m_pia24(*this, "pia24"),
r19878r19879
5157   DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15
5258   DECLARE_WRITE8_MEMBER(sol3_w); // solenoids 0-7
5359   DECLARE_WRITE8_MEMBER(sound_w);
60   DECLARE_WRITE8_MEMBER(bg_speech_clock_w);
61   DECLARE_WRITE8_MEMBER(bg_speech_digit_w);
5462   DECLARE_WRITE8_MEMBER(pia2c_pa_w);
5563   DECLARE_WRITE8_MEMBER(pia2c_pb_w);
5664   DECLARE_WRITE8_MEMBER(pia34_pa_w);
5765   DECLARE_WRITE8_MEMBER(pia34_pb_w);
5866   DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w);
5967   DECLARE_WRITE8_MEMBER(pia40_pa_w);
68   DECLARE_WRITE8_MEMBER(pia40_pb_w);
6069   DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w);
6170   DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w);
6271   DECLARE_READ8_MEMBER(dips_r);
r19878r19879
6473   DECLARE_WRITE8_MEMBER(switch_w);
6574   DECLARE_READ_LINE_MEMBER(pias_ca1_r);
6675   DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
67   DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
68   DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
6976   DECLARE_READ8_MEMBER(pia28_w7_r);
7077   DECLARE_WRITE_LINE_MEMBER(pias_ca2_w);
7178   DECLARE_WRITE_LINE_MEMBER(pias_cb2_w);
r19878r19879
7683   DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
7784   DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up
7885   DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w);
79   TIMER_DEVICE_CALLBACK_MEMBER(irq);
86   DECLARE_WRITE_LINE_MEMBER(pia_irq);
8087   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
8188   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
8289   DECLARE_MACHINE_RESET(s11b);
r19878r19879
9198   required_device<dac_device> m_dac;
9299   required_device<dac_device> m_dac1;
93100   required_device<hc55516_device> m_hc55516;
101   required_device<hc55516_device> m_bg_hc55516;
94102   required_device<pia6821_device> m_pias;
95103   required_device<pia6821_device> m_pia21;
96104   required_device<pia6821_device> m_pia24;
r19878r19879
100108   required_device<pia6821_device> m_pia34;
101109   required_device<pia6821_device> m_pia40;
102110   required_device<ym2151_device> m_ym;
111
112   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
103113private:
104114   UINT8 m_sound_data;
105115   UINT8 m_strobe;
r19878r19879
109119   UINT32 m_segment2;
110120   bool m_ca1;
111121   bool m_invert;  // later System 11B games start expecting inverted data to the display LED segments.
122   emu_timer* m_irq_timer;
123   bool m_irq_active;
124
125   static const device_timer_id TIMER_IRQ = 0;
112126};
113127
114128static ADDRESS_MAP_START( s11b_main_map, AS_PROGRAM, 8, s11b_state )
r19878r19879
132146ADDRESS_MAP_END
133147
134148static ADDRESS_MAP_START( s11b_bg_map, AS_PROGRAM, 8, s11b_state )
135   AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM
149   AM_RANGE(0x0000, 0x07ff) AM_RAM
136150   AM_RANGE(0x2000, 0x2001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("ym2151", ym2151_device, read, write)
137151   AM_RANGE(0x4000, 0x4003) AM_MIRROR(0x1ffc) AM_DEVREADWRITE("pia40", pia6821_device, read, write)
152   AM_RANGE(0x6000, 0x67ff) AM_WRITE(bg_speech_digit_w)
153   AM_RANGE(0x6800, 0x6fff) AM_WRITE(bg_speech_clock_w)
138154   AM_RANGE(0x7800, 0x7fff) AM_WRITE(bgbank_w)
139155   AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bgbank")
140156ADDRESS_MAP_END
r19878r19879
213229   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11b_state, audio_nmi, 1)
214230   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s11b_state, main_nmi, 1)
215231   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
216   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9)
232   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE
217233   PORT_CONFNAME( 0x10, 0x10, "Language" )
218234   PORT_CONFSETTING( 0x00, "German" )
219235   PORT_CONFSETTING( 0x10, "English" )
220236INPUT_PORTS_END
221237
238void s11b_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
239{
240   switch(id)
241   {
242   case TIMER_IRQ:
243      if(param == 1)
244      {
245         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
246         m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0);
247         m_pias->cb1_w(0);
248         m_irq_active = true;
249         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
250         m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3));  // Up/Down
251      }
252      else
253      {
254         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
255         m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
256         m_pias->cb1_w(1);
257         m_irq_active = false;
258         m_pia28->ca1_w(1);
259         m_pia28->cb1_w(1);
260      }
261      break;
262   }
263}
264
222265MACHINE_RESET_MEMBER( s11b_state, s11b )
223266{
224267   membank("bank0")->set_entry(0);
r19878r19879
243286      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
244287}
245288
289WRITE_LINE_MEMBER( s11b_state::pia_irq )
290{
291   if(state == CLEAR_LINE)
292   {
293      // restart IRQ timer
294      m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
295      m_irq_active = false;
296   }
297   else
298   {
299      // disable IRQ timer while other IRQs are being handled
300      // (counter is reset every 32 cycles while a PIA IRQ is handled)
301      m_irq_timer->adjust(attotime::zero);
302      m_irq_active = true;
303   }
304}
305
246306WRITE8_MEMBER( s11b_state::sol3_w )
247307{
248308
r19878r19879
253313   m_sound_data = data;
254314}
255315
316WRITE8_MEMBER( s11b_state::bg_speech_clock_w )
317{
318   hc55516_clock_w(m_bg_hc55516, data);
319   popmessage("BG HC55516 Clock write %02x",data);
320}
321
322WRITE8_MEMBER( s11b_state::bg_speech_digit_w )
323{
324   hc55516_digit_w(m_bg_hc55516, data);
325   popmessage("BG HC55516 Digit write %02x",data);
326}
327
256328WRITE_LINE_MEMBER( s11b_state::pia21_ca2_w )
257329{
258330// sound ns
r19878r19879
273345   DEVCB_DRIVER_MEMBER(s11b_state, sol2_w),      /* port B out */
274346   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_ca2_w),      /* line CA2 out */
275347   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_cb2_w),      /* line CB2 out */
276   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
277   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
348   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),      /* IRQA */
349   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
278350};
279351
280352WRITE8_MEMBER( s11b_state::lamp0_w )
r19878r19879
294366   DEVCB_DRIVER_MEMBER(s11b_state, lamp1_w),      /* port B out */
295367   DEVCB_NULL,      /* line CA2 out */
296368   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia24_cb2_w),      /* line CB2 out */
297   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
298   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
369   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),      /* IRQA */
370   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
299371};
300372
301READ_LINE_MEMBER( s11b_state::pia28_ca1_r )
302{
303   return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button
304}
305
306READ_LINE_MEMBER( s11b_state::pia28_cb1_r )
307{
308   return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch
309}
310
311373WRITE8_MEMBER( s11b_state::dig0_w )
312374{
313375   data &= 0x7f;
314376   m_strobe = data & 15;
315377   m_diag = (data & 0x70) >> 4;
316378   output_set_digit_value(60, 0);  // not connected to PA5 or PA6?
317   output_set_digit_value(61, m_diag & 0x01);  // connected to PA4
379   output_set_digit_value(61, m_diag & 0x01);  // connected to PA4, normal behaviour is to be continually blinking
318380   output_set_digit_value(62, 0);
319381   m_segment1 = 0;
320382   m_segment2 = 0;
r19878r19879
351413{
352414   DEVCB_DRIVER_MEMBER(s11b_state, pia28_w7_r),      /* port A in */
353415   DEVCB_NULL,      /* port B in */
354   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca1_r),      /* line CA1 in */
355   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb1_r),      /* line CB1 in */
416   DEVCB_NULL,      /* line CA1 in */
417   DEVCB_NULL,      /* line CB1 in */
356418   DEVCB_NULL,      /* line CA2 in */
357419   DEVCB_NULL,      /* line CB2 in */
358420   DEVCB_DRIVER_MEMBER(s11b_state, dig0_w),      /* port A out */
359421   DEVCB_DRIVER_MEMBER(s11b_state, dig1_w),      /* port B out */
360422   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca2_w),      /* line CA2 out */
361423   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb2_w),      /* line CB2 out */
362   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
363   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
424   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),      /* IRQA */
425   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
364426};
365427
366428WRITE8_MEMBER( s11b_state::pia2c_pa_w )
r19878r19879
403465   DEVCB_DRIVER_MEMBER(s11b_state, pia2c_pb_w),      /* port B out */
404466   DEVCB_NULL,      /* line CA2 out */
405467   DEVCB_NULL,      /* line CB2 out */
406   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
407   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
468   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),   /* IRQA */
469   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
408470};
409471
410472READ8_MEMBER( s11b_state::switch_r )
r19878r19879
431493   DEVCB_DRIVER_MEMBER(s11b_state, switch_w),      /* port B out */
432494   DEVCB_NULL,      /* line CA2 out */
433495   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia30_cb2_w),      /* line CB2 out */
434   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
435   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
496   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),   /* IRQA */
497   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
436498};
437499
438500WRITE8_MEMBER( s11b_state::pia34_pa_w )
r19878r19879
471533   DEVCB_DRIVER_MEMBER(s11b_state, pia34_pb_w),      /* port B out */
472534   DEVCB_NULL,      /* line CA2 out */
473535   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia34_cb2_w),      /* line CB2 out */
474   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),   /* IRQA */
475   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
536   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq),   /* IRQA */
537   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq)      /* IRQB */
476538};
477539
478540WRITE8_MEMBER( s11b_state::bank_w )
r19878r19879
494556WRITE_LINE_MEMBER( s11b_state::pias_ca2_w )
495557{
496558// speech clock
497   hc55516_clock_w(m_hc55516, state);
559   if(state == CLEAR_LINE)
560      hc55516_clock_w(m_hc55516, 0);
561   else
562      hc55516_clock_w(m_hc55516, 1);
498563}
499564
500565WRITE_LINE_MEMBER( s11b_state::pias_cb2_w )
r19878r19879
534599   m_dac1->write_unsigned8(data);
535600}
536601
602WRITE8_MEMBER( s11b_state::pia40_pb_w )
603{
604   m_pia34->portb_w(data);
605}
606
537607WRITE_LINE_MEMBER( s11b_state::ym2151_irq_w)
538608{
539609   if(state == CLEAR_LINE)
r19878r19879
562632   DEVCB_LINE_VCC,      /* line CA2 in */
563633   DEVCB_NULL,      /* line CB2 in */
564634   DEVCB_DRIVER_MEMBER(s11b_state, pia40_pa_w),      /* port A out */
565   DEVCB_DRIVER_MEMBER(s11b_state, dac_w),      /* port B out */
635   DEVCB_DRIVER_MEMBER(s11b_state, pia40_pb_w),      /* port B out */
566636   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_ca2_w),      /* line CA2 out */
567637   DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_cb2_w),      /* line CB2 out */
568638   DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE),      /* IRQA */
r19878r19879
580650   membank("bank1")->set_entry(0);
581651   membank("bgbank")->set_entry(0);
582652   m_invert = false;
653   m_irq_timer = timer_alloc(TIMER_IRQ);
654   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
655   m_irq_active = false;
583656}
584657
585658DRIVER_INIT_MEMBER( s11b_state, s11b_invert )
r19878r19879
593666   membank("bank1")->set_entry(0);
594667   membank("bgbank")->set_entry(0);
595668   m_invert = true;
669   m_irq_timer = timer_alloc(TIMER_IRQ);
670   m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1);
671   m_irq_active = false;
596672}
597673
598TIMER_DEVICE_CALLBACK_MEMBER( s11b_state::irq)
599{
600   m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE);
601   m_pias->cb1_w(0);
602}
603
604674static MACHINE_CONFIG_START( s11b, s11b_state )
605675   /* basic machine hardware */
606676   MCFG_CPU_ADD("maincpu", M6808, 4000000)
607677   MCFG_CPU_PROGRAM_MAP(s11b_main_map)
608   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11b_state, irq, attotime::from_hz(1000))
609678   MCFG_MACHINE_RESET_OVERRIDE(s11b_state, s11b)
610679
611680   /* Video */
r19878r19879
645714   MCFG_SPEAKER_STANDARD_MONO("bg")
646715   MCFG_YM2151_ADD("ym2151", 3580000)
647716   MCFG_YM2151_IRQ_HANDLER(WRITELINE(s11b_state, ym2151_irq_w))
648   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50)
717   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25)
649718
650719   MCFG_DAC_ADD("dac1")
651720   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50)
652721
722   MCFG_SOUND_ADD("hc55516_bg", HC55516, 0)
723   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50)
724
653725   MCFG_PIA6821_ADD("pia40", pia40_intf)
654726MACHINE_CONFIG_END
655727

Previous 199869 Revisions Next


© 1997-2024 The MAME Team