trunk/src/mame/drivers/s3.c
| r18588 | r18589 | |
| 3 | 3 | Pinball |
| 4 | 4 | Williams System 3 |
| 5 | 5 | |
| 6 | Typical of Williams hardware: Motorola 8-bit CPUs, and lots of PIAs. |
| 7 | |
| 8 | Sound doesn't work because the diagram doesn't show where the sound data |
| 9 | comes from. (variable m_sound_data needs to be written to). |
| 10 | |
| 6 | 11 | ************************************************************************************/ |
| 7 | 12 | |
| 8 | 13 | |
| 9 | | #include "emu.h" |
| 14 | #include "machine/genpin.h" |
| 10 | 15 | #include "cpu/m6800/m6800.h" |
| 16 | #include "machine/6821pia.h" |
| 17 | #include "sound/dac.h" |
| 18 | //#include "s3.lh" |
| 11 | 19 | |
| 12 | | class williams_s3_state : public driver_device |
| 20 | |
| 21 | class s3_state : public genpin_class |
| 13 | 22 | { |
| 14 | 23 | public: |
| 15 | | williams_s3_state(const machine_config &mconfig, device_type type, const char *tag) |
| 16 | | : driver_device(mconfig, type, tag), |
| 17 | | m_maincpu(*this, "maincpu") |
| 24 | s3_state(const machine_config &mconfig, device_type type, const char *tag) |
| 25 | : genpin_class(mconfig, type, tag), |
| 26 | m_maincpu(*this, "maincpu"), |
| 27 | m_dac(*this, "dac"), |
| 28 | m_pia0(*this, "pia0"), |
| 29 | m_pia1(*this, "pia1"), |
| 30 | m_pia2(*this, "pia2"), |
| 31 | m_pia3(*this, "pia3"), |
| 32 | m_pia4(*this, "pia4") |
| 18 | 33 | { } |
| 19 | 34 | |
| 35 | DECLARE_READ8_MEMBER(dac_r); |
| 36 | DECLARE_WRITE8_MEMBER(dac_w); |
| 37 | DECLARE_READ_LINE_MEMBER(cb1_r); |
| 38 | TIMER_DEVICE_CALLBACK_MEMBER(irq); |
| 20 | 39 | protected: |
| 21 | 40 | |
| 22 | 41 | // devices |
| 23 | 42 | required_device<cpu_device> m_maincpu; |
| 43 | required_device<dac_device> m_dac; |
| 44 | required_device<pia6821_device> m_pia0; |
| 45 | required_device<pia6821_device> m_pia1; |
| 46 | required_device<pia6821_device> m_pia2; |
| 47 | required_device<pia6821_device> m_pia3; |
| 48 | required_device<pia6821_device> m_pia4; |
| 24 | 49 | |
| 25 | 50 | // driver_device overrides |
| 26 | 51 | virtual void machine_reset(); |
| 27 | | public: |
| 28 | | DECLARE_DRIVER_INIT(williams_s3); |
| 52 | private: |
| 53 | UINT8 m_t_c; |
| 54 | UINT8 m_sound_data; |
| 55 | bool m_cb1; |
| 29 | 56 | }; |
| 30 | 57 | |
| 31 | | static ADDRESS_MAP_START( williams_s3_map, AS_PROGRAM, 8, williams_s3_state ) |
| 58 | static ADDRESS_MAP_START( s3_main_map, AS_PROGRAM, 8, s3_state ) |
| 32 | 59 | ADDRESS_MAP_GLOBAL_MASK(0x7fff) |
| 33 | 60 | AM_RANGE(0x0000, 0x01ff) AM_RAM |
| 34 | | //AM_RANGE(0x2200, 0x2203) AM_WRITE |
| 35 | | //AM_RANGE(0x2400, 0x2403) AM_WRITE |
| 36 | | //AM_RANGE(0x2800, 0x2803) AM_WRITE |
| 61 | AM_RANGE(0x2200, 0x2203) AM_DEVREADWRITE("pia0", pia6821_device, read, write) // solenoids |
| 62 | AM_RANGE(0x2400, 0x2403) AM_DEVREADWRITE("pia1", pia6821_device, read, write) // lamps |
| 63 | AM_RANGE(0x2800, 0x2803) AM_DEVREADWRITE("pia2", pia6821_device, read, write) // display |
| 64 | AM_RANGE(0x3000, 0x3003) AM_DEVREADWRITE("pia3", pia6821_device, read, write) // inputs |
| 37 | 65 | AM_RANGE(0x6000, 0x67ff) AM_ROM |
| 38 | 66 | AM_RANGE(0x7000, 0x7fff) AM_ROM |
| 39 | 67 | ADDRESS_MAP_END |
| 40 | 68 | |
| 41 | | static ADDRESS_MAP_START( williams_s3_sub_map, AS_PROGRAM, 8, williams_s3_state ) |
| 42 | | ADDRESS_MAP_GLOBAL_MASK(0x7fff) |
| 69 | static ADDRESS_MAP_START( s3_audio_map, AS_PROGRAM, 8, s3_state ) |
| 70 | ADDRESS_MAP_GLOBAL_MASK(0xfff) |
| 43 | 71 | AM_RANGE(0x0000, 0x007f) AM_RAM |
| 44 | | //AM_RANGE(0x0400, 0x0403) AM_WRITE |
| 45 | | AM_RANGE(0x7800, 0x7fff) AM_ROM |
| 72 | AM_RANGE(0x0400, 0x0403) AM_DEVREADWRITE("pia4", pia6821_device, read, write) // sounds |
| 73 | AM_RANGE(0x0800, 0x0fff) AM_ROM |
| 46 | 74 | ADDRESS_MAP_END |
| 47 | 75 | |
| 48 | | static INPUT_PORTS_START( williams_s3 ) |
| 76 | static INPUT_PORTS_START( s3 ) |
| 49 | 77 | INPUT_PORTS_END |
| 50 | 78 | |
| 51 | | void williams_s3_state::machine_reset() |
| 79 | void s3_state::machine_reset() |
| 52 | 80 | { |
| 81 | m_t_c = 0; |
| 53 | 82 | } |
| 54 | 83 | |
| 55 | | DRIVER_INIT_MEMBER(williams_s3_state,williams_s3) |
| 84 | static const pia6821_interface pia0_intf = |
| 56 | 85 | { |
| 86 | DEVCB_NULL, /* port A in */ |
| 87 | DEVCB_NULL, /* port B in */ |
| 88 | DEVCB_NULL, /* line CA1 in */ |
| 89 | DEVCB_NULL, /* line CB1 in */ |
| 90 | DEVCB_NULL, /* line CA2 in */ |
| 91 | DEVCB_NULL, /* line CB2 in */ |
| 92 | DEVCB_NULL, /* port A out */ |
| 93 | DEVCB_NULL, /* port B out */ |
| 94 | DEVCB_NULL, /* line CA2 out */ |
| 95 | DEVCB_NULL, /* port CB2 out */ |
| 96 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ |
| 97 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ |
| 98 | }; |
| 99 | |
| 100 | static const pia6821_interface pia1_intf = |
| 101 | { |
| 102 | DEVCB_NULL, /* port A in */ |
| 103 | DEVCB_NULL, /* port B in */ |
| 104 | DEVCB_NULL, /* line CA1 in */ |
| 105 | DEVCB_NULL, /* line CB1 in */ |
| 106 | DEVCB_NULL, /* line CA2 in */ |
| 107 | DEVCB_NULL, /* line CB2 in */ |
| 108 | DEVCB_NULL, /* port A out */ |
| 109 | DEVCB_NULL, /* port B out */ |
| 110 | DEVCB_NULL, /* line CA2 out */ |
| 111 | DEVCB_NULL, /* port CB2 out */ |
| 112 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ |
| 113 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ |
| 114 | }; |
| 115 | |
| 116 | static const pia6821_interface pia2_intf = |
| 117 | { |
| 118 | DEVCB_NULL, /* port A in */ |
| 119 | DEVCB_NULL, /* port B in */ |
| 120 | DEVCB_NULL, /* line CA1 in */ |
| 121 | DEVCB_NULL, /* line CB1 in */ |
| 122 | DEVCB_NULL, /* line CA2 in */ |
| 123 | DEVCB_NULL, /* line CB2 in */ |
| 124 | DEVCB_NULL, /* port A out */ |
| 125 | DEVCB_NULL, /* port B out */ |
| 126 | DEVCB_NULL, /* line CA2 out */ |
| 127 | DEVCB_NULL, /* port CB2 out */ |
| 128 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ |
| 129 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ |
| 130 | }; |
| 131 | |
| 132 | static const pia6821_interface pia3_intf = |
| 133 | { |
| 134 | DEVCB_NULL, /* port A in */ |
| 135 | DEVCB_NULL, /* port B in */ |
| 136 | DEVCB_NULL, /* line CA1 in */ |
| 137 | DEVCB_NULL, /* line CB1 in */ |
| 138 | DEVCB_NULL, /* line CA2 in */ |
| 139 | DEVCB_NULL, /* line CB2 in */ |
| 140 | DEVCB_NULL, /* port A out */ |
| 141 | DEVCB_NULL, /* port B out */ |
| 142 | DEVCB_NULL, /* line CA2 out */ |
| 143 | DEVCB_NULL, /* port CB2 out */ |
| 144 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ |
| 145 | DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ |
| 146 | }; |
| 147 | |
| 148 | READ_LINE_MEMBER( s3_state::cb1_r ) |
| 149 | { |
| 150 | return m_cb1; |
| 57 | 151 | } |
| 58 | | static MACHINE_CONFIG_START( williams_s3, williams_s3_state ) |
| 152 | |
| 153 | READ8_MEMBER( s3_state::dac_r ) |
| 154 | { |
| 155 | m_cb1 = (m_sound_data < 255); |
| 156 | // add code to activate cb1 |
| 157 | return m_sound_data; |
| 158 | } |
| 159 | |
| 160 | WRITE8_MEMBER( s3_state::dac_w ) |
| 161 | { |
| 162 | m_dac->write_unsigned8(data); |
| 163 | } |
| 164 | |
| 165 | static const pia6821_interface pia4_intf = |
| 166 | { |
| 167 | DEVCB_NULL, /* port A in */ |
| 168 | DEVCB_NULL, /* port B in */ |
| 169 | DEVCB_NULL, /* line CA1 in */ |
| 170 | DEVCB_DRIVER_LINE_MEMBER(s3_state, cb1_r), /* line CB1 in */ |
| 171 | DEVCB_NULL, /* line CA2 in */ |
| 172 | DEVCB_NULL, /* line CB2 in */ |
| 173 | DEVCB_DRIVER_MEMBER(s3_state, dac_w), /* port A out */ |
| 174 | DEVCB_NULL, /* port B out */ |
| 175 | DEVCB_NULL, /* line CA2 out */ |
| 176 | DEVCB_NULL, /* port CB2 out */ |
| 177 | DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE), /* IRQA */ |
| 178 | DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE) /* IRQB */ |
| 179 | }; |
| 180 | |
| 181 | TIMER_DEVICE_CALLBACK_MEMBER( s3_state::irq) |
| 182 | { |
| 183 | if (m_t_c > 0x10) |
| 184 | m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE); |
| 185 | else |
| 186 | m_t_c++; |
| 187 | m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE); |
| 188 | } |
| 189 | |
| 190 | static MACHINE_CONFIG_START( s3, s3_state ) |
| 59 | 191 | /* basic machine hardware */ |
| 60 | | MCFG_CPU_ADD("maincpu", M6800, 3580000 / 4) |
| 61 | | MCFG_CPU_PROGRAM_MAP(williams_s3_map) |
| 62 | | MCFG_CPU_ADD("cpu2", M6800, 3580000 / 4) |
| 63 | | MCFG_CPU_PROGRAM_MAP(williams_s3_sub_map) |
| 192 | MCFG_CPU_ADD("maincpu", M6800, 3580000) |
| 193 | MCFG_CPU_PROGRAM_MAP(s3_main_map) |
| 194 | MCFG_CPU_ADD("audiocpu", M6802, 3580000) |
| 195 | MCFG_CPU_PROGRAM_MAP(s3_audio_map) |
| 196 | MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s3_state, irq, attotime::from_hz(1000)) |
| 197 | |
| 198 | /* Video */ |
| 199 | //MCFG_DEFAULT_LAYOUT(layout_s3) |
| 200 | |
| 201 | /* Sound */ |
| 202 | MCFG_FRAGMENT_ADD( genpin_audio ) |
| 203 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 204 | MCFG_SOUND_ADD("dac", DAC, 0) |
| 205 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) |
| 206 | |
| 207 | /* Devices */ |
| 208 | MCFG_PIA6821_ADD("pia0", pia0_intf) |
| 209 | MCFG_PIA6821_ADD("pia1", pia1_intf) |
| 210 | MCFG_PIA6821_ADD("pia2", pia2_intf) |
| 211 | MCFG_PIA6821_ADD("pia3", pia3_intf) |
| 212 | MCFG_PIA6821_ADD("pia4", pia4_intf) |
| 64 | 213 | MACHINE_CONFIG_END |
| 65 | 214 | |
| 66 | 215 | /*------------------------------------- |
| r18588 | r18589 | |
| 72 | 221 | ROM_LOAD("white1.716", 0x7000, 0x0800, CRC(9bbbf14f) SHA1(b0542ffdd683fa0ea4a9819576f3789cd5a4b2eb)) |
| 73 | 222 | ROM_LOAD("white2.716", 0x7800, 0x0800, CRC(4d4010dd) SHA1(11221124fef3b7bf82d353d65ce851495f6946a7)) |
| 74 | 223 | |
| 75 | | ROM_REGION(0x10000, "cpu2", 0) |
| 76 | | ROM_LOAD("sound1.716", 0x7800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 224 | ROM_REGION(0x10000, "audiocpu", 0) |
| 225 | ROM_LOAD("sound1.716", 0x0800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 77 | 226 | ROM_END |
| 78 | 227 | |
| 79 | 228 | /*------------------------------------- |
| r18588 | r18589 | |
| 85 | 234 | ROM_LOAD("white1.716", 0x7000, 0x0800, CRC(9bbbf14f) SHA1(b0542ffdd683fa0ea4a9819576f3789cd5a4b2eb)) |
| 86 | 235 | ROM_LOAD("white2.716", 0x7800, 0x0800, CRC(4d4010dd) SHA1(11221124fef3b7bf82d353d65ce851495f6946a7)) |
| 87 | 236 | |
| 88 | | ROM_REGION(0x10000, "cpu2", 0) |
| 89 | | ROM_LOAD("sound1.716", 0x7800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 237 | ROM_REGION(0x10000, "audiocpu", 0) |
| 238 | ROM_LOAD("sound1.716", 0x0800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 90 | 239 | ROM_END |
| 91 | 240 | |
| 92 | 241 | /*---------------------------- |
| r18588 | r18589 | |
| 98 | 247 | ROM_LOAD("white1.716", 0x7000, 0x0800, CRC(9bbbf14f) SHA1(b0542ffdd683fa0ea4a9819576f3789cd5a4b2eb)) |
| 99 | 248 | ROM_LOAD("white2.716", 0x7800, 0x0800, CRC(4d4010dd) SHA1(11221124fef3b7bf82d353d65ce851495f6946a7)) |
| 100 | 249 | |
| 101 | | ROM_REGION(0x10000, "cpu2", ROMREGION_ERASEFF) |
| 250 | ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF) |
| 102 | 251 | ROM_END |
| 103 | 252 | |
| 104 | 253 | /*--------------------------------- |
| r18588 | r18589 | |
| 110 | 259 | ROM_LOAD("white1.716", 0x7000, 0x0800, CRC(9bbbf14f) SHA1(b0542ffdd683fa0ea4a9819576f3789cd5a4b2eb)) |
| 111 | 260 | ROM_LOAD("white2.716", 0x7800, 0x0800, CRC(4d4010dd) SHA1(11221124fef3b7bf82d353d65ce851495f6946a7)) |
| 112 | 261 | |
| 113 | | ROM_REGION(0x10000, "cpu2", ROMREGION_ERASEFF) |
| 262 | ROM_REGION(0x10000, "audiocpu", ROMREGION_ERASEFF) |
| 114 | 263 | ROM_END |
| 115 | 264 | |
| 116 | 265 | /*------------------------------------- |
| r18588 | r18589 | |
| 122 | 271 | ROM_LOAD("white1.716", 0x7000, 0x0800, CRC(9bbbf14f) SHA1(b0542ffdd683fa0ea4a9819576f3789cd5a4b2eb)) |
| 123 | 272 | ROM_LOAD("white2wc.716", 0x7800, 0x0800, CRC(618d15b5) SHA1(527387893eeb2cd4aa563a4cfb1948a15d2ed741)) |
| 124 | 273 | |
| 125 | | ROM_REGION(0x10000, "cpu2", 0) |
| 126 | | ROM_LOAD("sound1.716", 0x7800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 274 | ROM_REGION(0x10000, "audiocpu", 0) |
| 275 | ROM_LOAD("sound1.716", 0x0800, 0x0800, CRC(f4190ca3) SHA1(ee234fb5c894fca5876ee6dc7ea8e89e7e0aec9c)) |
| 127 | 276 | ROM_END |
| 128 | 277 | |
| 129 | 278 | |
| 130 | | GAME( 1977, httip_l1, 0, williams_s3, williams_s3, williams_s3_state, williams_s3, ROT0, "Williams", "Hot Tip (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 131 | | GAME( 1977, lucky_l1, 0, williams_s3, williams_s3, williams_s3_state, williams_s3, ROT0, "Williams", "Lucky Seven (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 132 | | GAME( 1978, wldcp_l1, 0, williams_s3, williams_s3, williams_s3_state, williams_s3, ROT0, "Williams", "World Cup Soccer (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 133 | | GAME( 1978, cntct_l1, 0, williams_s3, williams_s3, williams_s3_state, williams_s3, ROT0, "Williams", "Contact (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 134 | | GAME( 1978, disco_l1, 0, williams_s3, williams_s3, williams_s3_state, williams_s3, ROT0, "Williams", "Disco Fever (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 279 | GAME( 1977, httip_l1, 0, s3, s3, driver_device, 0, ROT0, "Williams", "Hot Tip (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 280 | GAME( 1977, lucky_l1, 0, s3, s3, driver_device, 0, ROT0, "Williams", "Lucky Seven (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 281 | GAME( 1978, wldcp_l1, 0, s3, s3, driver_device, 0, ROT0, "Williams", "World Cup Soccer (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 282 | GAME( 1978, cntct_l1, 0, s3, s3, driver_device, 0, ROT0, "Williams", "Contact (L-1)", GAME_IS_SKELETON_MECHANICAL) |
| 283 | GAME( 1978, disco_l1, 0, s3, s3, driver_device, 0, ROT0, "Williams", "Disco Fever (L-1)", GAME_IS_SKELETON_MECHANICAL) |