coco12.cpp, coco3.cpp, dragon.cpp: Removed IRQ trampolines from CoCo driver family. (#7393)

* Also fixed dragon 32 parallel port.
This commit is contained in:
tim lindner 2020-11-12 20:53:25 -08:00 committed by GitHub
parent fe9ac15ca9
commit c3264ca803
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 45 additions and 211 deletions

View File

@ -492,13 +492,16 @@ void coco12_state::coco(machine_config &config)
m_maincpu->set_dasm_override(FUNC(coco_state::dasm_override));
// devices
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
INPUT_MERGER_ANY_HIGH(config, m_firqs).output_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE);
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
pia0.writepa_handler().set(FUNC(coco_state::pia0_pa_w));
pia0.writepb_handler().set(FUNC(coco_state::pia0_pb_w));
pia0.ca2_handler().set(FUNC(coco_state::pia0_ca2_w));
pia0.cb2_handler().set(FUNC(coco_state::pia0_cb2_w));
pia0.irqa_handler().set(FUNC(coco_state::pia0_irq_a));
pia0.irqb_handler().set(FUNC(coco_state::pia0_irq_b));
pia0.irqa_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
pia0.irqb_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
pia6821_device &pia1(PIA6821(config, PIA1_TAG, 0));
pia1.readpa_handler().set(FUNC(coco_state::pia1_pa_r));
@ -507,8 +510,8 @@ void coco12_state::coco(machine_config &config)
pia1.writepb_handler().set(FUNC(coco_state::pia1_pb_w));
pia1.ca2_handler().set(FUNC(coco_state::pia1_ca2_w));
pia1.cb2_handler().set(FUNC(coco_state::pia1_cb2_w));
pia1.irqa_handler().set(FUNC(coco_state::pia1_firq_a));
pia1.irqb_handler().set(FUNC(coco_state::pia1_firq_b));
pia1.irqa_handler().set(m_firqs, FUNC(input_merger_device::in_w<0>));
pia1.irqb_handler().set(m_firqs, FUNC(input_merger_device::in_w<1>));
SAM6883(config, m_sam, XTAL(14'318'181), m_maincpu);
m_sam->set_addrmap(0, &coco12_state::coco_ram);

View File

@ -262,13 +262,16 @@ void coco3_state::coco3(machine_config &config)
m_maincpu->set_dasm_override(FUNC(coco_state::dasm_override));
// devices
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
INPUT_MERGER_ANY_HIGH(config, m_firqs).output_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE);
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
pia0.writepa_handler().set(FUNC(coco_state::pia0_pa_w));
pia0.writepb_handler().set(FUNC(coco_state::pia0_pb_w));
pia0.ca2_handler().set(FUNC(coco_state::pia0_ca2_w));
pia0.cb2_handler().set(FUNC(coco_state::pia0_cb2_w));
pia0.irqa_handler().set(FUNC(coco_state::pia0_irq_a));
pia0.irqb_handler().set(FUNC(coco_state::pia0_irq_b));
pia0.irqa_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
pia0.irqb_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
pia6821_device &pia1(PIA6821(config, PIA1_TAG, 0));
pia1.readpa_handler().set(FUNC(coco_state::pia1_pa_r));
@ -277,8 +280,8 @@ void coco3_state::coco3(machine_config &config)
pia1.writepb_handler().set(FUNC(coco_state::pia1_pb_w));
pia1.ca2_handler().set(FUNC(coco_state::pia1_ca2_w));
pia1.cb2_handler().set(FUNC(coco_state::pia1_cb2_w));
pia1.irqa_handler().set(FUNC(coco_state::pia1_firq_a));
pia1.irqb_handler().set(FUNC(coco_state::pia1_firq_b));
pia1.irqa_handler().set(m_firqs, FUNC(input_merger_device::in_w<0>));
pia1.irqb_handler().set(m_firqs, FUNC(input_merger_device::in_w<1>));
// Becker Port device
COCO_DWSOCK(config, DWSOCK_TAG, 0);
@ -309,8 +312,8 @@ void coco3_state::coco3(machine_config &config)
m_gime->set_screen(COMPOSITE_SCREEN_TAG);
m_gime->hsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::ca1_w));
m_gime->fsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::cb1_w));
m_gime->irq_wr_callback().set(FUNC(coco3_state::gime_irq_w));
m_gime->firq_wr_callback().set(FUNC(coco3_state::gime_firq_w));
m_gime->irq_wr_callback().set(m_irqs, FUNC(input_merger_device::in_w<2>));
m_gime->firq_wr_callback().set(m_firqs, FUNC(input_merger_device::in_w<2>));
m_gime->floating_bus_rd_callback().set(FUNC(coco3_state::floating_bus_r));
// composite monitor
@ -351,8 +354,8 @@ void coco3_state::coco3p(machine_config &config)
m_gime->set_screen(COMPOSITE_SCREEN_TAG);
m_gime->hsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::ca1_w));
m_gime->fsync_wr_callback().set(PIA0_TAG, FUNC(pia6821_device::cb1_w));
m_gime->irq_wr_callback().set(FUNC(coco3_state::gime_irq_w));
m_gime->firq_wr_callback().set(FUNC(coco3_state::gime_firq_w));
m_gime->irq_wr_callback().set(m_irqs, FUNC(input_merger_device::in_w<2>));
m_gime->firq_wr_callback().set(m_firqs, FUNC(input_merger_device::in_w<2>));
m_gime->floating_bus_rd_callback().set(FUNC(coco3_state::floating_bus_r));
}

View File

@ -262,13 +262,16 @@ void dragon_state::dragon_base(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &dragon_state::dragon_mem);
// devices
INPUT_MERGER_ANY_HIGH(config, m_irqs).output_handler().set_inputline(m_maincpu, M6809_IRQ_LINE);
INPUT_MERGER_ANY_HIGH(config, m_firqs).output_handler().set_inputline(m_maincpu, M6809_FIRQ_LINE);
pia6821_device &pia0(PIA6821(config, PIA0_TAG, 0));
pia0.writepa_handler().set(FUNC(coco_state::pia0_pa_w));
pia0.writepb_handler().set(FUNC(coco_state::pia0_pb_w));
pia0.ca2_handler().set(FUNC(coco_state::pia0_ca2_w));
pia0.cb2_handler().set(FUNC(coco_state::pia0_cb2_w));
pia0.irqa_handler().set(FUNC(coco_state::pia0_irq_a));
pia0.irqb_handler().set(FUNC(coco_state::pia0_irq_b));
pia0.irqa_handler().set(m_irqs, FUNC(input_merger_device::in_w<0>));
pia0.irqb_handler().set(m_irqs, FUNC(input_merger_device::in_w<1>));
pia6821_device &pia1(PIA6821(config, PIA1_TAG, 0));
pia1.readpa_handler().set(FUNC(coco_state::pia1_pa_r));
@ -277,8 +280,8 @@ void dragon_state::dragon_base(machine_config &config)
pia1.writepb_handler().set(FUNC(coco_state::pia1_pb_w));
pia1.ca2_handler().set(FUNC(coco_state::pia1_ca2_w));
pia1.cb2_handler().set(FUNC(coco_state::pia1_cb2_w));
pia1.irqa_handler().set(FUNC(coco_state::pia1_firq_a));
pia1.irqb_handler().set(FUNC(coco_state::pia1_firq_b));
pia1.irqa_handler().set(m_firqs, FUNC(input_merger_device::in_w<0>));
pia1.irqb_handler().set(m_firqs, FUNC(input_merger_device::in_w<1>));
SAM6883(config, m_sam, 14.218_MHz_XTAL, m_maincpu);
m_sam->set_addrmap(0, &dragon_state::coco_ram);
@ -351,7 +354,7 @@ void dragon64_state::dragon64(machine_config &config)
// acia
mos6551_device &acia(MOS6551(config, "acia", 0));
acia.set_xtal(1.8432_MHz_XTAL);
acia.irq_handler().set(FUNC(dragon64_state::acia_irq));
acia.irq_handler().set(m_irqs, FUNC(input_merger_device::in_w<2>));
acia.txd_handler().set("rs232", FUNC(rs232_port_device::write_txd));
rs232_port_device &rs232(RS232_PORT(config, "rs232", default_rs232_devices, nullptr));
@ -365,11 +368,6 @@ void dragon64_state::dragon64(machine_config &config)
SOFTWARE_LIST(config, "dragon_os9_list").set_original("dragon_os9");
}
WRITE_LINE_MEMBER( dragon64_state::acia_irq )
{
m_maincpu->set_input_line(M6809_IRQ_LINE, state ? ASSERT_LINE : CLEAR_LINE);
}
void dragon64_state::dragon64h(machine_config &config)
{
dragon64(config);
@ -418,10 +416,13 @@ void dragon_alpha_state::dgnalpha(machine_config &config)
sam().set_addrmap(4, &dragon_alpha_state::d64_io0);
sam().set_addrmap(5, &dragon_alpha_state::dgnalpha_io1);
// input merger
INPUT_MERGER_ANY_HIGH(config, m_nmis).output_handler().set_inputline(m_maincpu, INPUT_LINE_NMI);
// cartridge
cococart_slot_device &cartslot(COCOCART_SLOT(config, CARTRIDGE_TAG, DERIVED_CLOCK(1, 1), dragon_cart, nullptr));
cartslot.cart_callback().set([this] (int state) { cart_w(state != 0); }); // lambda because name is overloaded
cartslot.nmi_callback().set_inputline(m_maincpu, INPUT_LINE_NMI);
cartslot.nmi_callback().set(m_nmis, FUNC(input_merger_device::in_w<0>));
cartslot.halt_callback().set_inputline(m_maincpu, INPUT_LINE_HALT);
// acia
@ -447,8 +448,8 @@ void dragon_alpha_state::dgnalpha(machine_config &config)
// pia 2
pia6821_device &pia2(PIA6821(config, PIA2_TAG, 0));
pia2.writepa_handler().set(FUNC(dragon_alpha_state::pia2_pa_w));
pia2.irqa_handler().set(FUNC(dragon_alpha_state::pia2_firq_a));
pia2.irqb_handler().set(FUNC(dragon_alpha_state::pia2_firq_b));
pia2.irqa_handler().set(m_firqs, FUNC(input_merger_device::in_w<2>));
pia2.irqb_handler().set(m_firqs, FUNC(input_merger_device::in_w<3>));
// software lists
SOFTWARE_LIST(config, "dgnalpha_flop_list").set_original("dgnalpha_flop");

View File

@ -24,7 +24,7 @@
#include "machine/bankdev.h"
#include "sound/dac.h"
#include "screen.h"
#include "machine/input_merger.h"
//**************************************************************************
// MACROS / CONSTANTS
@ -102,8 +102,6 @@ public:
void pia0_pb_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( pia0_ca2_w );
DECLARE_WRITE_LINE_MEMBER( pia0_cb2_w );
DECLARE_WRITE_LINE_MEMBER( pia0_irq_a );
DECLARE_WRITE_LINE_MEMBER( pia0_irq_b );
// PIA1
uint8_t pia1_pa_r();
@ -112,8 +110,6 @@ public:
void pia1_pb_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( pia1_ca2_w );
DECLARE_WRITE_LINE_MEMBER( pia1_cb2_w );
DECLARE_WRITE_LINE_MEMBER( pia1_firq_a );
DECLARE_WRITE_LINE_MEMBER( pia1_firq_b );
// floating bus & "space"
uint8_t floating_bus_r() { return floating_bus_read(); }
@ -139,12 +135,6 @@ protected:
virtual void device_reset() override;
virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
// interrupts
virtual bool firq_get_line(void);
virtual bool irq_get_line(void);
void recalculate_irq(void);
void recalculate_firq(void);
// changed handlers
virtual void pia1_pa_changed(uint8_t data);
virtual void pia1_pb_changed(uint8_t data);
@ -242,7 +232,9 @@ protected:
optional_device<coco_vhd_image_device> m_vhd_0;
optional_device<coco_vhd_image_device> m_vhd_1;
optional_device<beckerport_device> m_beckerport;
optional_ioport m_beckerportconfig;
optional_ioport m_beckerportconfig;
required_device<input_merger_device> m_irqs;
required_device<input_merger_device> m_firqs;
// input ports
required_ioport_array<7> m_keyboard;

View File

@ -44,9 +44,6 @@ public:
virtual uint8_t ff40_read(offs_t offset) override;
virtual void ff40_write(offs_t offset, uint8_t data) override;
DECLARE_WRITE_LINE_MEMBER(gime_firq_w) { recalculate_firq(); }
DECLARE_WRITE_LINE_MEMBER(gime_irq_w) { recalculate_irq(); }
uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
void coco3p(machine_config &config);
@ -57,10 +54,6 @@ public:
protected:
virtual void update_cart_base(uint8_t *cart_base) override;
// interrupts
virtual bool firq_get_line(void) override;
virtual bool irq_get_line(void) override;
// miscellaneous
virtual void update_keyboard_input(uint8_t value) override;
virtual void cart_w(bool line) override;

View File

@ -44,7 +44,8 @@ public:
m_pia_2(*this, PIA2_TAG),
m_ay8912(*this, AY8912_TAG),
m_fdc(*this, WD2797_TAG),
m_floppy(*this, WD2797_TAG ":%u", 0U)
m_floppy(*this, WD2797_TAG ":%u", 0U),
m_nmis(*this, "nmis")
{
}
@ -55,8 +56,6 @@ private:
/* pia2 */
void pia2_pa_w(uint8_t data);
DECLARE_WRITE_LINE_MEMBER( pia2_firq_a );
DECLARE_WRITE_LINE_MEMBER( pia2_firq_b );
/* psg */
uint8_t psg_porta_read();
@ -70,15 +69,13 @@ private:
virtual void device_start(void) override;
virtual void device_reset(void) override;
/* interrupts */
virtual bool firq_get_line(void) override;
void dgnalpha_io1(address_map &map);
required_device<pia6821_device> m_pia_2;
required_device<ay8912_device> m_ay8912;
required_device<wd2797_device> m_fdc;
required_device_array<floppy_connector, 4> m_floppy;
required_device<input_merger_device> m_nmis;
/* modem */
uint8_t modem_r(offs_t offset);

View File

@ -69,7 +69,7 @@ public:
void dragon64(machine_config &config);
void tanodr64h(machine_config &config);
void dragon64h(machine_config &config);
DECLARE_WRITE_LINE_MEMBER( acia_irq );
protected:
void d64_rom0(address_map &map);
void d64_rom1(address_map &map);

View File

@ -98,6 +98,8 @@ coco_state::coco_state(const machine_config &mconfig, device_type type, const ch
m_vhd_1(*this, VHD1_TAG),
m_beckerport(*this, DWSOCK_TAG),
m_beckerportconfig(*this, BECKERPORT_TAG),
m_irqs(*this, "irqs"),
m_firqs(*this, "firqs"),
m_keyboard(*this, "row%u", 0),
m_joystick_type_control(*this, CTRL_SEL_TAG),
m_joystick_hires_control(*this, HIRES_INTF_TAG),
@ -374,29 +376,6 @@ WRITE_LINE_MEMBER( coco_state::pia0_cb2_w )
}
//-------------------------------------------------
// pia0_irq_a
//-------------------------------------------------
WRITE_LINE_MEMBER( coco_state::pia0_irq_a )
{
recalculate_irq();
}
//-------------------------------------------------
// pia0_irq_b
//-------------------------------------------------
WRITE_LINE_MEMBER( coco_state::pia0_irq_b )
{
recalculate_irq();
}
/***************************************************************************
PIA1 ($FF20-$FF3F) (Chip U4)
@ -522,29 +501,6 @@ WRITE_LINE_MEMBER( coco_state::pia1_cb2_w )
}
//-------------------------------------------------
// pia1_firq_a
//-------------------------------------------------
WRITE_LINE_MEMBER( coco_state::pia1_firq_a )
{
recalculate_firq();
}
//-------------------------------------------------
// pia1_firq_b
//-------------------------------------------------
WRITE_LINE_MEMBER( coco_state::pia1_firq_b )
{
recalculate_firq();
}
/***************************************************************************
CPU INTERRUPTS
@ -565,56 +521,6 @@ WRITE_LINE_MEMBER( coco_state::pia1_firq_b )
***************************************************************************/
//-------------------------------------------------
// irq_get_line - gets the value of the FIRQ line
// passed into the CPU
//-------------------------------------------------
bool coco_state::irq_get_line(void)
{
return pia_0().irq_a_state() || pia_0().irq_b_state();
}
//-------------------------------------------------
// recalculate_irq
//-------------------------------------------------
void coco_state::recalculate_irq(void)
{
bool line = irq_get_line();
if (LOG_INTERRUPTS)
logerror("recalculate_irq(): line=%d\n", line ? 1 : 0);
m_maincpu->set_input_line(M6809_IRQ_LINE, line ? ASSERT_LINE : CLEAR_LINE);
}
//-------------------------------------------------
// firq_get_line - gets the value of the FIRQ line
// passed into the CPU
//-------------------------------------------------
bool coco_state::firq_get_line(void)
{
return pia_1().irq_a_state() || pia_1().irq_b_state();
}
//-------------------------------------------------
// recalculate_firq
//-------------------------------------------------
void coco_state::recalculate_firq(void)
{
bool line = firq_get_line();
if (LOG_INTERRUPTS)
logerror("recalculate_firq(): line=%d\n", line ? 1 : 0);
m_maincpu->set_input_line(M6809_FIRQ_LINE, line ? ASSERT_LINE : CLEAR_LINE);
}
/***************************************************************************

View File

@ -86,28 +86,6 @@ void coco3_state::ff40_write(offs_t offset, uint8_t data)
//-------------------------------------------------
// firq_get_line
//-------------------------------------------------
bool coco3_state::firq_get_line(void)
{
return coco_state::firq_get_line() || m_gime->firq_r();
}
//-------------------------------------------------
// irq_get_line
//-------------------------------------------------
bool coco3_state::irq_get_line(void)
{
return coco_state::irq_get_line() || m_gime->irq_r();
}
//-------------------------------------------------
// update_keyboard_input
//-------------------------------------------------

View File

@ -91,7 +91,6 @@ void dragon_alpha_state::device_reset(void)
}
/***************************************************************************
MODEM
***************************************************************************/
@ -166,44 +165,6 @@ void dragon_alpha_state::pia2_pa_w(uint8_t data)
//-------------------------------------------------
// pia1_firq_a
//-------------------------------------------------
WRITE_LINE_MEMBER( dragon_alpha_state::pia2_firq_a )
{
recalculate_firq();
}
//-------------------------------------------------
// pia1_firq_b
//-------------------------------------------------
WRITE_LINE_MEMBER( dragon_alpha_state::pia2_firq_b )
{
recalculate_firq();
}
/***************************************************************************
CPU INTERRUPTS
***************************************************************************/
//-------------------------------------------------
// firq_get_line - gets the value of the FIRQ line
// passed into the CPU
//-------------------------------------------------
bool dragon_alpha_state::firq_get_line(void)
{
return dragon_state::firq_get_line() || m_pia_2->irq_a_state() || m_pia_2->irq_b_state();
}
/***************************************************************************
AY8912
***************************************************************************/
@ -259,11 +220,11 @@ WRITE_LINE_MEMBER( dragon_alpha_state::fdc_intrq_w )
if (state)
{
if (m_pia_2->ca2_output_z())
m_maincpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE);
m_nmis->in_w<1>(1);
}
else
{
m_maincpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE);
m_nmis->in_w<1>(0);
}
}

View File

@ -57,7 +57,7 @@ void dragon_state::pia1_pa_changed(uint8_t data)
/* if strobe bit is high send data from pia0 port b to dragon parallel printer */
if (data & 0x02)
{
uint8_t output = pia_1().b_output();
uint8_t output = pia_0().b_output();
m_printer->output(output);
}
}