Previous 199869 Revisions Next

r32525 Saturday 4th October, 2014 at 09:58:55 UTC by Robbbert
s7,9 : fixed diagnostic mode. Sorcerer, Space Shuttle now working.
[src/mame/drivers]s7.c s9.c

trunk/src/mame/drivers/s7.c
r32524r32525
55  PINBALL
66  Williams System 7
77
8Diagnostic actions:
9- You must be in game over mode. All buttons are in the number-pad. When you are
10  finished, you must reboot.
11
12- Setup: 6 must be in auto/up position. Press 5 to enter setup mode, press 6 to
13         change direction.
14
15- Tests: 6 must be in manual/down position. Press 5 twice and tests will begin.
16         Press 5 and 6 together to get from test 1 to test 2. Press 6 to switch
17         between auto/manual stepping.
18
19- Other: see the manual
20
21
822When first started, it shows the game number and stops. Press F3 to initialise the
923nvram. In theory you can then press the diagnostic buttons; or you then enter coins
1024and start playing.
r32524r32525
3751
3852
3953ToDo:
40- Diagnostic buttons do not work
4154- Some games have an additional alphanumeric display; not emulated as yet.
4255
4356
r32524r32525
7083   { }
7184
7285   DECLARE_READ8_MEMBER(dac_r);
73   DECLARE_WRITE8_MEMBER(dac_w);
7486   DECLARE_WRITE8_MEMBER(dig0_w);
7587   DECLARE_WRITE8_MEMBER(dig1_w);
7688   DECLARE_WRITE8_MEMBER(lamp0_w);
r32524r32525
8698   DECLARE_READ8_MEMBER(nvram_r);
8799   DECLARE_WRITE8_MEMBER(nvram_w);
88100   DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
89   DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
90   DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
91101   DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w) { };
92102   DECLARE_WRITE_LINE_MEMBER(pia21_cb2_w) { }; // enable solenoids
93103   DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5
r32524r32525
98108   DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6
99109   DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4
100110   DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3
101   TIMER_DEVICE_CALLBACK_MEMBER(irq);
111   DECLARE_WRITE_LINE_MEMBER(pia_irq);
102112   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
103113   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
104   DECLARE_INPUT_CHANGED_MEMBER(diag_ca1);
105   DECLARE_INPUT_CHANGED_MEMBER(diag_cb1);
106114   DECLARE_INPUT_CHANGED_MEMBER(diag_coin);
107115   DECLARE_MACHINE_RESET(s7);
116   DECLARE_DRIVER_INIT(s7);
108117private:
109   UINT8 m_t_c;
110118   UINT8 m_sound_data;
111119   UINT8 m_strobe;
112120   UINT8 m_kbdrow;
113121   UINT8 m_nvram[0x100];
114122   bool m_data_ok;
115123   bool m_memprotect;
124   emu_timer* m_irq_timer;
125   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
126   static const device_timer_id TIMER_IRQ = 0;
116127   virtual void machine_start();
117128   required_device<cpu_device> m_maincpu;
118129   required_device<cpu_device> m_audiocpu;
r32524r32525
228239   PORT_START("DIAGS")
229240   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_1_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, audio_nmi, 1)
230241   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_4_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, main_nmi, 1)
231   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_5_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, diag_ca1, 0)
232   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_6_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, diag_cb1, 0) PORT_TOGGLE
233   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Coin Door") PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, diag_coin, 1) PORT_TOGGLE
242   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_5_PAD)
243   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_6_PAD) PORT_TOGGLE
244   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_9_PAD)
245   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Coin Door") PORT_CODE(KEYCODE_8_PAD) PORT_CHANGED_MEMBER(DEVICE_SELF, s7_state, diag_coin, 1) PORT_TOGGLE
234246
235   PORT_START("DSW0")
236   PORT_DIPNAME( 0x01, 0x01, "SW01" )
237   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
238   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
239   PORT_DIPNAME( 0x02, 0x02, "SW02" )
240   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
241   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
242   PORT_DIPNAME( 0x04, 0x04, "SW03" )
243   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
244   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
245   PORT_DIPNAME( 0x08, 0x08, "SW04" )
246   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
247   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
248   PORT_DIPNAME( 0x10, 0x10, "SW05" )
249   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
250   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
251   PORT_DIPNAME( 0x20, 0x20, "SW06" )
252   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
253   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
254   PORT_DIPNAME( 0x40, 0x40, "SW07" )
255   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
256   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
257   PORT_DIPNAME( 0x80, 0x80, "SW08" )
258   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
259   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
247   PORT_START("DS1") // DS1 switches exist but do nothing
248   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
260249
261   PORT_START("DSW1")
262   PORT_DIPNAME( 0x01, 0x01, "SW11" )
263   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
264   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
265   PORT_DIPNAME( 0x02, 0x02, "SW12" )
266   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
267   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
268   PORT_DIPNAME( 0x04, 0x04, "SW13" )
269   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
270   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
271   PORT_DIPNAME( 0x08, 0x08, "SW14" )
272   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
273   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
274   PORT_DIPNAME( 0x10, 0x10, "SW15" )
275   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
276   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
277   PORT_DIPNAME( 0x20, 0x20, "SW16" )
278   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
279   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
280   PORT_DIPNAME( 0x40, 0x40, "SW17" )
281   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
282   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
283   PORT_DIPNAME( 0x80, 0x80, "SW18" )
284   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
285   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
250   PORT_START("DS2") // DS2 switches exist but do nothing
251   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
286252INPUT_PORTS_END
287253
288254INPUT_CHANGED_MEMBER( s7_state::main_nmi )
r32524r32525
299265      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
300266}
301267
302INPUT_CHANGED_MEMBER( s7_state::diag_ca1 )
303{
304   m_pia28->ca1_w(oldval); // newval inverted by ic5, so use oldval
305}
306
307INPUT_CHANGED_MEMBER( s7_state::diag_cb1 )
308{
309   m_pia28->cb1_w(oldval); // newval inverted by ic5, so use oldval
310}
311
312268INPUT_CHANGED_MEMBER( s7_state::diag_coin )
313269{
314270   m_memprotect = newval;
r32524r32525
339295
340296WRITE8_MEMBER( s7_state::lamp0_w )
341297{
342   m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE);
343298}
344299
345READ_LINE_MEMBER( s7_state::pia28_ca1_r )
346{
347   return BIT(ioport("DIAGS")->read(), 2); // advance button
348}
349
350READ_LINE_MEMBER( s7_state::pia28_cb1_r )
351{
352   return BIT(ioport("DIAGS")->read(), 3); // up/down switch
353}
354
355300WRITE8_MEMBER( s7_state::dig0_w )
356301{
357302   static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447
358303   m_strobe = data & 15;
304   data ^= 0xf0; // inverted by ic33
359305   m_data_ok = true;
360306   output_set_digit_value(60, patterns[data>>4]); // diag digit
361307}
r32524r32525
378324      switch (m_strobe)
379325      {
380326      case 0:
381         return ioport("DSW0")->read() & 15;
327         return ioport("DS2")->read();
382328      case 1:
383         return ioport("DSW0")->read() << 4;
329         return ioport("DS2")->read() << 4;
384330      case 2:
385         return ioport("DSW1")->read() & 15;
331         return ioport("DS1")->read();
386332      case 3:
387         return ioport("DSW1")->read() << 4;
333         return ioport("DS1")->read() << 4;
388334      }
389335   }
390336   return 0xff;
r32524r32525
420366   return m_sound_data;
421367}
422368
423TIMER_DEVICE_CALLBACK_MEMBER( s7_state::irq )
369WRITE_LINE_MEMBER( s7_state::pia_irq )
424370{
425   if (m_t_c > 0x70)
426      m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE);
371   if(state == CLEAR_LINE)
372   {
373      // restart IRQ timer
374      m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
375   }
427376   else
428      m_t_c++;
377   {
378      // disable IRQ timer while other IRQs are being handled
379      // (counter is reset every 32 cycles while a PIA IRQ is handled)
380      m_irq_timer->adjust(attotime::zero);
381   }
429382}
430383
384void s7_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
385{
386   switch(id)
387   {
388   case TIMER_IRQ:
389      if(param == 1)
390      {
391         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
392         m_irq_timer->adjust(attotime::from_ticks(32,3580000/4),0);
393         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
394         m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3));  // Up/Down
395      }
396      else
397      {
398         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
399         m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
400         m_pia28->ca1_w(1);
401         m_pia28->cb1_w(1);
402      }
403      break;
404   }
405}
406
431407void s7_state::machine_start()
432408{
433409   m_memprotect = 0;
r32524r32525
437413
438414MACHINE_RESET_MEMBER( s7_state, s7 )
439415{
440   m_t_c = 0;
441416}
442417
418DRIVER_INIT_MEMBER( s7_state, s7 )
419{
420   m_irq_timer = timer_alloc(TIMER_IRQ);
421   m_irq_timer->adjust(attotime::from_ticks(980,3580000/4),1);
422}
423
443424static MACHINE_CONFIG_START( s7, s7_state )
444425   /* basic machine hardware */
445426   MCFG_CPU_ADD("maincpu", M6808, 3580000)
446427   MCFG_CPU_PROGRAM_MAP(s7_main_map)
447   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s7_state, irq, attotime::from_hz(250))
448428   MCFG_MACHINE_RESET_OVERRIDE(s7_state, s7)
449429
450430   /* Video */
r32524r32525
461441   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, sol2_w))
462442   MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia21_ca2_w))
463443   MCFG_PIA_CB2_HANDLER(WRITELINE(s7_state, pia21_cb2_w))
464   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
465   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
444   MCFG_PIA_IRQA_HANDLER(WRITELINE(s7_state, pia_irq))
445   MCFG_PIA_IRQB_HANDLER(WRITELINE(s7_state, pia_irq))
466446
467447   MCFG_DEVICE_ADD("pia22", PIA6821, 0)
468448   MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, sol0_w))
469449   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, sol1_w))
470450   MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia22_ca2_w))
471451   MCFG_PIA_CB2_HANDLER(WRITELINE(s7_state, pia22_cb2_w))
472   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
473   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
452   MCFG_PIA_IRQA_HANDLER(WRITELINE(s7_state, pia_irq))
453   MCFG_PIA_IRQB_HANDLER(WRITELINE(s7_state, pia_irq))
474454
475455   MCFG_DEVICE_ADD("pia24", PIA6821, 0)
476456   MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, lamp0_w))
477457   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, lamp1_w))
478458   MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia24_ca2_w))
479459   MCFG_PIA_CB2_HANDLER(WRITELINE(s7_state, pia24_cb2_w))
480   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
481   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
460   MCFG_PIA_IRQA_HANDLER(WRITELINE(s7_state, pia_irq))
461   MCFG_PIA_IRQB_HANDLER(WRITELINE(s7_state, pia_irq))
482462
483463   MCFG_DEVICE_ADD("pia28", PIA6821, 0)
484464   MCFG_PIA_READPA_HANDLER(READ8(s7_state, dips_r))
485   MCFG_PIA_READCA1_HANDLER(READLINE(s7_state, pia28_ca1_r))
486   MCFG_PIA_READCB1_HANDLER(READLINE(s7_state, pia28_cb1_r))
487465   MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, dig0_w))
488466   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, dig1_w))
489467   MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia28_ca2_w))
490468   MCFG_PIA_CB2_HANDLER(WRITELINE(s7_state, pia28_cb2_w))
491   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
492   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
469   MCFG_PIA_IRQA_HANDLER(WRITELINE(s7_state, pia_irq))
470   MCFG_PIA_IRQB_HANDLER(WRITELINE(s7_state, pia_irq))
493471
494472   MCFG_DEVICE_ADD("pia30", PIA6821, 0)
495473   MCFG_PIA_READPA_HANDLER(READ8(s7_state, switch_r))
r32524r32525
857835
858836
859837
860GAME( 1980, bk_l4,    0,        s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-4)", GAME_MECHANICAL )
861GAME( 1980, bk_f4,    bk_l4,    s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_MECHANICAL )
862GAME( 1980, bk_l3,    bk_l4,    s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-3)", GAME_MECHANICAL )
863GAME( 1980, csmic_l1, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_MECHANICAL )
864GAME( 1981, jngld_l2, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Jungle Lord (L-2)", GAME_MECHANICAL )
865GAME( 1981, jngld_l1, jngld_l2, s7, s7, driver_device, 0, ROT0, "Williams", "Jungle Lord (L-1)", GAME_MECHANICAL )
866GAME( 1981, pharo_l2, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Pharaoh (L-2)", GAME_MECHANICAL )
867GAME( 1981, solar_l2, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Solar Fire (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)
868GAME( 1982, thund_p1, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-1)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
869GAME( 1982, thund_p2, thund_p1, s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-2)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
870GAME( 1982, thund_p3, thund_p1, s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-3)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
871GAME( 1981, hypbl_l4, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "HyperBall (L-4)", GAME_MECHANICAL | GAME_NOT_WORKING )
872GAME( 1981, hypbl_l2, hypbl_l4, s7, s7, driver_device, 0, ROT0, "Williams", "HyperBall (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING )
873GAME( 1981, barra_l1, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Barracora (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)
874GAME( 1982, vrkon_l1, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Varkon (L-1)", GAME_MECHANICAL )
875GAME( 1982, tmfnt_l5, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Time Fantasy (L-5)", GAME_MECHANICAL )
876GAME( 1982, wrlok_l3, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Warlok (L-3)", GAME_MECHANICAL )
877GAME( 1982, dfndr_l4, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Defender (L-4)", GAME_MECHANICAL )
878GAME( 1983, jst_l2,   0,        s7, s7, driver_device, 0, ROT0, "Williams", "Joust (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING )
879GAME( 1983, jst_l1,   jst_l2,   s7, s7, driver_device, 0, ROT0, "Williams", "Joust (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING )
880GAME( 1983, lsrcu_l2, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Laser Cue (L-2)", GAME_MECHANICAL )
881GAME( 1983, fpwr2_l2, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Firepower II (L-2)", GAME_MECHANICAL )
882GAME( 1984, strlt_l1, 0,        s7, s7, driver_device, 0, ROT0, "Williams", "Star Light (L-1)", GAME_MECHANICAL )
838GAME( 1980, bk_l4,    0,        s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-4)", GAME_MECHANICAL )
839GAME( 1980, bk_f4,    bk_l4,    s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_MECHANICAL )
840GAME( 1980, bk_l3,    bk_l4,    s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-3)", GAME_MECHANICAL )
841GAME( 1980, csmic_l1, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_MECHANICAL )
842GAME( 1981, jngld_l2, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Jungle Lord (L-2)", GAME_MECHANICAL )
843GAME( 1981, jngld_l1, jngld_l2, s7, s7, s7_state, s7, ROT0, "Williams", "Jungle Lord (L-1)", GAME_MECHANICAL )
844GAME( 1981, pharo_l2, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Pharaoh (L-2)", GAME_MECHANICAL )
845GAME( 1981, solar_l2, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Solar Fire (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)
846GAME( 1982, thund_p1, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-1)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
847GAME( 1982, thund_p2, thund_p1, s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-2)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
848GAME( 1982, thund_p3, thund_p1, s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-3)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND )
849GAME( 1981, hypbl_l4, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "HyperBall (L-4)", GAME_MECHANICAL | GAME_NOT_WORKING )
850GAME( 1981, hypbl_l2, hypbl_l4, s7, s7, s7_state, s7, ROT0, "Williams", "HyperBall (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING )
851GAME( 1981, barra_l1, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Barracora (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)
852GAME( 1982, vrkon_l1, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Varkon (L-1)", GAME_MECHANICAL )
853GAME( 1982, tmfnt_l5, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Time Fantasy (L-5)", GAME_MECHANICAL )
854GAME( 1982, wrlok_l3, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Warlok (L-3)", GAME_MECHANICAL )
855GAME( 1982, dfndr_l4, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Defender (L-4)", GAME_MECHANICAL )
856GAME( 1983, jst_l2,   0,        s7, s7, s7_state, s7, ROT0, "Williams", "Joust (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING )
857GAME( 1983, jst_l1,   jst_l2,   s7, s7, s7_state, s7, ROT0, "Williams", "Joust (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING )
858GAME( 1983, lsrcu_l2, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Laser Cue (L-2)", GAME_MECHANICAL )
859GAME( 1983, fpwr2_l2, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Firepower II (L-2)", GAME_MECHANICAL )
860GAME( 1984, strlt_l1, 0,        s7, s7, s7_state, s7, ROT0, "Williams", "Star Light (L-1)", GAME_MECHANICAL )
trunk/src/mame/drivers/s9.c
r32524r32525
55  PINBALL
66  Williams System 9
77
8When first started, it shows the game number and stops. Press F3 to initialise the
9nvram. In theory you can then press the diagnostic buttons; or you then enter coins
10and start playing.
8When first started, it shows the game number and stops. Press F3 to reboot, then it works.
119
12Each game has its own switches, you need to know the outhole and slam-tilt ones.
13Note that T is also a tilt, but it may take 3 hits to activate it.
14
15A number of games are multiball therefore they either cannot start or the outhole
16is ineffective/unknown. All games can coin up.
17
1810Rat Race is played in a one-player cocktail cabinet, the player uses a joystick
1911to tilt the board, to coax the ball into following lit arrows in a maze. After
2012a successful navigation, the maze changes to something else faster and harder.
r32524r32525
2315prototype stage. Currently it runs but the player display flashes randoms ones while
2416a sound is produced every couple of seconds.
2517
18Each game has its own switches, you need to know the outhole and slam-tilt ones.
19Note that T is also a tilt, but it may take 3 hits to activate it.
2620
27Game              Outhole   Tilt        Notes
28----------------------------------------------------------------------------------
29Sorcerer                                Cannot start
30Space Shuttle                           Cannot start
31Comet                                   Mostly works
32Rat Race                                Not working
3321
22Game              Outhole   Tilt         Notes
23----------------------------------------------------------------------------------------
24Sorcerer          X -       Y            To start, hold down X and minus, then press 1.
25Space Shuttle     S D F     Right-shift  To start, hold down SDF, then press 1.
26Comet             Y         Right-shift
27Rat Race                                 Not working
28
3429ToDo:
35- Diagnostic buttons do not work
30- Mechanical sounds
3631
37
3832*****************************************************************************************/
3933
4034
r32524r32525
6559   DECLARE_READ8_MEMBER(dac_r);
6660   DECLARE_WRITE8_MEMBER(dig0_w);
6761   DECLARE_WRITE8_MEMBER(dig1_w);
68   DECLARE_WRITE8_MEMBER(lamp0_w);
62   DECLARE_WRITE8_MEMBER(lamp0_w) { };
6963   DECLARE_WRITE8_MEMBER(lamp1_w) { };
7064   DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15
71   DECLARE_WRITE8_MEMBER(sol3_w); // solenoids 0-7
65   DECLARE_WRITE8_MEMBER(sol3_w) { }; // solenoids 0-7
7266   DECLARE_WRITE8_MEMBER(sound_w);
7367   DECLARE_READ8_MEMBER(dips_r);
7468   DECLARE_READ8_MEMBER(switch_r);
7569   DECLARE_WRITE8_MEMBER(switch_w);
7670   DECLARE_READ_LINE_MEMBER(pia21_ca1_r);
77   DECLARE_READ_LINE_MEMBER(pia28_ca1_r);
78   DECLARE_READ_LINE_MEMBER(pia28_cb1_r);
7971   DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w);
8072   DECLARE_WRITE_LINE_MEMBER(pia21_cb2_w) { }; // enable solenoids
8173   DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; // dummy to stop error log filling up
8274   DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; // comma3&4
8375   DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2
84   TIMER_DEVICE_CALLBACK_MEMBER(irq);
76   DECLARE_WRITE_LINE_MEMBER(pia_irq);
8577   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
8678   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
8779   DECLARE_MACHINE_RESET(s9);
80   DECLARE_DRIVER_INIT(s9);
8881private:
89   UINT8 m_t_c;
9082   UINT8 m_sound_data;
9183   UINT8 m_strobe;
9284   UINT8 m_kbdrow;
9385   bool m_data_ok;
86   emu_timer* m_irq_timer;
87   virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr);
88   static const device_timer_id TIMER_IRQ = 0;
9489   required_device<cpu_device> m_maincpu;
9590   required_device<cpu_device> m_audiocpu;
9691   required_device<dac_device> m_dac;
r32524r32525
121116
122117static INPUT_PORTS_START( s9 )
123118   PORT_START("X0")
124   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
119   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED )
125120
126121   PORT_START("X1")
127122   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT )
r32524r32525
184179   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O)
185180
186181   PORT_START("X40")
187   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
182   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_RSHIFT)
183   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_SPACE)
184   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LALT)
185   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LSHIFT)
186   PORT_BIT( 0xf0, IP_ACTIVE_LOW, IPT_UNKNOWN )
188187
189188   PORT_START("X80")
190189   PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
r32524r32525
196195   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_6_PAD) PORT_TOGGLE
197196INPUT_PORTS_END
198197
199MACHINE_RESET_MEMBER( s9_state, s9 )
200{
201   m_t_c = 0;
202}
203
204198INPUT_CHANGED_MEMBER( s9_state::main_nmi )
205199{
206200   // Diagnostic button sends a pulse to NMI pin
r32524r32525
215209      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
216210}
217211
218WRITE8_MEMBER( s9_state::sol3_w )
219{
220//  if (BIT(data, 1))
221//      m_samples->start(0, 6); // knocker
222}
223
224212WRITE8_MEMBER( s9_state::sound_w )
225213{
226214   m_sound_data = data;
r32524r32525
238226   m_pias->ca1_w(state);
239227}
240228
241WRITE8_MEMBER( s9_state::lamp0_w )
242{
243   m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE);
244}
245
246READ_LINE_MEMBER( s9_state::pia28_ca1_r )
247{
248   return BIT(ioport("DIAGS")->read(), 2); // advance button
249}
250
251READ_LINE_MEMBER( s9_state::pia28_cb1_r )
252{
253   return BIT(ioport("DIAGS")->read(), 3); // up/down switch
254}
255
256229WRITE8_MEMBER( s9_state::dig0_w )
257230{
258231   static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447
r32524r32525
290263   return m_sound_data;
291264}
292265
293TIMER_DEVICE_CALLBACK_MEMBER( s9_state::irq )
266WRITE_LINE_MEMBER( s9_state::pia_irq )
294267{
295   if (m_t_c > 0x70)
296      m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE);
268   if(state == CLEAR_LINE)
269   {
270      // restart IRQ timer
271      m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
272   }
297273   else
298      m_t_c++;
274   {
275      // disable IRQ timer while other IRQs are being handled
276      // (counter is reset every 32 cycles while a PIA IRQ is handled)
277      m_irq_timer->adjust(attotime::zero);
278   }
299279}
300280
281void s9_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
282{
283   switch(id)
284   {
285   case TIMER_IRQ:
286      if(param == 1)
287      {
288         m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE);
289         m_irq_timer->adjust(attotime::from_ticks(32,1e6),0);
290         m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2));  // Advance
291         m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3));  // Up/Down
292      }
293      else
294      {
295         m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE);
296         m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
297         m_pia28->ca1_w(1);
298         m_pia28->cb1_w(1);
299      }
300      break;
301   }
302}
303
304MACHINE_RESET_MEMBER( s9_state, s9 )
305{
306}
307
308DRIVER_INIT_MEMBER( s9_state, s9 )
309{
310   m_irq_timer = timer_alloc(TIMER_IRQ);
311   m_irq_timer->adjust(attotime::from_ticks(980,1e6),1);
312}
313
301314static MACHINE_CONFIG_START( s9, s9_state )
302315   /* basic machine hardware */
303316   MCFG_CPU_ADD("maincpu", M6808, XTAL_4MHz)
304317   MCFG_CPU_PROGRAM_MAP(s9_main_map)
305   MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s9_state, irq, attotime::from_hz(250))
306318   MCFG_MACHINE_RESET_OVERRIDE(s9_state, s9)
307319
308320   /* Video */
r32524r32525
319331   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, sol2_w))
320332   MCFG_PIA_CA2_HANDLER(WRITELINE(s9_state, pia21_ca2_w))
321333   MCFG_PIA_CB2_HANDLER(WRITELINE(s9_state, pia21_cb2_w))
322   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
323   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
334   MCFG_PIA_IRQA_HANDLER(WRITELINE(s9_state, pia_irq))
335   MCFG_PIA_IRQB_HANDLER(WRITELINE(s9_state, pia_irq))
324336
325337   MCFG_DEVICE_ADD("pia24", PIA6821, 0)
326338   MCFG_PIA_WRITEPA_HANDLER(WRITE8(s9_state, lamp0_w))
327339   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, lamp1_w))
328340   MCFG_PIA_CB2_HANDLER(WRITELINE(s9_state, pia24_cb2_w))
329   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
330   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
341   MCFG_PIA_IRQA_HANDLER(WRITELINE(s9_state, pia_irq))
342   MCFG_PIA_IRQB_HANDLER(WRITELINE(s9_state, pia_irq))
331343
332344   MCFG_DEVICE_ADD("pia28", PIA6821, 0)
333   MCFG_PIA_READCA1_HANDLER(READLINE(s9_state, pia28_ca1_r))
334   MCFG_PIA_READCB1_HANDLER(READLINE(s9_state, pia28_cb1_r))
335345   MCFG_PIA_WRITEPA_HANDLER(WRITE8(s9_state, dig0_w))
336346   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, dig1_w))
337347   MCFG_PIA_CA2_HANDLER(WRITELINE(s9_state, pia28_ca2_w))
338348   MCFG_PIA_CB2_HANDLER(WRITELINE(s9_state, pia28_cb2_w))
339   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
340   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
349   MCFG_PIA_IRQA_HANDLER(WRITELINE(s9_state, pia_irq))
350   MCFG_PIA_IRQB_HANDLER(WRITELINE(s9_state, pia_irq))
341351
342352   MCFG_DEVICE_ADD("pia30", PIA6821, 0)
343353   MCFG_PIA_READPA_HANDLER(READ8(s9_state, switch_r))
344354   MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, switch_w))
345   MCFG_PIA_IRQA_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
346   MCFG_PIA_IRQB_HANDLER(DEVWRITELINE("maincpu", m6808_cpu_device, irq_line))
355   MCFG_PIA_IRQA_HANDLER(WRITELINE(s9_state, pia_irq))
356   MCFG_PIA_IRQB_HANDLER(WRITELINE(s9_state, pia_irq))
347357
348358   MCFG_NVRAM_ADD_0FILL("nvram")
349359
r32524r32525
486496ROM_END
487497
488498
489GAME( 1983, ratrc_l1, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Rat Race (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING)
490GAME( 1985, sorcr_l1, sorcr_l2, s9, s9, driver_device, 0, ROT0, "Williams", "Sorcerer (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING)
491GAME( 1985, sorcr_l2, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Sorcerer (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING)
492GAME( 1984, sshtl_l7, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Space Shuttle (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING)
493GAME( 1985, comet_l4, comet_l5, s9, s9, driver_device, 0, ROT0, "Williams", "Comet (L-4)", GAME_MECHANICAL)
494GAME( 1985, comet_l5, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Comet (L-5)", GAME_MECHANICAL)
495GAME( 1984, szone_l5, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_MECHANICAL | GAME_NOT_WORKING)
496GAME( 1984, szone_l2, szone_l5, s9, s9, driver_device, 0, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING)
497GAME( 1985, alcat_l7, 0,        s9, s9, driver_device, 0, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)
499GAME( 1983, ratrc_l1, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Rat Race (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING)
500GAME( 1985, sorcr_l1, sorcr_l2, s9, s9, s9_state, s9, ROT0, "Williams", "Sorcerer (L-1)", GAME_MECHANICAL )
501GAME( 1985, sorcr_l2, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Sorcerer (L-2)", GAME_MECHANICAL )
502GAME( 1984, sshtl_l7, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Space Shuttle (L-7)", GAME_MECHANICAL )
503GAME( 1985, comet_l4, comet_l5, s9, s9, s9_state, s9, ROT0, "Williams", "Comet (L-4)", GAME_MECHANICAL)
504GAME( 1985, comet_l5, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Comet (L-5)", GAME_MECHANICAL)
505GAME( 1984, szone_l5, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_MECHANICAL | GAME_NOT_WORKING)
506GAME( 1984, szone_l2, szone_l5, s9, s9, s9_state, s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING)
507GAME( 1985, alcat_l7, 0,        s9, s9, s9_state, s9, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team