mirror of
https://github.com/holub/mame
synced 2025-04-23 17:00:53 +03:00
apple3.cpp: Use input merger device for IRQ (nw)
This commit is contained in:
parent
472e3fd96d
commit
279a202abb
@ -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();
|
||||
|
@ -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];
|
||||
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user