apple3.cpp: Use input merger device for IRQ (nw)

This commit is contained in:
AJR 2018-08-13 18:10:42 -04:00
parent 472e3fd96d
commit 279a202abb
3 changed files with 15 additions and 59 deletions

View File

@ -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();

View File

@ -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];

View File

@ -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));