Williams System 8 : WIP

This commit is contained in:
Robbbert 2012-10-26 09:52:11 +00:00
parent 5915193b90
commit 70bd51d08c
6 changed files with 649 additions and 44 deletions

1
.gitattributes vendored
View File

@ -4447,6 +4447,7 @@ src/mame/layout/s3.lay svneol=native#text/plain
src/mame/layout/s4.lay svneol=native#text/plain
src/mame/layout/s6.lay svneol=native#text/plain
src/mame/layout/s6a.lay svneol=native#text/plain
src/mame/layout/s8.lay svneol=native#text/plain
src/mame/layout/saiyukip.lay svneol=native#text/plain
src/mame/layout/sbrkout.lay svneol=native#text/plain
src/mame/layout/sc1_vfd.lay svneol=native#text/plain

View File

@ -282,14 +282,14 @@ WRITE8_MEMBER( s3_state::sol1_w )
{
if (BIT(data, 0))
m_samples->start(1, 1); // 10 chime
//else
if (BIT(data, 1))
m_samples->start(2, 2); // 100 chime
//else
if (BIT(data, 2))
m_samples->start(3, 3); // 1000 chime
// we don't have a 10k chime in samples yet
//else
//if (BIT(data, 3))
//m_samples->start(1, x); // 10k chime
}

View File

@ -6,7 +6,7 @@
No schematics have been located as yet.
Phoenix and Pokerino are listed as System 4 systems, but use System 3 roms.
They have been moved to s4.c, and are working there.
They have been moved to s3.c, and are working there.
Only Flash and Stellar Wars are pinball machines. The remainder are so-called
"Shuffle", which is a flat board with an air-driven puck and 10 bowling pins.

View File

@ -3,77 +3,537 @@
Pinball
Williams System 8
Only 2 games used this system.
- Pennant Fever, which isn't a true pinball, it is a baseball game where you aim
for targets at the top of the playfield, and the players advance towards a
home run. There are no bumpers or other 'usual' pinball items.
- Still Crazy, a novelty game where the playfield is completely vertical. It has
4 flippers and the idea is to get the ball up to the alcohol 'still' before
the 'revenuers' do. The idea didn't catch on, and the game was not officially
released.
ToDo:
- Everything
- Identify devices at 200x and 210x
- Pennant Fever maincpu goes into lala-land after a rti.
************************************************************************************/
#include "emu.h"
#include "machine/genpin.h"
#include "cpu/m6800/m6800.h"
#include "machine/6821pia.h"
#include "sound/dac.h"
#include "s8.lh"
class williams_s8_state : public driver_device
class s8_state : public genpin_class
{
public:
williams_s8_state(const machine_config &mconfig, device_type type, const char *tag)
: driver_device(mconfig, type, tag),
m_maincpu(*this, "maincpu")
s8_state(const machine_config &mconfig, device_type type, const char *tag)
: genpin_class(mconfig, type, tag),
m_maincpu(*this, "maincpu"),
m_audiocpu(*this, "audiocpu"),
m_dac(*this, "dac"),
m_pia0(*this, "pia0"),
m_pia1(*this, "pia1"),
m_pia2(*this, "pia2"),
m_pia3(*this, "pia3"),
m_pia4(*this, "pia4")
{ }
DECLARE_READ8_MEMBER(dac_r);
DECLARE_WRITE8_MEMBER(dac_w);
DECLARE_WRITE8_MEMBER(dig0_w);
DECLARE_WRITE8_MEMBER(dig1_w);
DECLARE_WRITE8_MEMBER(lamp0_w);
DECLARE_WRITE8_MEMBER(lamp1_w);
DECLARE_WRITE8_MEMBER(sol0_w);
DECLARE_WRITE8_MEMBER(sol1_w);
DECLARE_READ8_MEMBER(dips_r);
DECLARE_READ8_MEMBER(switch_r);
DECLARE_WRITE8_MEMBER(switch_w);
DECLARE_READ_LINE_MEMBER(pia2_ca1_r);
DECLARE_READ_LINE_MEMBER(pia2_cb1_r);
DECLARE_READ_LINE_MEMBER(pia4_cb1_r);
DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w) { }; //ST5
DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w) { }; //ST-solenoids enable
DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w) { }; //ST2
DECLARE_WRITE_LINE_MEMBER(pia1_cb2_w) { }; //ST1
DECLARE_WRITE_LINE_MEMBER(pia2_ca2_w) { }; //diag leds enable
DECLARE_WRITE_LINE_MEMBER(pia2_cb2_w) { }; //ST6
DECLARE_WRITE_LINE_MEMBER(pia3_ca2_w) { }; //ST4
DECLARE_WRITE_LINE_MEMBER(pia3_cb2_w) { }; //ST3
TIMER_DEVICE_CALLBACK_MEMBER(irq);
DECLARE_INPUT_CHANGED_MEMBER(main_nmi);
DECLARE_INPUT_CHANGED_MEMBER(audio_nmi);
DECLARE_MACHINE_RESET(s8);
DECLARE_MACHINE_RESET(s8a);
protected:
// devices
required_device<cpu_device> m_maincpu;
// driver_device overrides
virtual void machine_reset();
public:
DECLARE_DRIVER_INIT(williams_s8);
optional_device<cpu_device> m_audiocpu;
optional_device<dac_device> m_dac;
required_device<pia6821_device> m_pia0;
required_device<pia6821_device> m_pia1;
required_device<pia6821_device> m_pia2;
required_device<pia6821_device> m_pia3;
optional_device<pia6821_device> m_pia4;
private:
UINT8 m_t_c;
UINT8 m_sound_data;
UINT8 m_strobe;
UINT8 m_kbdrow;
bool m_cb1;
bool m_data_ok;
bool m_chimes;
};
static ADDRESS_MAP_START( williams_s8_map, AS_PROGRAM, 8, williams_s8_state )
static ADDRESS_MAP_START( s8_main_map, AS_PROGRAM, 8, s8_state )
ADDRESS_MAP_GLOBAL_MASK(0x7fff)
AM_RANGE(0x0000, 0x07ff) AM_RAM
//AM_RANGE(0x2100, 0x2103) AM_WRITE
//AM_RANGE(0x2200, 0x2200) AM_WRITE
//AM_RANGE(0x2400, 0x2403) AM_WRITE
//AM_RANGE(0x2800, 0x2803) AM_WRITE
//AM_RANGE(0x3000, 0x3003) AM_WRITE
AM_RANGE(0x5000, 0x7fff) AM_ROM
//AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0x2200, 0x2203) AM_DEVREADWRITE("pia0", pia6821_device, read, write) // solenoids
AM_RANGE(0x2400, 0x2403) AM_DEVREADWRITE("pia1", pia6821_device, read, write) // lamps
AM_RANGE(0x2800, 0x2803) AM_DEVREADWRITE("pia2", pia6821_device, read, write) // display
AM_RANGE(0x3000, 0x3003) AM_DEVREADWRITE("pia3", pia6821_device, read, write) // inputs
AM_RANGE(0x6000, 0x7fff) AM_ROM
ADDRESS_MAP_END
static ADDRESS_MAP_START( williams_s8_sub_map, AS_PROGRAM, 8, williams_s8_state )
static ADDRESS_MAP_START( s8_audio_map, AS_PROGRAM, 8, s8_state )
AM_RANGE(0x0000, 0x00ff) AM_RAM
//AM_RANGE(0x4000, 0x4003) AM_WRITE
AM_RANGE(0x4000, 0x4003) AM_MIRROR(0x8000) AM_DEVREADWRITE("pia4", pia6821_device, read, write) // sounds
AM_RANGE(0x8000, 0xffff) AM_ROM
ADDRESS_MAP_END
static INPUT_PORTS_START( williams_s8 )
static INPUT_PORTS_START( s8 )
PORT_START("X0")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O)
PORT_START("X1")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER )
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER )
PORT_START("X2")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K)
PORT_START("X4")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_L)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_N)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_M)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA)
PORT_START("X8")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_STOP)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_COLON)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE)
PORT_START("X10")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER)
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT)
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT)
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_UP)
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN)
PORT_START("X20")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("X40")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("X80")
PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_START("SND")
PORT_BIT( 0x9f, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music1") PORT_CODE(KEYCODE_3) PORT_TOGGLE
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music2") PORT_CODE(KEYCODE_4) PORT_TOGGLE
PORT_START("DIAGS")
PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s8_state, audio_nmi, 1)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s8_state, main_nmi, 1)
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0)
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_9)
PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_8)
PORT_START("DSW0")
PORT_DIPNAME( 0x01, 0x01, "SW01" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPNAME( 0x02, 0x02, "SW02" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPNAME( 0x04, 0x04, "SW03" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPNAME( 0x08, 0x08, "SW04" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPNAME( 0x10, 0x10, "SW05" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPNAME( 0x20, 0x20, "SW06" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPNAME( 0x40, 0x40, "SW07" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPNAME( 0x80, 0x80, "SW08" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_START("DSW1")
PORT_DIPNAME( 0x01, 0x01, "SW11" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x01, DEF_STR( Off ) )
PORT_DIPNAME( 0x02, 0x02, "SW12" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x02, DEF_STR( Off ) )
PORT_DIPNAME( 0x04, 0x04, "SW13" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x04, DEF_STR( Off ) )
PORT_DIPNAME( 0x08, 0x08, "SW14" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x08, DEF_STR( Off ) )
PORT_DIPNAME( 0x10, 0x10, "SW15" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPNAME( 0x20, 0x20, "SW16" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPNAME( 0x40, 0x40, "SW17" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPNAME( 0x80, 0x80, "SW18" )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
INPUT_PORTS_END
void williams_s8_state::machine_reset()
MACHINE_RESET_MEMBER( s8_state, s8 )
{
m_t_c = 0;
m_chimes = 1;
}
MACHINE_RESET_MEMBER( s8_state, s8a )
{
m_t_c = 0;
m_chimes = 0;
}
INPUT_CHANGED_MEMBER( s8_state::main_nmi )
{
// Diagnostic button sends a pulse to NMI pin
if (newval==CLEAR_LINE)
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
INPUT_CHANGED_MEMBER( s8_state::audio_nmi )
{
// Diagnostic button sends a pulse to NMI pin
if ((newval==CLEAR_LINE) && !m_chimes)
m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
WRITE8_MEMBER( s8_state::sol0_w )
{
if (BIT(data, 4))
m_samples->start(2, 5); // outhole
}
WRITE8_MEMBER( s8_state::sol1_w )
{
if (m_chimes)
{
if (BIT(data, 0))
m_samples->start(1, 1); // 10 chime
if (BIT(data, 1))
m_samples->start(2, 2); // 100 chime
if (BIT(data, 2))
m_samples->start(3, 3); // 1000 chime
// we don't have a 10k chime in samples yet
//if (BIT(data, 3))
//m_samples->start(1, x); // 10k chime
}
else
{printf("%X ",data);
m_sound_data = ioport("SND")->read();
if (BIT(data, 0))
m_sound_data &= 0xfe;
if (BIT(data, 1))
m_sound_data &= 0xfd;
if (BIT(data, 2))
m_sound_data &= 0xfb;
if (BIT(data, 3))
m_sound_data &= 0xf7;
if (BIT(data, 4))
m_sound_data &= 0x7f;
m_cb1 = ((m_sound_data & 0x7f) != 0x7f);
m_pia4->cb1_w(m_cb1);
}
if (BIT(data, 5))
m_samples->start(0, 6); // knocker
}
static const pia6821_interface pia0_intf =
{
DEVCB_NULL, /* port A in */
DEVCB_NULL, /* port B in */
DEVCB_LINE_GND, /* line CA1 in */
DEVCB_LINE_GND, /* line CB1 in */
DEVCB_NULL, /* line CA2 in */
DEVCB_NULL, /* line CB2 in */
DEVCB_DRIVER_MEMBER(s8_state, sol0_w), /* port A out */
DEVCB_DRIVER_MEMBER(s8_state, sol1_w), /* port B out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia0_ca2_w), /* line CA2 out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia0_cb2_w), /* line CB2 out */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
};
WRITE8_MEMBER( s8_state::lamp0_w )
{
m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE);
}
WRITE8_MEMBER( s8_state::lamp1_w )
{
}
DRIVER_INIT_MEMBER(williams_s8_state,williams_s8)
static const pia6821_interface pia1_intf =
{
DEVCB_NULL, /* port A in */
DEVCB_NULL, /* port B in */
DEVCB_LINE_GND, /* line CA1 in */
DEVCB_LINE_GND, /* line CB1 in */
DEVCB_NULL, /* line CA2 in */
DEVCB_NULL, /* line CB2 in */
DEVCB_DRIVER_MEMBER(s8_state, lamp0_w), /* port A out */
DEVCB_DRIVER_MEMBER(s8_state, lamp1_w), /* port B out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia1_ca2_w), /* line CA2 out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia1_cb2_w), /* line CB2 out */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
};
READ_LINE_MEMBER( s8_state::pia2_ca1_r )
{
return BIT(ioport("DIAGS")->read(), 2); // advance button
}
static MACHINE_CONFIG_START( williams_s8, williams_s8_state )
READ_LINE_MEMBER( s8_state::pia2_cb1_r )
{
return BIT(ioport("DIAGS")->read(), 3); // auto/manual switch
}
READ8_MEMBER( s8_state::dips_r )
{
if (BIT(ioport("DIAGS")->read(), 4) )
{
switch (m_strobe)
{
case 0:
return ioport("DSW0")->read() & 15;
break;
case 1:
return ioport("DSW0")->read() << 4;
break;
case 2:
return ioport("DSW1")->read() & 15;
break;
case 3:
return ioport("DSW1")->read() << 4;
break;
}
}
return 0xff;
}
WRITE8_MEMBER( s8_state::dig0_w )
{
m_strobe = data & 15;
m_data_ok = true;
output_set_value("led0", BIT(data, 4));
output_set_value("led1", BIT(data, 5));
}
WRITE8_MEMBER( s8_state::dig1_w )
{
static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // MC14558
if (m_data_ok)
{
output_set_digit_value(m_strobe+16, patterns[data&15]);
output_set_digit_value(m_strobe, patterns[data>>4]);
}
m_data_ok = false;
}
static const pia6821_interface pia2_intf =
{
DEVCB_DRIVER_MEMBER(s8_state, dips_r), /* port A in */
DEVCB_NULL, /* port B in */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_ca1_r), /* line CA1 in */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_cb1_r), /* line CB1 in */
DEVCB_NULL, /* line CA2 in */
DEVCB_NULL, /* line CB2 in */
DEVCB_DRIVER_MEMBER(s8_state, dig0_w), /* port A out */
DEVCB_DRIVER_MEMBER(s8_state, dig1_w), /* port B out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_ca2_w), /* line CA2 out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_cb2_w), /* line CB2 out */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
};
READ8_MEMBER( s8_state::switch_r )
{
char kbdrow[8];
sprintf(kbdrow,"X%X",m_kbdrow);
return ioport(kbdrow)->read();
}
WRITE8_MEMBER( s8_state::switch_w )
{
m_kbdrow = data;
}
static const pia6821_interface pia3_intf =
{
DEVCB_DRIVER_MEMBER(s8_state, switch_r), /* port A in */
DEVCB_NULL, /* port B in */
DEVCB_LINE_GND, /* line CA1 in */
DEVCB_LINE_GND, /* line CB1 in */
DEVCB_NULL, /* line CA2 in */
DEVCB_NULL, /* line CB2 in */
DEVCB_NULL, /* port A out */
DEVCB_DRIVER_MEMBER(s8_state, switch_w), /* port B out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia3_ca2_w), /* line CA2 out */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia3_cb2_w), /* line CB2 out */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */
DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */
};
READ_LINE_MEMBER( s8_state::pia4_cb1_r )
{
return m_cb1;
}
READ8_MEMBER( s8_state::dac_r )
{printf("%X ",m_sound_data);
return m_sound_data;
}
WRITE8_MEMBER( s8_state::dac_w )
{
m_dac->write_unsigned8(data);
}
static const pia6821_interface pia4_intf =
{
DEVCB_NULL, /* port A in */
DEVCB_DRIVER_MEMBER(s8_state, dac_r), /* port B in */
DEVCB_NULL, /* line CA1 in */
DEVCB_DRIVER_LINE_MEMBER(s8_state, pia4_cb1_r), /* line CB1 in */
DEVCB_NULL, /* line CA2 in */
DEVCB_NULL, /* line CB2 in */
DEVCB_DRIVER_MEMBER(s8_state, dac_w), /* port A out */
DEVCB_NULL, /* port B out */
DEVCB_NULL, /* line CA2 out */
DEVCB_NULL, /* line CB2 out */
DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE), /* IRQA */
DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE) /* IRQB */
};
TIMER_DEVICE_CALLBACK_MEMBER( s8_state::irq)
{
if (m_t_c > 0x70)
m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE);
else
m_t_c++;
}
static MACHINE_CONFIG_START( s8, s8_state )
/* basic machine hardware */
MCFG_CPU_ADD("maincpu", M6800, 1000000)
MCFG_CPU_PROGRAM_MAP(williams_s8_map)
MCFG_CPU_ADD("cpu2", M6800, 1000000)
MCFG_CPU_PROGRAM_MAP(williams_s8_sub_map)
MCFG_CPU_ADD("maincpu", M6802, 4000000)
MCFG_CPU_PROGRAM_MAP(s8_main_map)
MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s8_state, irq, attotime::from_hz(1000))
MCFG_MACHINE_RESET_OVERRIDE(s8_state, s8)
/* Video */
MCFG_DEFAULT_LAYOUT(layout_s8)
/* Sound */
MCFG_FRAGMENT_ADD( genpin_audio )
/* Devices */
MCFG_PIA6821_ADD("pia0", pia0_intf)
MCFG_PIA6821_ADD("pia1", pia1_intf)
MCFG_PIA6821_ADD("pia2", pia2_intf)
MCFG_PIA6821_ADD("pia3", pia3_intf)
//MCFG_NVRAM_ADD_1FILL("nvram")
/* Add the soundcard */
MCFG_CPU_ADD("audiocpu", M6808, 3580000)
MCFG_CPU_PROGRAM_MAP(s8_audio_map)
MCFG_MACHINE_RESET_OVERRIDE(s8_state, s8a)
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("dac", DAC, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_PIA6821_ADD("pia4", pia4_intf)
MACHINE_CONFIG_END
/*--------------------
/ Pennant Fever (#526)
/--------------------*/
/*------------------------------
/ Pennant Fever (#526) 05/1984
/-------------------------------*/
ROM_START(pfevr_l2)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("pf-rom1.u19", 0x5000, 0x1000, CRC(00be42bd) SHA1(72ca21c96e3ffa3c43499165f3339b669c8e94a5))
ROM_LOAD("pf-rom2.u20", 0x6000, 0x2000, CRC(7b101534) SHA1(21e886d5872104d71bb528b9affb12230268597a))
ROM_REGION(0x10000, "cpu2", 0)
ROM_REGION(0x10000, "audiocpu", 0)
ROM_LOAD("cpu_u49.128", 0xc000, 0x4000, CRC(b0161712) SHA1(5850f1f1f11e3ac9b9629cff2b26c4ad32436b55))
ROM_RELOAD(0x8000, 0x4000)
ROM_END
@ -83,23 +543,23 @@ ROM_START(pfevr_p3)
ROM_LOAD("cpu_u19.732", 0x5000, 0x1000, CRC(03796c6d) SHA1(38c95fcce9d0f357a74f041f0df006b9c6f6efc7))
ROM_LOAD("cpu_u20.764", 0x6000, 0x2000, CRC(3a3acb39) SHA1(7844cc30a9486f718a556850fc9cef3be82f26b7))
ROM_REGION(0x10000, "cpu2", 0)
ROM_REGION(0x10000, "audiocpu", 0)
ROM_LOAD("cpu_u49.128", 0xc000, 0x4000, CRC(b0161712) SHA1(5850f1f1f11e3ac9b9629cff2b26c4ad32436b55))
ROM_RELOAD(0x8000, 0x4000)
ROM_END
/*--------------------
/ Still Crazy
/--------------------*/
/*----------------------------
/ Still Crazy (#534) 06/1984
/-----------------------------*/
ROM_START(stillcra)
ROM_REGION(0x10000, "maincpu", 0)
ROM_LOAD("ic20.bin", 0x6000, 0x2000, CRC(b0df42e6) SHA1(bb10268d7b820d1de0c20e1b79aba558badd072b) )
ROM_REGION(0x10000, "cpu2", 0)
ROM_REGION(0x10000, "audiocpu", 0)
ROM_LOAD("ic49.bin", 0xc000, 0x4000, CRC(bcc8ccc4) SHA1(2312f9cc4f5a2dadfbfa61d13c31bb5838adf152) )
ROM_RELOAD(0x8000, 0x4000)
ROM_END
GAME(1984,pfevr_l2, 0, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Pennant Fever (L-2)", GAME_IS_SKELETON_MECHANICAL)
GAME(1984,pfevr_p3, pfevr_l2, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Pennant Fever (P-3)", GAME_IS_SKELETON_MECHANICAL)
GAME(1984,stillcra, 0, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Still Crazy", GAME_IS_SKELETON_MECHANICAL)
GAME(1984,pfevr_l2, 0, s8, s8, driver_device, 0, ROT0, "Williams", "Pennant Fever (L-2)", GAME_IS_SKELETON_MECHANICAL)
GAME(1984,pfevr_p3, pfevr_l2, s8, s8, driver_device, 0, ROT0, "Williams", "Pennant Fever (P-3)", GAME_IS_SKELETON_MECHANICAL)
GAME(1984,stillcra, 0, s8, s8, driver_device, 0, ROT0, "Williams", "Still Crazy", GAME_IS_SKELETON_MECHANICAL)

142
src/mame/layout/s8.lay Normal file
View File

@ -0,0 +1,142 @@
<!-- s8.lay -->
<!-- 2012-10-26: Initial version. [Robbbert] -->
<mamelayout version="2">
<element name="digit" defstate="0">
<led7seg>
<color red="1.0" green="0.25" blue="0.0" />
</led7seg>
</element>
<element name="red_led">
<disk><color red="1.0" green="0.0" blue="0.0" /></disk>
</element>
<element name="background">
<rect>
<bounds left="0" top="0" right="1" bottom="1" />
<color red="0.0" green="0.0" blue="0.0" />
</rect>
</element>
<element name="P0"><text string="Ball / Match"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P1"><text string="Credits"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P3"><text string="Player 1"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P4"><text string="Player 2"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P5"><text string="Player 3"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<element name="P6"><text string="Player 4"><color red="1.0" green="1.0" blue="1.0" /></text></element>
<view name="Default Layout">
<!-- Background -->
<backdrop element="background">
<bounds left="0" top="20" right="274" bottom="394" />
</backdrop>
<!-- LEDs -->
<!-- Player 1 Score -->
<bezel name="digit0" element="digit">
<bounds left="10" top="45" right="44" bottom="84" />
</bezel>
<bezel name="digit1" element="digit">
<bounds left="54" top="45" right="88" bottom="84" />
</bezel>
<bezel name="digit2" element="digit">
<bounds left="98" top="45" right="132" bottom="84" />
</bezel>
<bezel name="digit3" element="digit">
<bounds left="142" top="45" right="176" bottom="84" />
</bezel>
<bezel name="digit4" element="digit">
<bounds left="186" top="45" right="220" bottom="84" />
</bezel>
<bezel name="digit5" element="digit">
<bounds left="230" top="45" right="264" bottom="84" />
</bezel>
<!-- Player 2 Score -->
<bezel name="digit8" element="digit">
<bounds left="10" top="105" right="44" bottom="144" />
</bezel>
<bezel name="digit9" element="digit">
<bounds left="54" top="105" right="88" bottom="144" />
</bezel>
<bezel name="digit10" element="digit">
<bounds left="98" top="105" right="132" bottom="144" />
</bezel>
<bezel name="digit11" element="digit">
<bounds left="142" top="105" right="176" bottom="144" />
</bezel>
<bezel name="digit12" element="digit">
<bounds left="186" top="105" right="220" bottom="144" />
</bezel>
<bezel name="digit13" element="digit">
<bounds left="230" top="105" right="264" bottom="144" />
</bezel>
<!-- Player 3 Score -->
<bezel name="digit16" element="digit">
<bounds left="10" top="165" right="44" bottom="204" />
</bezel>
<bezel name="digit17" element="digit">
<bounds left="54" top="165" right="88" bottom="204" />
</bezel>
<bezel name="digit18" element="digit">
<bounds left="98" top="165" right="132" bottom="204" />
</bezel>
<bezel name="digit19" element="digit">
<bounds left="142" top="165" right="176" bottom="204" />
</bezel>
<bezel name="digit20" element="digit">
<bounds left="186" top="165" right="220" bottom="204" />
</bezel>
<bezel name="digit21" element="digit">
<bounds left="230" top="165" right="264" bottom="204" />
</bezel>
<!-- Player 4 Score -->
<bezel name="digit24" element="digit">
<bounds left="10" top="225" right="44" bottom="264" />
</bezel>
<bezel name="digit25" element="digit">
<bounds left="54" top="225" right="88" bottom="264" />
</bezel>
<bezel name="digit26" element="digit">
<bounds left="98" top="225" right="132" bottom="264" />
</bezel>
<bezel name="digit27" element="digit">
<bounds left="142" top="225" right="176" bottom="264" />
</bezel>
<bezel name="digit28" element="digit">
<bounds left="186" top="225" right="220" bottom="264" />
</bezel>
<bezel name="digit29" element="digit">
<bounds left="230" top="225" right="264" bottom="264" />
</bezel>
<!-- Credits and Balls -->
<bezel name="digit14" element="digit">
<bounds left="10" top="345" right="44" bottom="384" />
</bezel>
<bezel name="digit15" element="digit">
<bounds left="54" top="345" right="88" bottom="384" />
</bezel>
<bezel name="digit8" element="digit">
<bounds left="186" top="345" right="220" bottom="384" />
</bezel>
<bezel name="digit7" element="digit">
<bounds left="230" top="345" right="264" bottom="384" />
</bezel>
<bezel element="P0"><bounds left="200" right="258" top="330" bottom="342" /></bezel>
<bezel element="P1"><bounds left="30" right="88" top="330" bottom="342" /></bezel>
<bezel name="text3" element="P3"><bounds left="100" right="180" top="30" bottom="42" /></bezel>
<bezel name="text2" element="P4"><bounds left="100" right="180" top="90" bottom="102" /></bezel>
<bezel name="text1" element="P5"><bounds left="100" right="180" top="150" bottom="162" /></bezel>
<bezel name="text0" element="P6"><bounds left="100" right="180" top="210" bottom="222" /></bezel>
<bezel name="led0" element="red_led">
<bounds left="110" right="125" top="360" bottom="375" /></bezel>
<bezel name="led1" element="red_led">
<bounds left="144" right="159" top="360" bottom="375" /></bezel>
</view>
</mamelayout>

View File

@ -2232,6 +2232,8 @@ $(DRIVERS)/s6.o: $(LAYOUT)/s6.lh
$(DRIVERS)/s6a.o: $(LAYOUT)/s6a.lh
$(DRIVERS)/s8.o: $(LAYOUT)/s8.lh
$(DRIVERS)/sbrkout.o: $(LAYOUT)/sbrkout.lh
$(DRIVERS)/sderby.o: $(LAYOUT)/sderby.lh \