trunk/src/mame/drivers/de_2.c
| r21885 | r21886 | |
| 12 | 12 | #include "sound/msm5205.h" |
| 13 | 13 | #include "de2.lh" |
| 14 | 14 | |
| 15 | // To start Secret Service, hold I, O and Left ALT while pressing Start. |
| 16 | |
| 15 | 17 | // Data East CPU board is similar to Williams System 11, but without the generic audio board. |
| 16 | 18 | // For now, we'll presume the timings are the same. |
| 17 | 19 | |
| r21885 | r21886 | |
| 31 | 33 | de_2_state(const machine_config &mconfig, device_type type, const char *tag) |
| 32 | 34 | : genpin_class(mconfig, type, tag), |
| 33 | 35 | m_maincpu(*this, "maincpu"), |
| 34 | | m_audiocpu(*this, "audiocpu"), |
| 35 | 36 | m_ym2151(*this, "ym2151"), |
| 36 | | m_msm5205(*this, "msm5205"), |
| 37 | 37 | m_pia21(*this, "pia21"), |
| 38 | 38 | m_pia24(*this, "pia24"), |
| 39 | 39 | m_pia28(*this, "pia28"), |
| 40 | 40 | m_pia2c(*this, "pia2c"), |
| 41 | 41 | m_pia30(*this, "pia30"), |
| 42 | | m_pia34(*this, "pia34") |
| 42 | m_pia34(*this, "pia34"), |
| 43 | m_audiocpu(*this, "audiocpu"), |
| 44 | m_msm5205(*this, "msm5205") |
| 43 | 45 | { } |
| 44 | 46 | |
| 45 | 47 | protected: |
| 46 | 48 | |
| 47 | 49 | // devices |
| 48 | 50 | required_device<cpu_device> m_maincpu; |
| 49 | | required_device<cpu_device> m_audiocpu; |
| 50 | 51 | required_device<ym2151_device> m_ym2151; |
| 51 | | required_device<msm5205_device> m_msm5205; |
| 52 | 52 | required_device<pia6821_device> m_pia21; |
| 53 | 53 | required_device<pia6821_device> m_pia24; |
| 54 | 54 | required_device<pia6821_device> m_pia28; |
| r21885 | r21886 | |
| 77 | 77 | DECLARE_WRITE8_MEMBER(lamp0_w); |
| 78 | 78 | DECLARE_WRITE8_MEMBER(lamp1_w) { }; |
| 79 | 79 | DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w); |
| 80 | DECLARE_WRITE_LINE_MEMBER(msm5205_irq_w); |
| 80 | 81 | DECLARE_WRITE_LINE_MEMBER(pia_irq); |
| 81 | 82 | DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15 |
| 82 | 83 | DECLARE_WRITE8_MEMBER(sol3_w); |
| r21885 | r21886 | |
| 88 | 89 | DECLARE_READ8_MEMBER(sound_latch_r); |
| 89 | 90 | DECLARE_WRITE8_MEMBER(sample_bank_w); |
| 90 | 91 | |
| 92 | required_device<cpu_device> m_audiocpu; |
| 93 | required_device<msm5205_device> m_msm5205; |
| 94 | UINT8 m_sample_data; |
| 95 | bool m_more_data; |
| 96 | bool m_nmi_enable; |
| 97 | |
| 91 | 98 | private: |
| 92 | 99 | UINT32 m_segment1; |
| 93 | 100 | UINT32 m_segment2; |
| r21885 | r21886 | |
| 101 | 108 | |
| 102 | 109 | UINT8 m_sample_bank; |
| 103 | 110 | UINT8 m_msm_prescaler; |
| 104 | | bool m_nmi_enable; |
| 105 | 111 | }; |
| 106 | 112 | |
| 107 | 113 | static ADDRESS_MAP_START( de_2_map, AS_PROGRAM, 8, de_2_state ) |
| r21885 | r21886 | |
| 193 | 199 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O) |
| 194 | 200 | |
| 195 | 201 | PORT_START("INP40") |
| 196 | | PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 202 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LALT) |
| 203 | PORT_BIT( 0xfe, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 197 | 204 | |
| 198 | 205 | PORT_START("INP80") |
| 199 | 206 | PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| r21885 | r21886 | |
| 237 | 244 | MACHINE_RESET_MEMBER(de_2_state, de_2) |
| 238 | 245 | { |
| 239 | 246 | membank("sample_bank")->set_entry(0); |
| 247 | m_more_data = false; |
| 240 | 248 | } |
| 241 | 249 | |
| 242 | 250 | DRIVER_INIT_MEMBER(de_2_state, de_2) |
| 243 | 251 | { |
| 244 | | UINT8 *ROM = memregion("audiocpu")->base(); |
| 252 | UINT8 *ROM = memregion("sound1")->base(); |
| 245 | 253 | m_irq_timer = timer_alloc(TIMER_IRQ); |
| 246 | 254 | m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1); |
| 247 | 255 | m_irq_active = false; |
| r21885 | r21886 | |
| 254 | 262 | m_audiocpu->set_input_line(M6809_IRQ_LINE,state); |
| 255 | 263 | } |
| 256 | 264 | |
| 265 | //WRITE_LINE_MEMBER(de_2_state::msm5205_irq_w) |
| 266 | static void msm5205_irq_w(device_t* device) |
| 267 | { |
| 268 | de_2_state* state = device->machine().driver_data<de_2_state>(); |
| 269 | msm5205_data_w(state->m_msm5205,state->m_sample_data >> 4); |
| 270 | if(state->m_more_data) |
| 271 | { |
| 272 | if(state->m_nmi_enable) |
| 273 | state->m_audiocpu->set_input_line(INPUT_LINE_NMI,PULSE_LINE); // generate NMI when we need more data |
| 274 | state->m_more_data = false; |
| 275 | } |
| 276 | else |
| 277 | { |
| 278 | state->m_more_data = true; |
| 279 | state->m_sample_data <<= 4; |
| 280 | } |
| 281 | } |
| 282 | |
| 257 | 283 | WRITE_LINE_MEMBER(de_2_state::pia_irq) |
| 258 | 284 | { |
| 259 | 285 | if(state == CLEAR_LINE) |
| r21885 | r21886 | |
| 296 | 322 | { |
| 297 | 323 | m_sound_data = data; |
| 298 | 324 | m_audiocpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE); |
| 299 | | popmessage("sound_w: %02x",data); |
| 300 | 325 | } |
| 301 | 326 | |
| 302 | 327 | WRITE_LINE_MEMBER( de_2_state::pia21_ca2_w ) |
| r21885 | r21886 | |
| 498 | 523 | // Sound board |
| 499 | 524 | WRITE8_MEMBER(de_2_state::sample_w) |
| 500 | 525 | { |
| 501 | | msm5205_data_w(m_msm5205,data); |
| 502 | | msm5205_vclk_w(m_msm5205,1); |
| 503 | | msm5205_vclk_w(m_msm5205,0); |
| 526 | m_sample_data = data; |
| 504 | 527 | } |
| 505 | 528 | |
| 506 | 529 | READ8_MEMBER( de_2_state::sound_latch_r ) |
| r21885 | r21886 | |
| 511 | 534 | |
| 512 | 535 | WRITE8_MEMBER( de_2_state::sample_bank_w ) |
| 513 | 536 | { |
| 514 | | UINT8 prescale[4] = { MSM5205_S96_4B, MSM5205_S48_4B, MSM5205_S64_4B, 0 }; |
| 537 | static const UINT8 prescale[4] = { MSM5205_S96_4B, MSM5205_S48_4B, MSM5205_S64_4B, 0 }; |
| 515 | 538 | |
| 516 | | m_sample_bank = (data & 0x03) | ((data & 0x04) << 1); |
| 539 | m_sample_bank = (data & 0x07); |
| 540 | membank("sample_bank")->set_entry(m_sample_bank); |
| 517 | 541 | m_msm_prescaler = (data & 0x30) >> 4; |
| 518 | 542 | m_nmi_enable = (~data & 0x80); |
| 519 | 543 | msm5205_playmode_w(m_msm5205,prescale[m_msm_prescaler]); |
| r21885 | r21886 | |
| 522 | 546 | |
| 523 | 547 | static const msm5205_interface msm5205_intf = |
| 524 | 548 | { |
| 525 | | 0, |
| 526 | | MSM5205_SEX_4B |
| 549 | msm5205_irq_w, |
| 550 | MSM5205_S96_4B |
| 527 | 551 | }; |
| 528 | 552 | |
| 529 | 553 | static MACHINE_CONFIG_START( de_2, de_2_state ) |
| r21885 | r21886 | |
| 554 | 578 | MCFG_YM2151_ADD("ym2151", 3580000) |
| 555 | 579 | MCFG_YM2151_IRQ_HANDLER(WRITELINE(de_2_state, ym2151_irq_w)) |
| 556 | 580 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50) |
| 557 | | MCFG_SOUND_ADD("msm5205", MSM5205, 3580000) |
| 581 | MCFG_SOUND_ADD("msm5205", MSM5205, 384000) |
| 558 | 582 | MCFG_SOUND_CONFIG(msm5205_intf) |
| 559 | 583 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50) |
| 560 | 584 | MACHINE_CONFIG_END |
| r21885 | r21886 | |
| 634 | 658 | ROM_LOAD("sssndf7.rom", 0x8000, 0x8000, CRC(980778d0) SHA1(7c1f14d327b6d0e6d0fef058f96bb1cb440c9330)) |
| 635 | 659 | ROM_REGION(0x40000, "sound1", 0) |
| 636 | 660 | ROM_LOAD("ssv1f6.rom", 0x00000, 0x10000, CRC(ccbc72f8) SHA1(c5c13fb8d05d7fb4005636655073d88b4d12d65e)) |
| 637 | | ROM_RELOAD( 0x10000, 0x10000) |
| 638 | | ROM_LOAD("ssv2f4.rom", 0x20000, 0x10000, CRC(53832d16) SHA1(2227eb784e0221f1bf2bdf7ea48ecd122433f1ea)) |
| 639 | | ROM_RELOAD( 0x30000, 0x10000) |
| 661 | ROM_LOAD("ssv2f4.rom", 0x10000, 0x10000, CRC(53832d16) SHA1(2227eb784e0221f1bf2bdf7ea48ecd122433f1ea)) |
| 640 | 662 | ROM_END |
| 641 | 663 | |
| 642 | 664 | ROM_START(ssvc_b26) |
| r21885 | r21886 | |
| 647 | 669 | ROM_LOAD("sssndf7b.rom", 0x8000, 0x8000, CRC(4bd6b16a) SHA1(b9438a16cd35820628fe6eb82287b2c39fe4b1c6)) |
| 648 | 670 | ROM_REGION(0x40000, "sound1", 0) |
| 649 | 671 | ROM_LOAD("ssv1f6.rom", 0x00000, 0x10000, CRC(ccbc72f8) SHA1(c5c13fb8d05d7fb4005636655073d88b4d12d65e)) |
| 650 | | ROM_RELOAD( 0x10000, 0x10000) |
| 651 | 672 | ROM_LOAD("ssv2f4.rom", 0x20000, 0x10000, CRC(53832d16) SHA1(2227eb784e0221f1bf2bdf7ea48ecd122433f1ea)) |
| 652 | | ROM_RELOAD( 0x30000, 0x10000) |
| 653 | 673 | ROM_END |
| 654 | 674 | |
| 655 | 675 | /*-------------------------------------------------------------------------- |