trunk/src/mess/drivers/ngp.c
| r18562 | r18563 | |
| 122 | 122 | { |
| 123 | 123 | public: |
| 124 | 124 | ngp_state(const machine_config &mconfig, device_type type, const char *tag) |
| 125 | | : driver_device(mconfig, type, tag) { } |
| 125 | : driver_device(mconfig, type, tag) |
| 126 | , m_tlcs900( *this, "maincpu" ) |
| 127 | , m_z80( *this, "soundcpu" ) |
| 128 | , m_dac_l( *this, "dac_l" ) |
| 129 | , m_dac_r( *this, "dac_r" ) |
| 130 | { } |
| 126 | 131 | |
| 127 | 132 | virtual void machine_start(); |
| 128 | 133 | virtual void machine_reset(); |
| r18562 | r18563 | |
| 141 | 146 | UINT8 command[2]; |
| 142 | 147 | } m_flash_chip[2]; |
| 143 | 148 | |
| 144 | | device_t *m_tlcs900; |
| 145 | | device_t *m_z80; |
| 149 | required_device<cpu_device> m_tlcs900; |
| 150 | required_device<cpu_device> m_z80; |
| 146 | 151 | device_t *m_t6w28; |
| 147 | | dac_device *m_dac_l; |
| 148 | | dac_device *m_dac_r; |
| 152 | required_device<dac_device> m_dac_l; |
| 153 | required_device<dac_device> m_dac_r; |
| 149 | 154 | device_t *m_k1ge; |
| 150 | 155 | |
| 151 | 156 | DECLARE_READ8_MEMBER( ngp_io_r ); |
| r18562 | r18563 | |
| 260 | 265 | switch( data ) |
| 261 | 266 | { |
| 262 | 267 | case 0x55: /* Enable Z80 */ |
| 263 | | m_z80->execute().resume(SUSPEND_REASON_HALT ); |
| 268 | m_z80->resume(SUSPEND_REASON_HALT ); |
| 264 | 269 | m_z80->reset(); |
| 265 | | m_z80->execute().set_input_line(0, CLEAR_LINE ); |
| 270 | m_z80->set_input_line(0, CLEAR_LINE ); |
| 266 | 271 | break; |
| 267 | 272 | case 0xAA: /* Disable Z80 */ |
| 268 | | m_z80->execute().suspend(SUSPEND_REASON_HALT, 1 ); |
| 273 | m_z80->suspend(SUSPEND_REASON_HALT, 1 ); |
| 269 | 274 | break; |
| 270 | 275 | } |
| 271 | 276 | break; |
| 272 | 277 | |
| 273 | 278 | case 0x3a: /* Trigger Z80 NMI */ |
| 274 | | m_z80->execute().set_input_line(INPUT_LINE_NMI, PULSE_LINE ); |
| 279 | m_z80->set_input_line(INPUT_LINE_NMI, PULSE_LINE ); |
| 275 | 280 | break; |
| 276 | 281 | } |
| 277 | 282 | m_io_reg[offset] = data; |
| r18562 | r18563 | |
| 527 | 532 | |
| 528 | 533 | WRITE8_MEMBER( ngp_state::ngp_z80_signal_main_w ) |
| 529 | 534 | { |
| 530 | | m_tlcs900->execute().set_input_line(TLCS900_INT5, ASSERT_LINE ); |
| 535 | m_tlcs900->set_input_line(TLCS900_INT5, ASSERT_LINE ); |
| 531 | 536 | } |
| 532 | 537 | |
| 533 | 538 | |
| r18562 | r18563 | |
| 541 | 546 | |
| 542 | 547 | WRITE8_MEMBER( ngp_state::ngp_z80_clear_irq ) |
| 543 | 548 | { |
| 544 | | m_z80->execute().set_input_line(0, CLEAR_LINE ); |
| 549 | m_z80->set_input_line(0, CLEAR_LINE ); |
| 545 | 550 | |
| 546 | 551 | /* I am not exactly sure what causes the maincpu INT5 signal to be cleared. This will do for now. */ |
| 547 | | m_tlcs900->execute().set_input_line(TLCS900_INT5, CLEAR_LINE ); |
| 552 | m_tlcs900->set_input_line(TLCS900_INT5, CLEAR_LINE ); |
| 548 | 553 | } |
| 549 | 554 | |
| 550 | 555 | |
| r18562 | r18563 | |
| 558 | 563 | |
| 559 | 564 | if ( m_io_reg[0x33] & 0x04 ) |
| 560 | 565 | { |
| 561 | | m_tlcs900->execute().set_input_line(TLCS900_NMI, |
| 562 | | (machine().root_device().ioport("Power")->read() & 0x01 ) ? CLEAR_LINE : ASSERT_LINE ); |
| 566 | m_tlcs900->set_input_line(TLCS900_NMI, (machine().root_device().ioport("Power")->read() & 0x01 ) ? CLEAR_LINE : ASSERT_LINE ); |
| 563 | 567 | } |
| 564 | 568 | } |
| 565 | 569 | |
| r18562 | r18563 | |
| 582 | 586 | |
| 583 | 587 | WRITE8_MEMBER( ngp_state::ngp_vblank_pin_w ) |
| 584 | 588 | { |
| 585 | | m_tlcs900->execute().set_input_line(TLCS900_INT4, data ? ASSERT_LINE : CLEAR_LINE ); |
| 589 | m_tlcs900->set_input_line(TLCS900_INT4, data ? ASSERT_LINE : CLEAR_LINE ); |
| 586 | 590 | } |
| 587 | 591 | |
| 588 | 592 | |
| 589 | 593 | WRITE8_MEMBER( ngp_state::ngp_hblank_pin_w ) |
| 590 | 594 | { |
| 591 | | m_tlcs900->execute().set_input_line(TLCS900_TIO, data ? ASSERT_LINE : CLEAR_LINE ); |
| 595 | m_tlcs900->set_input_line(TLCS900_TIO, data ? ASSERT_LINE : CLEAR_LINE ); |
| 592 | 596 | } |
| 593 | 597 | |
| 594 | 598 | |
| 595 | 599 | WRITE8_MEMBER( ngp_state::ngp_tlcs900_to3 ) |
| 596 | 600 | { |
| 597 | 601 | if ( data && ! m_old_to3 ) |
| 598 | | m_z80->execute().set_input_line(0, ASSERT_LINE ); |
| 602 | m_z80->set_input_line(0, ASSERT_LINE ); |
| 599 | 603 | |
| 600 | 604 | m_old_to3 = data; |
| 601 | 605 | } |
| r18562 | r18563 | |
| 611 | 615 | void ngp_state::machine_reset() |
| 612 | 616 | { |
| 613 | 617 | m_old_to3 = 0; |
| 614 | | m_tlcs900 = machine().device( "maincpu" ); |
| 615 | | m_z80 = machine().device( "soundcpu" ); |
| 616 | 618 | m_t6w28 = machine().device( "t6w28" ); |
| 617 | | m_dac_l = machine().device<dac_device>( "dac_l" ); |
| 618 | | m_dac_r = machine().device<dac_device>( "dac_r" ); |
| 619 | 619 | m_k1ge = machine().device( "k1ge" ); |
| 620 | 620 | |
| 621 | | m_z80->execute().suspend(SUSPEND_REASON_HALT, 1 ); |
| 622 | | m_z80->execute().set_input_line(0, CLEAR_LINE ); |
| 621 | m_z80->suspend(SUSPEND_REASON_HALT, 1 ); |
| 622 | m_z80->set_input_line(0, CLEAR_LINE ); |
| 623 | 623 | } |
| 624 | 624 | |
| 625 | 625 | |