trunk/src/mame/drivers/s7.c
| r32524 | r32525 | |
| 5 | 5 | PINBALL |
| 6 | 6 | Williams System 7 |
| 7 | 7 | |
| 8 | Diagnostic 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 | |
| 8 | 22 | When first started, it shows the game number and stops. Press F3 to initialise the |
| 9 | 23 | nvram. In theory you can then press the diagnostic buttons; or you then enter coins |
| 10 | 24 | and start playing. |
| r32524 | r32525 | |
| 37 | 51 | |
| 38 | 52 | |
| 39 | 53 | ToDo: |
| 40 | | - Diagnostic buttons do not work |
| 41 | 54 | - Some games have an additional alphanumeric display; not emulated as yet. |
| 42 | 55 | |
| 43 | 56 | |
| r32524 | r32525 | |
| 70 | 83 | { } |
| 71 | 84 | |
| 72 | 85 | DECLARE_READ8_MEMBER(dac_r); |
| 73 | | DECLARE_WRITE8_MEMBER(dac_w); |
| 74 | 86 | DECLARE_WRITE8_MEMBER(dig0_w); |
| 75 | 87 | DECLARE_WRITE8_MEMBER(dig1_w); |
| 76 | 88 | DECLARE_WRITE8_MEMBER(lamp0_w); |
| r32524 | r32525 | |
| 86 | 98 | DECLARE_READ8_MEMBER(nvram_r); |
| 87 | 99 | DECLARE_WRITE8_MEMBER(nvram_w); |
| 88 | 100 | DECLARE_READ_LINE_MEMBER(pia21_ca1_r); |
| 89 | | DECLARE_READ_LINE_MEMBER(pia28_ca1_r); |
| 90 | | DECLARE_READ_LINE_MEMBER(pia28_cb1_r); |
| 91 | 101 | DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w) { }; |
| 92 | 102 | DECLARE_WRITE_LINE_MEMBER(pia21_cb2_w) { }; // enable solenoids |
| 93 | 103 | DECLARE_WRITE_LINE_MEMBER(pia22_ca2_w) { }; //ST5 |
| r32524 | r32525 | |
| 98 | 108 | DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; //ST6 |
| 99 | 109 | DECLARE_WRITE_LINE_MEMBER(pia30_ca2_w) { }; //ST4 |
| 100 | 110 | DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; //ST3 |
| 101 | | TIMER_DEVICE_CALLBACK_MEMBER(irq); |
| 111 | DECLARE_WRITE_LINE_MEMBER(pia_irq); |
| 102 | 112 | DECLARE_INPUT_CHANGED_MEMBER(main_nmi); |
| 103 | 113 | DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); |
| 104 | | DECLARE_INPUT_CHANGED_MEMBER(diag_ca1); |
| 105 | | DECLARE_INPUT_CHANGED_MEMBER(diag_cb1); |
| 106 | 114 | DECLARE_INPUT_CHANGED_MEMBER(diag_coin); |
| 107 | 115 | DECLARE_MACHINE_RESET(s7); |
| 116 | DECLARE_DRIVER_INIT(s7); |
| 108 | 117 | private: |
| 109 | | UINT8 m_t_c; |
| 110 | 118 | UINT8 m_sound_data; |
| 111 | 119 | UINT8 m_strobe; |
| 112 | 120 | UINT8 m_kbdrow; |
| 113 | 121 | UINT8 m_nvram[0x100]; |
| 114 | 122 | bool m_data_ok; |
| 115 | 123 | 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; |
| 116 | 127 | virtual void machine_start(); |
| 117 | 128 | required_device<cpu_device> m_maincpu; |
| 118 | 129 | required_device<cpu_device> m_audiocpu; |
| r32524 | r32525 | |
| 228 | 239 | PORT_START("DIAGS") |
| 229 | 240 | 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) |
| 230 | 241 | 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 |
| 234 | 246 | |
| 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 ) |
| 260 | 249 | |
| 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 ) |
| 286 | 252 | INPUT_PORTS_END |
| 287 | 253 | |
| 288 | 254 | INPUT_CHANGED_MEMBER( s7_state::main_nmi ) |
| r32524 | r32525 | |
| 299 | 265 | m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 300 | 266 | } |
| 301 | 267 | |
| 302 | | INPUT_CHANGED_MEMBER( s7_state::diag_ca1 ) |
| 303 | | { |
| 304 | | m_pia28->ca1_w(oldval); // newval inverted by ic5, so use oldval |
| 305 | | } |
| 306 | | |
| 307 | | INPUT_CHANGED_MEMBER( s7_state::diag_cb1 ) |
| 308 | | { |
| 309 | | m_pia28->cb1_w(oldval); // newval inverted by ic5, so use oldval |
| 310 | | } |
| 311 | | |
| 312 | 268 | INPUT_CHANGED_MEMBER( s7_state::diag_coin ) |
| 313 | 269 | { |
| 314 | 270 | m_memprotect = newval; |
| r32524 | r32525 | |
| 339 | 295 | |
| 340 | 296 | WRITE8_MEMBER( s7_state::lamp0_w ) |
| 341 | 297 | { |
| 342 | | m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE); |
| 343 | 298 | } |
| 344 | 299 | |
| 345 | | READ_LINE_MEMBER( s7_state::pia28_ca1_r ) |
| 346 | | { |
| 347 | | return BIT(ioport("DIAGS")->read(), 2); // advance button |
| 348 | | } |
| 349 | | |
| 350 | | READ_LINE_MEMBER( s7_state::pia28_cb1_r ) |
| 351 | | { |
| 352 | | return BIT(ioport("DIAGS")->read(), 3); // up/down switch |
| 353 | | } |
| 354 | | |
| 355 | 300 | WRITE8_MEMBER( s7_state::dig0_w ) |
| 356 | 301 | { |
| 357 | 302 | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447 |
| 358 | 303 | m_strobe = data & 15; |
| 304 | data ^= 0xf0; // inverted by ic33 |
| 359 | 305 | m_data_ok = true; |
| 360 | 306 | output_set_digit_value(60, patterns[data>>4]); // diag digit |
| 361 | 307 | } |
| r32524 | r32525 | |
| 378 | 324 | switch (m_strobe) |
| 379 | 325 | { |
| 380 | 326 | case 0: |
| 381 | | return ioport("DSW0")->read() & 15; |
| 327 | return ioport("DS2")->read(); |
| 382 | 328 | case 1: |
| 383 | | return ioport("DSW0")->read() << 4; |
| 329 | return ioport("DS2")->read() << 4; |
| 384 | 330 | case 2: |
| 385 | | return ioport("DSW1")->read() & 15; |
| 331 | return ioport("DS1")->read(); |
| 386 | 332 | case 3: |
| 387 | | return ioport("DSW1")->read() << 4; |
| 333 | return ioport("DS1")->read() << 4; |
| 388 | 334 | } |
| 389 | 335 | } |
| 390 | 336 | return 0xff; |
| r32524 | r32525 | |
| 420 | 366 | return m_sound_data; |
| 421 | 367 | } |
| 422 | 368 | |
| 423 | | TIMER_DEVICE_CALLBACK_MEMBER( s7_state::irq ) |
| 369 | WRITE_LINE_MEMBER( s7_state::pia_irq ) |
| 424 | 370 | { |
| 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 | } |
| 427 | 376 | 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 | } |
| 429 | 382 | } |
| 430 | 383 | |
| 384 | void 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 | |
| 431 | 407 | void s7_state::machine_start() |
| 432 | 408 | { |
| 433 | 409 | m_memprotect = 0; |
| r32524 | r32525 | |
| 437 | 413 | |
| 438 | 414 | MACHINE_RESET_MEMBER( s7_state, s7 ) |
| 439 | 415 | { |
| 440 | | m_t_c = 0; |
| 441 | 416 | } |
| 442 | 417 | |
| 418 | DRIVER_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 | |
| 443 | 424 | static MACHINE_CONFIG_START( s7, s7_state ) |
| 444 | 425 | /* basic machine hardware */ |
| 445 | 426 | MCFG_CPU_ADD("maincpu", M6808, 3580000) |
| 446 | 427 | MCFG_CPU_PROGRAM_MAP(s7_main_map) |
| 447 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s7_state, irq, attotime::from_hz(250)) |
| 448 | 428 | MCFG_MACHINE_RESET_OVERRIDE(s7_state, s7) |
| 449 | 429 | |
| 450 | 430 | /* Video */ |
| r32524 | r32525 | |
| 461 | 441 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, sol2_w)) |
| 462 | 442 | MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia21_ca2_w)) |
| 463 | 443 | 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)) |
| 466 | 446 | |
| 467 | 447 | MCFG_DEVICE_ADD("pia22", PIA6821, 0) |
| 468 | 448 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, sol0_w)) |
| 469 | 449 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, sol1_w)) |
| 470 | 450 | MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia22_ca2_w)) |
| 471 | 451 | 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)) |
| 474 | 454 | |
| 475 | 455 | MCFG_DEVICE_ADD("pia24", PIA6821, 0) |
| 476 | 456 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, lamp0_w)) |
| 477 | 457 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, lamp1_w)) |
| 478 | 458 | MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia24_ca2_w)) |
| 479 | 459 | 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)) |
| 482 | 462 | |
| 483 | 463 | MCFG_DEVICE_ADD("pia28", PIA6821, 0) |
| 484 | 464 | 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)) |
| 487 | 465 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(s7_state, dig0_w)) |
| 488 | 466 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s7_state, dig1_w)) |
| 489 | 467 | MCFG_PIA_CA2_HANDLER(WRITELINE(s7_state, pia28_ca2_w)) |
| 490 | 468 | 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)) |
| 493 | 471 | |
| 494 | 472 | MCFG_DEVICE_ADD("pia30", PIA6821, 0) |
| 495 | 473 | MCFG_PIA_READPA_HANDLER(READ8(s7_state, switch_r)) |
| r32524 | r32525 | |
| 857 | 835 | |
| 858 | 836 | |
| 859 | 837 | |
| 860 | | GAME( 1980, bk_l4, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-4)", GAME_MECHANICAL ) |
| 861 | | GAME( 1980, bk_f4, bk_l4, s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_MECHANICAL ) |
| 862 | | GAME( 1980, bk_l3, bk_l4, s7, s7, driver_device, 0, ROT0, "Williams", "Black Knight (L-3)", GAME_MECHANICAL ) |
| 863 | | GAME( 1980, csmic_l1, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_MECHANICAL ) |
| 864 | | GAME( 1981, jngld_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Jungle Lord (L-2)", GAME_MECHANICAL ) |
| 865 | | GAME( 1981, jngld_l1, jngld_l2, s7, s7, driver_device, 0, ROT0, "Williams", "Jungle Lord (L-1)", GAME_MECHANICAL ) |
| 866 | | GAME( 1981, pharo_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Pharaoh (L-2)", GAME_MECHANICAL ) |
| 867 | | GAME( 1981, solar_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Solar Fire (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |
| 868 | | GAME( 1982, thund_p1, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-1)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 869 | | GAME( 1982, thund_p2, thund_p1, s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-2)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 870 | | GAME( 1982, thund_p3, thund_p1, s7, s7, driver_device, 0, ROT0, "Williams", "Thunderball (P-3)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 871 | | GAME( 1981, hypbl_l4, 0, s7, s7, driver_device, 0, ROT0, "Williams", "HyperBall (L-4)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 872 | | GAME( 1981, hypbl_l2, hypbl_l4, s7, s7, driver_device, 0, ROT0, "Williams", "HyperBall (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 873 | | GAME( 1981, barra_l1, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Barracora (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |
| 874 | | GAME( 1982, vrkon_l1, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Varkon (L-1)", GAME_MECHANICAL ) |
| 875 | | GAME( 1982, tmfnt_l5, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Time Fantasy (L-5)", GAME_MECHANICAL ) |
| 876 | | GAME( 1982, wrlok_l3, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Warlok (L-3)", GAME_MECHANICAL ) |
| 877 | | GAME( 1982, dfndr_l4, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Defender (L-4)", GAME_MECHANICAL ) |
| 878 | | GAME( 1983, jst_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Joust (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 879 | | GAME( 1983, jst_l1, jst_l2, s7, s7, driver_device, 0, ROT0, "Williams", "Joust (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 880 | | GAME( 1983, lsrcu_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Laser Cue (L-2)", GAME_MECHANICAL ) |
| 881 | | GAME( 1983, fpwr2_l2, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Firepower II (L-2)", GAME_MECHANICAL ) |
| 882 | | GAME( 1984, strlt_l1, 0, s7, s7, driver_device, 0, ROT0, "Williams", "Star Light (L-1)", GAME_MECHANICAL ) |
| 838 | GAME( 1980, bk_l4, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-4)", GAME_MECHANICAL ) |
| 839 | GAME( 1980, bk_f4, bk_l4, s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-4, French speech)", GAME_MECHANICAL ) |
| 840 | GAME( 1980, bk_l3, bk_l4, s7, s7, s7_state, s7, ROT0, "Williams", "Black Knight (L-3)", GAME_MECHANICAL ) |
| 841 | GAME( 1980, csmic_l1, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Cosmic Gunfight (L-1)", GAME_MECHANICAL ) |
| 842 | GAME( 1981, jngld_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Jungle Lord (L-2)", GAME_MECHANICAL ) |
| 843 | GAME( 1981, jngld_l1, jngld_l2, s7, s7, s7_state, s7, ROT0, "Williams", "Jungle Lord (L-1)", GAME_MECHANICAL ) |
| 844 | GAME( 1981, pharo_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Pharaoh (L-2)", GAME_MECHANICAL ) |
| 845 | GAME( 1981, solar_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Solar Fire (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |
| 846 | GAME( 1982, thund_p1, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-1)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 847 | GAME( 1982, thund_p2, thund_p1, s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-2)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 848 | GAME( 1982, thund_p3, thund_p1, s7, s7, s7_state, s7, ROT0, "Williams", "Thunderball (P-3)", GAME_MECHANICAL | GAME_IMPERFECT_SOUND ) |
| 849 | GAME( 1981, hypbl_l4, 0, s7, s7, s7_state, s7, ROT0, "Williams", "HyperBall (L-4)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 850 | GAME( 1981, hypbl_l2, hypbl_l4, s7, s7, s7_state, s7, ROT0, "Williams", "HyperBall (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 851 | GAME( 1981, barra_l1, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Barracora (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |
| 852 | GAME( 1982, vrkon_l1, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Varkon (L-1)", GAME_MECHANICAL ) |
| 853 | GAME( 1982, tmfnt_l5, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Time Fantasy (L-5)", GAME_MECHANICAL ) |
| 854 | GAME( 1982, wrlok_l3, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Warlok (L-3)", GAME_MECHANICAL ) |
| 855 | GAME( 1982, dfndr_l4, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Defender (L-4)", GAME_MECHANICAL ) |
| 856 | GAME( 1983, jst_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Joust (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 857 | GAME( 1983, jst_l1, jst_l2, s7, s7, s7_state, s7, ROT0, "Williams", "Joust (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING ) |
| 858 | GAME( 1983, lsrcu_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Laser Cue (L-2)", GAME_MECHANICAL ) |
| 859 | GAME( 1983, fpwr2_l2, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Firepower II (L-2)", GAME_MECHANICAL ) |
| 860 | GAME( 1984, strlt_l1, 0, s7, s7, s7_state, s7, ROT0, "Williams", "Star Light (L-1)", GAME_MECHANICAL ) |
trunk/src/mame/drivers/s9.c
| r32524 | r32525 | |
| 5 | 5 | PINBALL |
| 6 | 6 | Williams System 9 |
| 7 | 7 | |
| 8 | | When first started, it shows the game number and stops. Press F3 to initialise the |
| 9 | | nvram. In theory you can then press the diagnostic buttons; or you then enter coins |
| 10 | | and start playing. |
| 8 | When first started, it shows the game number and stops. Press F3 to reboot, then it works. |
| 11 | 9 | |
| 12 | | Each game has its own switches, you need to know the outhole and slam-tilt ones. |
| 13 | | Note that T is also a tilt, but it may take 3 hits to activate it. |
| 14 | | |
| 15 | | A number of games are multiball therefore they either cannot start or the outhole |
| 16 | | is ineffective/unknown. All games can coin up. |
| 17 | | |
| 18 | 10 | Rat Race is played in a one-player cocktail cabinet, the player uses a joystick |
| 19 | 11 | to tilt the board, to coax the ball into following lit arrows in a maze. After |
| 20 | 12 | a successful navigation, the maze changes to something else faster and harder. |
| r32524 | r32525 | |
| 23 | 15 | prototype stage. Currently it runs but the player display flashes randoms ones while |
| 24 | 16 | a sound is produced every couple of seconds. |
| 25 | 17 | |
| 18 | Each game has its own switches, you need to know the outhole and slam-tilt ones. |
| 19 | Note that T is also a tilt, but it may take 3 hits to activate it. |
| 26 | 20 | |
| 27 | | Game Outhole Tilt Notes |
| 28 | | ---------------------------------------------------------------------------------- |
| 29 | | Sorcerer Cannot start |
| 30 | | Space Shuttle Cannot start |
| 31 | | Comet Mostly works |
| 32 | | Rat Race Not working |
| 33 | 21 | |
| 22 | Game Outhole Tilt Notes |
| 23 | ---------------------------------------------------------------------------------------- |
| 24 | Sorcerer X - Y To start, hold down X and minus, then press 1. |
| 25 | Space Shuttle S D F Right-shift To start, hold down SDF, then press 1. |
| 26 | Comet Y Right-shift |
| 27 | Rat Race Not working |
| 28 | |
| 34 | 29 | ToDo: |
| 35 | | - Diagnostic buttons do not work |
| 30 | - Mechanical sounds |
| 36 | 31 | |
| 37 | | |
| 38 | 32 | *****************************************************************************************/ |
| 39 | 33 | |
| 40 | 34 | |
| r32524 | r32525 | |
| 65 | 59 | DECLARE_READ8_MEMBER(dac_r); |
| 66 | 60 | DECLARE_WRITE8_MEMBER(dig0_w); |
| 67 | 61 | DECLARE_WRITE8_MEMBER(dig1_w); |
| 68 | | DECLARE_WRITE8_MEMBER(lamp0_w); |
| 62 | DECLARE_WRITE8_MEMBER(lamp0_w) { }; |
| 69 | 63 | DECLARE_WRITE8_MEMBER(lamp1_w) { }; |
| 70 | 64 | 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 |
| 72 | 66 | DECLARE_WRITE8_MEMBER(sound_w); |
| 73 | 67 | DECLARE_READ8_MEMBER(dips_r); |
| 74 | 68 | DECLARE_READ8_MEMBER(switch_r); |
| 75 | 69 | DECLARE_WRITE8_MEMBER(switch_w); |
| 76 | 70 | DECLARE_READ_LINE_MEMBER(pia21_ca1_r); |
| 77 | | DECLARE_READ_LINE_MEMBER(pia28_ca1_r); |
| 78 | | DECLARE_READ_LINE_MEMBER(pia28_cb1_r); |
| 79 | 71 | DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w); |
| 80 | 72 | DECLARE_WRITE_LINE_MEMBER(pia21_cb2_w) { }; // enable solenoids |
| 81 | 73 | DECLARE_WRITE_LINE_MEMBER(pia24_cb2_w) { }; // dummy to stop error log filling up |
| 82 | 74 | DECLARE_WRITE_LINE_MEMBER(pia28_ca2_w) { }; // comma3&4 |
| 83 | 75 | DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2 |
| 84 | | TIMER_DEVICE_CALLBACK_MEMBER(irq); |
| 76 | DECLARE_WRITE_LINE_MEMBER(pia_irq); |
| 85 | 77 | DECLARE_INPUT_CHANGED_MEMBER(main_nmi); |
| 86 | 78 | DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); |
| 87 | 79 | DECLARE_MACHINE_RESET(s9); |
| 80 | DECLARE_DRIVER_INIT(s9); |
| 88 | 81 | private: |
| 89 | | UINT8 m_t_c; |
| 90 | 82 | UINT8 m_sound_data; |
| 91 | 83 | UINT8 m_strobe; |
| 92 | 84 | UINT8 m_kbdrow; |
| 93 | 85 | 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; |
| 94 | 89 | required_device<cpu_device> m_maincpu; |
| 95 | 90 | required_device<cpu_device> m_audiocpu; |
| 96 | 91 | required_device<dac_device> m_dac; |
| r32524 | r32525 | |
| 121 | 116 | |
| 122 | 117 | static INPUT_PORTS_START( s9 ) |
| 123 | 118 | PORT_START("X0") |
| 124 | | PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 119 | PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 125 | 120 | |
| 126 | 121 | PORT_START("X1") |
| 127 | 122 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT ) |
| r32524 | r32525 | |
| 184 | 179 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O) |
| 185 | 180 | |
| 186 | 181 | 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 ) |
| 188 | 187 | |
| 189 | 188 | PORT_START("X80") |
| 190 | 189 | PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| r32524 | r32525 | |
| 196 | 195 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_6_PAD) PORT_TOGGLE |
| 197 | 196 | INPUT_PORTS_END |
| 198 | 197 | |
| 199 | | MACHINE_RESET_MEMBER( s9_state, s9 ) |
| 200 | | { |
| 201 | | m_t_c = 0; |
| 202 | | } |
| 203 | | |
| 204 | 198 | INPUT_CHANGED_MEMBER( s9_state::main_nmi ) |
| 205 | 199 | { |
| 206 | 200 | // Diagnostic button sends a pulse to NMI pin |
| r32524 | r32525 | |
| 215 | 209 | m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); |
| 216 | 210 | } |
| 217 | 211 | |
| 218 | | WRITE8_MEMBER( s9_state::sol3_w ) |
| 219 | | { |
| 220 | | // if (BIT(data, 1)) |
| 221 | | // m_samples->start(0, 6); // knocker |
| 222 | | } |
| 223 | | |
| 224 | 212 | WRITE8_MEMBER( s9_state::sound_w ) |
| 225 | 213 | { |
| 226 | 214 | m_sound_data = data; |
| r32524 | r32525 | |
| 238 | 226 | m_pias->ca1_w(state); |
| 239 | 227 | } |
| 240 | 228 | |
| 241 | | WRITE8_MEMBER( s9_state::lamp0_w ) |
| 242 | | { |
| 243 | | m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE); |
| 244 | | } |
| 245 | | |
| 246 | | READ_LINE_MEMBER( s9_state::pia28_ca1_r ) |
| 247 | | { |
| 248 | | return BIT(ioport("DIAGS")->read(), 2); // advance button |
| 249 | | } |
| 250 | | |
| 251 | | READ_LINE_MEMBER( s9_state::pia28_cb1_r ) |
| 252 | | { |
| 253 | | return BIT(ioport("DIAGS")->read(), 3); // up/down switch |
| 254 | | } |
| 255 | | |
| 256 | 229 | WRITE8_MEMBER( s9_state::dig0_w ) |
| 257 | 230 | { |
| 258 | 231 | static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447 |
| r32524 | r32525 | |
| 290 | 263 | return m_sound_data; |
| 291 | 264 | } |
| 292 | 265 | |
| 293 | | TIMER_DEVICE_CALLBACK_MEMBER( s9_state::irq ) |
| 266 | WRITE_LINE_MEMBER( s9_state::pia_irq ) |
| 294 | 267 | { |
| 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 | } |
| 297 | 273 | 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 | } |
| 299 | 279 | } |
| 300 | 280 | |
| 281 | void 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 | |
| 304 | MACHINE_RESET_MEMBER( s9_state, s9 ) |
| 305 | { |
| 306 | } |
| 307 | |
| 308 | DRIVER_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 | |
| 301 | 314 | static MACHINE_CONFIG_START( s9, s9_state ) |
| 302 | 315 | /* basic machine hardware */ |
| 303 | 316 | MCFG_CPU_ADD("maincpu", M6808, XTAL_4MHz) |
| 304 | 317 | MCFG_CPU_PROGRAM_MAP(s9_main_map) |
| 305 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s9_state, irq, attotime::from_hz(250)) |
| 306 | 318 | MCFG_MACHINE_RESET_OVERRIDE(s9_state, s9) |
| 307 | 319 | |
| 308 | 320 | /* Video */ |
| r32524 | r32525 | |
| 319 | 331 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, sol2_w)) |
| 320 | 332 | MCFG_PIA_CA2_HANDLER(WRITELINE(s9_state, pia21_ca2_w)) |
| 321 | 333 | 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)) |
| 324 | 336 | |
| 325 | 337 | MCFG_DEVICE_ADD("pia24", PIA6821, 0) |
| 326 | 338 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(s9_state, lamp0_w)) |
| 327 | 339 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, lamp1_w)) |
| 328 | 340 | 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)) |
| 331 | 343 | |
| 332 | 344 | 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)) |
| 335 | 345 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(s9_state, dig0_w)) |
| 336 | 346 | MCFG_PIA_WRITEPB_HANDLER(WRITE8(s9_state, dig1_w)) |
| 337 | 347 | MCFG_PIA_CA2_HANDLER(WRITELINE(s9_state, pia28_ca2_w)) |
| 338 | 348 | 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)) |
| 341 | 351 | |
| 342 | 352 | MCFG_DEVICE_ADD("pia30", PIA6821, 0) |
| 343 | 353 | MCFG_PIA_READPA_HANDLER(READ8(s9_state, switch_r)) |
| 344 | 354 | 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)) |
| 347 | 357 | |
| 348 | 358 | MCFG_NVRAM_ADD_0FILL("nvram") |
| 349 | 359 | |
| r32524 | r32525 | |
| 486 | 496 | ROM_END |
| 487 | 497 | |
| 488 | 498 | |
| 489 | | GAME( 1983, ratrc_l1, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Rat Race (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 490 | | GAME( 1985, sorcr_l1, sorcr_l2, s9, s9, driver_device, 0, ROT0, "Williams", "Sorcerer (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 491 | | GAME( 1985, sorcr_l2, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Sorcerer (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 492 | | GAME( 1984, sshtl_l7, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Space Shuttle (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 493 | | GAME( 1985, comet_l4, comet_l5, s9, s9, driver_device, 0, ROT0, "Williams", "Comet (L-4)", GAME_MECHANICAL) |
| 494 | | GAME( 1985, comet_l5, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Comet (L-5)", GAME_MECHANICAL) |
| 495 | | GAME( 1984, szone_l5, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 496 | | GAME( 1984, szone_l2, szone_l5, s9, s9, driver_device, 0, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 497 | | GAME( 1985, alcat_l7, 0, s9, s9, driver_device, 0, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |
| 499 | GAME( 1983, ratrc_l1, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Rat Race (L-1)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 500 | GAME( 1985, sorcr_l1, sorcr_l2, s9, s9, s9_state, s9, ROT0, "Williams", "Sorcerer (L-1)", GAME_MECHANICAL ) |
| 501 | GAME( 1985, sorcr_l2, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Sorcerer (L-2)", GAME_MECHANICAL ) |
| 502 | GAME( 1984, sshtl_l7, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Space Shuttle (L-7)", GAME_MECHANICAL ) |
| 503 | GAME( 1985, comet_l4, comet_l5, s9, s9, s9_state, s9, ROT0, "Williams", "Comet (L-4)", GAME_MECHANICAL) |
| 504 | GAME( 1985, comet_l5, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Comet (L-5)", GAME_MECHANICAL) |
| 505 | GAME( 1984, szone_l5, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-5)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 506 | GAME( 1984, szone_l2, szone_l5, s9, s9, s9_state, s9, ROT0, "Williams", "Strike Zone (Shuffle) (L-2)", GAME_MECHANICAL | GAME_NOT_WORKING) |
| 507 | GAME( 1985, alcat_l7, 0, s9, s9, s9_state, s9, ROT0, "Williams", "Alley Cats (Shuffle) (L-7)", GAME_MECHANICAL | GAME_NOT_WORKING | GAME_NO_SOUND) |