diff --git a/src/mame/drivers/apple3.cpp b/src/mame/drivers/apple3.cpp index be1be563c2f..6b4e05ede0e 100644 --- a/src/mame/drivers/apple3.cpp +++ b/src/mame/drivers/apple3.cpp @@ -28,6 +28,8 @@ #include "bus/rs232/rs232.h" +#include "machine/input_merger.h" + #include "softlist.h" #include "speaker.h" @@ -60,6 +62,10 @@ MACHINE_CONFIG_START(apple3_state::apple3) MCFG_DEVICE_PROGRAM_MAP(apple3_map) MCFG_QUANTUM_TIME(attotime::from_hz(60)) + input_merger_device &mainirq(INPUT_MERGER_ANY_HIGH(config, "mainirq")); + mainirq.output_handler().set_inputline(m_maincpu, m6502_device::IRQ_LINE); + mainirq.output_handler().append(m_via[1], FUNC(via6522_device::write_pa7)).invert(); // this is active low + MCFG_MACHINE_RESET_OVERRIDE(apple3_state, apple3 ) /* video hardware */ @@ -115,12 +121,12 @@ MACHINE_CONFIG_START(apple3_state::apple3) MCFG_SOFTWARE_LIST_ADD("flop525_list","apple3") /* acia */ - MCFG_DEVICE_ADD("acia", MOS6551, 0) - MCFG_MOS6551_XTAL(XTAL(1'843'200)) // HACK: The schematic shows an external clock generator but using a XTAL is faster to emulate. - MCFG_MOS6551_IRQ_HANDLER(WRITELINE(*this, apple3_state, apple3_acia_irq_func)) - MCFG_MOS6551_TXD_HANDLER(WRITELINE("rs232", rs232_port_device, write_txd)) - MCFG_MOS6551_RTS_HANDLER(WRITELINE("rs232", rs232_port_device, write_rts)) - MCFG_MOS6551_DTR_HANDLER(WRITELINE("rs232", rs232_port_device, write_dtr)) + MOS6551(config, m_acia, 0); + m_acia->set_xtal(XTAL(1'843'200)); // HACK: The schematic shows an external clock generator but using a XTAL is faster to emulate. + m_acia->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<0>)); + m_acia->txd_handler().set("rs232", FUNC(rs232_port_device::write_txd)); + m_acia->rts_handler().set("rs232", FUNC(rs232_port_device::write_rts)); + m_acia->dtr_handler().set("rs232", FUNC(rs232_port_device::write_dtr)); MCFG_DEVICE_ADD("rs232", RS232_PORT, default_rs232_devices, nullptr) MCFG_RS232_RXD_HANDLER(WRITELINE("acia", mos6551_device, write_rxd)) @@ -138,12 +144,12 @@ MACHINE_CONFIG_START(apple3_state::apple3) VIA6522(config, m_via[0], 1000000); m_via[0]->writepa_handler().set(FUNC(apple3_state::apple3_via_0_out_a)); m_via[0]->writepb_handler().set(FUNC(apple3_state::apple3_via_0_out_b)); - m_via[0]->irq_handler().set(FUNC(apple3_state::apple3_via_0_irq_func)); + m_via[0]->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<2>)); VIA6522(config, m_via[1], 1000000); m_via[1]->writepa_handler().set(FUNC(apple3_state::apple3_via_1_out_a)); m_via[1]->writepb_handler().set(FUNC(apple3_state::apple3_via_1_out_b)); - m_via[1]->irq_handler().set(FUNC(apple3_state::apple3_via_1_irq_func)); + m_via[1]->irq_handler().set("mainirq", FUNC(input_merger_device::in_w<1>)); /* sound */ SPEAKER(config, "speaker").front_center(); diff --git a/src/mame/includes/apple3.h b/src/mame/includes/apple3.h index 5e6e342b266..840ee20dd62 100644 --- a/src/mame/includes/apple3.h +++ b/src/mame/includes/apple3.h @@ -98,13 +98,10 @@ public: TIMER_DEVICE_CALLBACK_MEMBER(apple3_interrupt); TIMER_CALLBACK_MEMBER(scanstart_cb); TIMER_CALLBACK_MEMBER(scanend_cb); - DECLARE_WRITE_LINE_MEMBER(apple3_acia_irq_func); DECLARE_WRITE8_MEMBER(apple3_via_0_out_a); DECLARE_WRITE8_MEMBER(apple3_via_0_out_b); DECLARE_WRITE8_MEMBER(apple3_via_1_out_a); DECLARE_WRITE8_MEMBER(apple3_via_1_out_b); - DECLARE_WRITE_LINE_MEMBER(apple3_via_0_irq_func); - DECLARE_WRITE_LINE_MEMBER(apple3_via_1_irq_func); void apple3_write_charmem(); void text40(bitmap_ind16 &bitmap, const rectangle &cliprect); void text80(bitmap_ind16 &bitmap, const rectangle &cliprect); @@ -119,7 +116,6 @@ public: uint8_t *apple3_get_indexed_addr(offs_t offset); TIMER_DEVICE_CALLBACK_MEMBER(apple3_c040_tick); DECLARE_PALETTE_INIT(apple3); - void apple3_irq_update(); DECLARE_READ_LINE_MEMBER(ay3600_shift_r); DECLARE_READ_LINE_MEMBER(ay3600_control_r); DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w); @@ -137,13 +133,10 @@ public: void apple3(machine_config &config); void apple3_map(address_map &map); private: - int m_acia_irq; uint8_t m_via_0_a; uint8_t m_via_0_b; uint8_t m_via_1_a; uint8_t m_via_1_b; - int m_via_0_irq; - int m_via_1_irq; offs_t m_zpa; uint8_t m_last_n; uint8_t m_char_mem[0x800]; diff --git a/src/mame/machine/apple3.cpp b/src/mame/machine/apple3.cpp index a2ae146c41e..834a82dc349 100644 --- a/src/mame/machine/apple3.cpp +++ b/src/mame/machine/apple3.cpp @@ -582,7 +582,7 @@ void apple3_state::apple3_update_memory() m_bank7rd = m_bank7wr; // if we had an IRQ waiting for RAM to be paged in... - apple3_irq_update(); + //apple3_irq_update(); } } @@ -620,43 +620,6 @@ WRITE8_MEMBER(apple3_state::apple3_via_1_out_b) apple3_via_out(&m_via_1_b, data); } -void apple3_state::apple3_irq_update() -{ - if (m_acia_irq || m_via_1_irq || m_via_0_irq) - { -// printf(" setting IRQ\n"); - m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); - m_via[1]->write_pa7(0); // this is active low - } - else - { -// printf(" clearing IRQ\n"); - m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); - m_via[1]->write_pa7(1); - } -} - -WRITE_LINE_MEMBER(apple3_state::apple3_acia_irq_func) -{ -// printf("acia IRQ: %d\n", state); - m_acia_irq = state; - apple3_irq_update(); -} - -WRITE_LINE_MEMBER(apple3_state::apple3_via_1_irq_func) -{ -// printf("via 1 IRQ: %d\n", state); - m_via_1_irq = state; - apple3_irq_update(); -} - - -WRITE_LINE_MEMBER(apple3_state::apple3_via_0_irq_func) -{ -// printf("via 0 IRQ: %d\n", state); - m_via_0_irq = state; - apple3_irq_update(); -} MACHINE_RESET_MEMBER(apple3_state,apple3) { @@ -709,11 +672,8 @@ void apple3_state::init_apple3() m_enable_mask = 0; m_flags = 0; - m_acia_irq = 0; m_via_0_a = ~0; m_via_1_a = ~0; - m_via_0_irq = 0; - m_via_1_irq = 0; m_va = 0; m_vb = 0; m_vc = 0; @@ -746,13 +706,10 @@ void apple3_state::init_apple3() apple3_update_memory(); - save_item(NAME(m_acia_irq)); save_item(NAME(m_via_0_a)); save_item(NAME(m_via_0_b)); save_item(NAME(m_via_1_a)); save_item(NAME(m_via_1_b)); - save_item(NAME(m_via_0_irq)); - save_item(NAME(m_via_1_irq)); save_item(NAME(m_zpa)); save_item(NAME(m_last_n)); save_item(NAME(m_sync));