diff options
Diffstat (limited to 'src/devices/bus/fp1000/fp1060io.cpp')
-rw-r--r-- | src/devices/bus/fp1000/fp1060io.cpp | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/devices/bus/fp1000/fp1060io.cpp b/src/devices/bus/fp1000/fp1060io.cpp new file mode 100644 index 00000000000..b18b99aa0c0 --- /dev/null +++ b/src/devices/bus/fp1000/fp1060io.cpp @@ -0,0 +1,95 @@ +// license:BSD-3-Clause +// copyright-holders:Angelo Salese + +#include "emu.h" +#include "fp1060io.h" + +#define VERBOSE 1 +//#define LOG_OUTPUT_FUNC osd_printf_info +#include "logmacro.h" + +DEFINE_DEVICE_TYPE(FP1060IO, fp1060io_device, "fp1060io", "FP-1060I/O Expansion Box") + +fp1060io_device::fp1060io_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) + : fp1000_exp_device(mconfig, FP1060IO, tag, owner, clock) + , m_subslot(*this, "%u", 0U) + , m_irqs_int(*this, { "irqs_inta", "irqs_intb", "irqs_intc", "irqs_intd"}) +{ +} + + +void fp1060io_device::device_add_mconfig(machine_config &config) +{ + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[0]).output_handler().set(FUNC(fp1060io_device::inta_w)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[1]).output_handler().set(FUNC(fp1060io_device::intb_w)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[2]).output_handler().set(FUNC(fp1060io_device::intc_w)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[3]).output_handler().set(FUNC(fp1060io_device::intd_w)); + + // default is just for CLI usability, what a retail '1060 gives back on its own is unconfirmed. + FP1060IO_EXP_SLOT(config, m_subslot[0], fp1060io_slot_devices, "rampack"); + m_subslot[0]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<0>)); + m_subslot[0]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<0>)); + m_subslot[0]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<0>)); + m_subslot[0]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<0>)); + + FP1060IO_EXP_SLOT(config, m_subslot[1], fp1060io_slot_devices, "rampack"); + m_subslot[1]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<1>)); + m_subslot[1]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<1>)); + m_subslot[1]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<1>)); + m_subslot[1]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<1>)); + + FP1060IO_EXP_SLOT(config, m_subslot[2], fp1060io_slot_devices, "rampack"); + m_subslot[2]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<2>)); + m_subslot[2]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<2>)); + m_subslot[2]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<2>)); + m_subslot[2]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<2>)); + + FP1060IO_EXP_SLOT(config, m_subslot[3], fp1060io_slot_devices, "rampack"); + m_subslot[3]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<3>)); + m_subslot[3]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<3>)); + m_subslot[3]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<3>)); + m_subslot[3]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<3>)); +} + +void fp1060io_device::device_start() +{ +} + +void fp1060io_device::device_reset() +{ +} + +u8 fp1060io_device::id_r(offs_t offset) +{ + LOG("ID select %02x\n", m_slot_select); + if (m_slot_select & 0xc) + return 0xff; + const auto dev = m_subslot[m_slot_select]->m_dev; + //LOG("\texists: %d\n", dev != nullptr); + + if (dev == nullptr) + return 0xff; + + return dev->get_id(); +} + +void fp1060io_device::cs_w(offs_t offset, u8 data) +{ + m_slot_select = data & 0xf; +} + +void fp1060io_device::remap_cb() +{ + LOG("remap_cb %02x\n", m_slot_select); + if (m_slot_select & 0xc) + m_slot->iospace().unmap_readwrite(0x0000, 0xfeff); + else + { + const auto dev = m_subslot[m_slot_select]->m_dev; + //LOG("\texists %d\n", dev != nullptr); + if (dev == nullptr) + m_slot->iospace().unmap_readwrite(0x0000, 0xfeff); + else + m_slot->iospace().install_device(0x0000, 0xfeff, *m_subslot[m_slot_select]->m_dev, &device_fp1060io_exp_interface::io_map); + } +} |