Previous 199869 Revisions Next

r18674 Tuesday 23rd October, 2012 at 11:46:32 UTC by Robbbert
Williams s3 : added diagnostic/setup controls and dipswitches
[src/mame/drivers]s3.c

trunk/src/mame/drivers/s3.c
r18673r18674
3737   s3_state(const machine_config &mconfig, device_type type, const char *tag)
3838      : genpin_class(mconfig, type, tag),
3939   m_maincpu(*this, "maincpu"),
40   m_audiocpu(*this, "audiocpu"),
4041   m_dac(*this, "dac"),
4142   m_pia0(*this, "pia0"),
4243   m_pia1(*this, "pia1"),
r18673r18674
5354   DECLARE_WRITE8_MEMBER(lamp1_w);
5455   DECLARE_WRITE8_MEMBER(sol0_w);
5556   DECLARE_WRITE8_MEMBER(sol1_w);
57   DECLARE_READ8_MEMBER(dips_r);
5658   DECLARE_READ8_MEMBER(switch_r);
5759   DECLARE_WRITE8_MEMBER(switch_w);
58   DECLARE_READ_LINE_MEMBER(cb1_r);
60   DECLARE_READ_LINE_MEMBER(pia2_ca1_r);
61   DECLARE_READ_LINE_MEMBER(pia2_cb1_r);
62   DECLARE_READ_LINE_MEMBER(pia4_cb1_r);
63   DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w) { }; //ST5
64   DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w) { }; //ST-solenoids enable
65   DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w) { }; //ST2
66   DECLARE_WRITE_LINE_MEMBER(pia1_cb2_w) { }; //ST1
67   DECLARE_WRITE_LINE_MEMBER(pia2_ca2_w) { }; //diag leds enable
68   DECLARE_WRITE_LINE_MEMBER(pia2_cb2_w) { }; //ST6
69   DECLARE_WRITE_LINE_MEMBER(pia3_ca2_w) { }; //ST4
70   DECLARE_WRITE_LINE_MEMBER(pia3_cb2_w) { }; //ST3
5971   TIMER_DEVICE_CALLBACK_MEMBER(irq);
60   DECLARE_INPUT_CHANGED_MEMBER(nmi);
72   DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
73   DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
6174   DECLARE_MACHINE_RESET(s3);
6275   DECLARE_MACHINE_RESET(s3a);
6376protected:
6477
6578   // devices
6679   required_device<cpu_device> m_maincpu;
80   optional_device<cpu_device> m_audiocpu;
6781   optional_device<dac_device> m_dac;
6882   required_device<pia6821_device> m_pia0;
6983   required_device<pia6821_device> m_pia1;
r18673r18674
8397static ADDRESS_MAP_START( s3_main_map, AS_PROGRAM, 8, s3_state )
8498   ADDRESS_MAP_GLOBAL_MASK(0x7fff)
8599   AM_RANGE(0x0000, 0x00ff) AM_RAM
86   AM_RANGE(0x0100, 0x017f) AM_RAM AM_SHARE("nvram")
100   AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("nvram")
87101   AM_RANGE(0x2200, 0x2203) AM_DEVREADWRITE("pia0", pia6821_device, read, write) // solenoids
88102   AM_RANGE(0x2400, 0x2403) AM_DEVREADWRITE("pia1", pia6821_device, read, write) // lamps
89103   AM_RANGE(0x2800, 0x2803) AM_DEVREADWRITE("pia2", pia6821_device, read, write) // display
90104   AM_RANGE(0x3000, 0x3003) AM_DEVREADWRITE("pia3", pia6821_device, read, write) // inputs
91   AM_RANGE(0x6000, 0x67ff) AM_ROM
92   AM_RANGE(0x7000, 0x7fff) AM_ROM
105   AM_RANGE(0x6000, 0x7fff) AM_ROM
93106ADDRESS_MAP_END
94107
95108static ADDRESS_MAP_START( s3_audio_map, AS_PROGRAM, 8, s3_state )
r18673r18674
145158   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
146159   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
147160   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
148   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Outhole") PORT_CODE(KEYCODE_X)
161   PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X)
149162   PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
150163   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
151164   PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
r18673r18674
171184
172185   PORT_START("SND")
173186   PORT_BIT( 0xbf, IP_ACTIVE_LOW, IPT_UNUSED )
174   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_9) PORT_TOGGLE
187   PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music") PORT_CODE(KEYCODE_4) PORT_TOGGLE
175188
176189   PORT_START("DIAGS")
177   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Diagnostic") PORT_CODE(KEYCODE_0) PORT_CHANGED_MEMBER(DEVICE_SELF, s3_state, nmi, 1)
190   PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s3_state, audio_nmi, 1)
191   PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s3_state, main_nmi, 1)
192   PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
193   PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_9)
194   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_8)
195
196   PORT_START("DSW0")
197   PORT_DIPNAME( 0x01, 0x01, "SW01" )
198   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
199   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
200   PORT_DIPNAME( 0x02, 0x02, "SW02" )
201   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
202   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
203   PORT_DIPNAME( 0x04, 0x04, "SW03" )
204   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
205   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
206   PORT_DIPNAME( 0x08, 0x08, "SW04" )
207   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
208   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
209   PORT_DIPNAME( 0x10, 0x10, "SW05" )
210   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
211   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
212   PORT_DIPNAME( 0x20, 0x20, "SW06" )
213   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
214   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
215   PORT_DIPNAME( 0x40, 0x40, "SW07" )
216   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
217   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
218   PORT_DIPNAME( 0x80, 0x80, "SW08" )
219   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
220   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
221
222   PORT_START("DSW1")
223   PORT_DIPNAME( 0x01, 0x01, "SW11" )
224   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
225   PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
226   PORT_DIPNAME( 0x02, 0x02, "SW12" )
227   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
228   PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
229   PORT_DIPNAME( 0x04, 0x04, "SW13" )
230   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
231   PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
232   PORT_DIPNAME( 0x08, 0x08, "SW14" )
233   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
234   PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
235   PORT_DIPNAME( 0x10, 0x10, "SW15" )
236   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
237   PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
238   PORT_DIPNAME( 0x20, 0x20, "SW16" )
239   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
240   PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
241   PORT_DIPNAME( 0x40, 0x40, "SW17" )
242   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
243   PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
244   PORT_DIPNAME( 0x80, 0x80, "SW18" )
245   PORT_DIPSETTING(    0x00, DEF_STR( On ) )
246   PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
178247INPUT_PORTS_END
179248
180249MACHINE_RESET_MEMBER( s3_state, s3 )
r18673r18674
189258   m_chimes = 0;
190259}
191260
192INPUT_CHANGED_MEMBER( s3_state::nmi )
261INPUT_CHANGED_MEMBER( s3_state::main_nmi )
193262{
194263   // Diagnostic button sends a pulse to NMI pin
195264   if (newval==CLEAR_LINE)
196265      m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
197266}
198267
268INPUT_CHANGED_MEMBER( s3_state::audio_nmi )
269{
270   // Diagnostic button sends a pulse to NMI pin
271   if ((newval==CLEAR_LINE) && !m_chimes)
272      m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
273}
274
199275WRITE8_MEMBER( s3_state::sol0_w )
200276{
201277   if (BIT(data, 4))
r18673r18674
263339   DEVCB_NULL,      /* line CB2 in */
264340   DEVCB_DRIVER_MEMBER(s3_state, sol0_w),      /* port A out */
265341   DEVCB_DRIVER_MEMBER(s3_state, sol1_w),      /* port B out */
266   DEVCB_NULL,      /* line CA2 out */
267   DEVCB_NULL,      /* port CB2 out */
342   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia0_ca2_w),      /* line CA2 out */
343   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia0_cb2_w),      /* line CB2 out */
268344   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
269345   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
270346};
r18673r18674
288364   DEVCB_NULL,      /* line CB2 in */
289365   DEVCB_DRIVER_MEMBER(s3_state, lamp0_w),      /* port A out */
290366   DEVCB_DRIVER_MEMBER(s3_state, lamp1_w),      /* port B out */
291   DEVCB_NULL,      /* line CA2 out */
292   DEVCB_NULL,      /* port CB2 out */
367   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia1_ca2_w),      /* line CA2 out */
368   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia1_cb2_w),      /* line CB2 out */
293369   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
294370   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
295371};
296372
373READ_LINE_MEMBER( s3_state::pia2_ca1_r )
374{
375   return BIT(ioport("DIAGS")->read(), 2); // advance button
376}
377
378READ_LINE_MEMBER( s3_state::pia2_cb1_r )
379{
380   return BIT(ioport("DIAGS")->read(), 3); // auto/manual switch
381}
382
383READ8_MEMBER( s3_state::dips_r )
384{
385   if (BIT(ioport("DIAGS")->read(), 4) )
386   {
387      switch (m_strobe)
388      {
389      case 0:
390         return ioport("DSW0")->read() & 15;
391         break;
392      case 1:
393         return ioport("DSW0")->read() << 4;
394         break;
395      case 2:
396         return ioport("DSW1")->read() & 15;
397         break;
398      case 3:
399         return ioport("DSW1")->read() << 4;
400         break;
401      }
402   }
403   return 0xff;
404}
405
297406WRITE8_MEMBER( s3_state::dig0_w )
298407{
299   m_strobe = data;
408   m_strobe = data & 15;
300409   m_data_ok = true;
410   output_set_value("led0", BIT(data, 4));
411   output_set_value("led1", BIT(data, 5));
301412}
302413
303414WRITE8_MEMBER( s3_state::dig1_w )
r18673r18674
313424
314425static const pia6821_interface pia2_intf =
315426{
316   DEVCB_NULL,      /* port A in */
427   DEVCB_DRIVER_MEMBER(s3_state, dips_r),      /* port A in */
317428   DEVCB_NULL,      /* port B in */
318   DEVCB_NULL,      /* line CA1 in */
319   DEVCB_NULL,      /* line CB1 in */
429   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia2_ca1_r),      /* line CA1 in */
430   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia2_cb1_r),      /* line CB1 in */
320431   DEVCB_NULL,      /* line CA2 in */
321432   DEVCB_NULL,      /* line CB2 in */
322433   DEVCB_DRIVER_MEMBER(s3_state, dig0_w),      /* port A out */
323434   DEVCB_DRIVER_MEMBER(s3_state, dig1_w),      /* port B out */
324   DEVCB_NULL,      /* line CA2 out */
325   DEVCB_NULL,      /* port CB2 out */
435   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia2_ca2_w),      /* line CA2 out */
436   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia2_cb2_w),      /* line CB2 out */
326437   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
327438   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
328439};
r18673r18674
349460   DEVCB_NULL,      /* line CB2 in */
350461   DEVCB_NULL,      /* port A out */
351462   DEVCB_DRIVER_MEMBER(s3_state, switch_w),      /* port B out */
352   DEVCB_NULL,      /* line CA2 out */
353   DEVCB_NULL,      /* port CB2 out */
463   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia3_ca2_w),      /* line CA2 out */
464   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia3_cb2_w),      /* line CB2 out */
354465   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE),      /* IRQA */
355466   DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE)      /* IRQB */
356467};
357468
358READ_LINE_MEMBER( s3_state::cb1_r )
469READ_LINE_MEMBER( s3_state::pia4_cb1_r )
359470{
360471   return m_cb1;
361472}
r18673r18674
375486   DEVCB_NULL,      /* port A in */
376487   DEVCB_DRIVER_MEMBER(s3_state, dac_r),      /* port B in */
377488   DEVCB_NULL,      /* line CA1 in */
378   DEVCB_DRIVER_LINE_MEMBER(s3_state, cb1_r),      /* line CB1 in */
489   DEVCB_DRIVER_LINE_MEMBER(s3_state, pia4_cb1_r),      /* line CB1 in */
379490   DEVCB_NULL,      /* line CA2 in */
380491   DEVCB_NULL,      /* line CB2 in */
381492   DEVCB_DRIVER_MEMBER(s3_state, dac_w),      /* port A out */
382493   DEVCB_NULL,      /* port B out */
383494   DEVCB_NULL,      /* line CA2 out */
384   DEVCB_NULL,      /* port CB2 out */
495   DEVCB_NULL,      /* line CB2 out */
385496   DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE),      /* IRQA */
386497   DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE)      /* IRQB */
387498};

Previous 199869 Revisions Next


© 1997-2024 The MAME Team