From 22c54f6871715e874779c6c8a590af838b93e4e2 Mon Sep 17 00:00:00 2001 From: angelosa Date: Sun, 21 Jul 2024 19:30:10 +0200 Subject: bus/fp1000: add int# callbacks, allow fdcpack to load disks --- src/devices/bus/fp1000/fp1000_exp.cpp | 56 ++++++++++++++++++++------------- src/devices/bus/fp1000/fp1000_exp.h | 16 ++++++++++ src/devices/bus/fp1000/fp1020fd.cpp | 9 ++++-- src/devices/bus/fp1000/fp1060io.cpp | 35 ++++++++++++++++++--- src/devices/bus/fp1000/fp1060io.h | 2 ++ src/devices/bus/fp1000/fp1060io_exp.cpp | 10 ++++++ src/devices/bus/fp1000/fp1060io_exp.h | 15 ++++++++- src/mame/casio/fp1100.cpp | 26 ++++++++++++--- 8 files changed, 133 insertions(+), 36 deletions(-) diff --git a/src/devices/bus/fp1000/fp1000_exp.cpp b/src/devices/bus/fp1000/fp1000_exp.cpp index 7f7c7ef5e4b..40233a9d215 100644 --- a/src/devices/bus/fp1000/fp1000_exp.cpp +++ b/src/devices/bus/fp1000/fp1000_exp.cpp @@ -14,6 +14,10 @@ fp1000_exp_slot_device::fp1000_exp_slot_device(const machine_config &mconfig, co : device_t(mconfig, FP1000_EXP_SLOT, tag, owner, clock) , device_single_card_slot_interface(mconfig, *this) , m_iospace(*this, finder_base::DUMMY_TAG, -1) + , m_inta_cb(*this) + , m_intb_cb(*this) + , m_intc_cb(*this) + , m_intd_cb(*this) { } @@ -30,28 +34,6 @@ void fp1000_exp_slot_device::device_config_complete() m_dev = get_card_device(); } - -device_fp1000_exp_interface::device_fp1000_exp_interface(const machine_config &mconfig, device_t &device) - : device_interface(device, "fp1000exp") -{ - m_slot = dynamic_cast(device.owner()); -} - -device_fp1000_exp_interface::~device_fp1000_exp_interface() -{ -} - -void device_fp1000_exp_interface::interface_pre_start() -{ - if (!m_slot->started()) - throw device_missing_dependencies(); -} - -void device_fp1000_exp_interface::interface_post_start() -{ - m_slot->select_w(false); -} - void fp1000_exp_slot_device::remap_cb() { if (!m_main_enable || m_dev == nullptr) @@ -80,6 +62,36 @@ void fp1000_exp_slot_device::main_cs_w(offs_t offset, u8 data) m_dev->remap_cb(); } + + +device_fp1000_exp_interface::device_fp1000_exp_interface(const machine_config &mconfig, device_t &device) + : device_interface(device, "fp1000exp") +{ + m_slot = dynamic_cast(device.owner()); +} + +device_fp1000_exp_interface::~device_fp1000_exp_interface() +{ +} + +void device_fp1000_exp_interface::interface_pre_start() +{ + if (!m_slot->started()) + throw device_missing_dependencies(); +} + +void device_fp1000_exp_interface::interface_post_start() +{ + m_slot->select_w(false); +} + +// generic passthroughs +void device_fp1000_exp_interface::inta_w(int state) { m_slot->m_inta_cb(state); } +void device_fp1000_exp_interface::intb_w(int state) { m_slot->m_intb_cb(state); } +void device_fp1000_exp_interface::intc_w(int state) { m_slot->m_intc_cb(state); } +void device_fp1000_exp_interface::intd_w(int state) { m_slot->m_intd_cb(state); } + + fp1000_exp_device::fp1000_exp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , device_fp1000_exp_interface(mconfig, *this) diff --git a/src/devices/bus/fp1000/fp1000_exp.h b/src/devices/bus/fp1000/fp1000_exp.h index a453f80cba7..8b437e09f0b 100644 --- a/src/devices/bus/fp1000/fp1000_exp.h +++ b/src/devices/bus/fp1000/fp1000_exp.h @@ -32,6 +32,11 @@ public: void select_w(bool enable); + auto inta_callback() { return m_inta_cb.bind(); } + auto intb_callback() { return m_intb_cb.bind(); } + auto intc_callback() { return m_intc_cb.bind(); } + auto intd_callback() { return m_intd_cb.bind(); } + protected: virtual void device_start() override; virtual void device_config_complete() override; @@ -44,6 +49,11 @@ private: bool m_main_enable = false; device_fp1000_exp_interface *m_dev; + + devcb_write_line m_inta_cb; + devcb_write_line m_intb_cb; + devcb_write_line m_intc_cb; + devcb_write_line m_intd_cb; }; class device_fp1000_exp_interface : public device_interface @@ -56,6 +66,7 @@ public: virtual u8 id_r(offs_t offset) = 0; virtual void remap_cb() = 0; + protected: device_fp1000_exp_interface(const machine_config &mconfig, device_t &device); @@ -63,6 +74,11 @@ protected: virtual void interface_post_start() override; fp1000_exp_slot_device *m_slot; + + void inta_w(int state); + void intb_w(int state); + void intc_w(int state); + void intd_w(int state); }; class fp1000_exp_device : public device_t, public device_fp1000_exp_interface diff --git a/src/devices/bus/fp1000/fp1020fd.cpp b/src/devices/bus/fp1000/fp1020fd.cpp index 6426cf1a88c..1907de05a05 100644 --- a/src/devices/bus/fp1000/fp1020fd.cpp +++ b/src/devices/bus/fp1000/fp1020fd.cpp @@ -53,18 +53,21 @@ static void fd1020fd_floppies(device_slot_interface &device) void fp1020fd_device::intrq_w(int state) { - LOG("intrq_w %d\n",state); +// LOG("intrq_w %d\n",state); + fp1060io_exp_device::intb_w(state); } void fp1020fd_device::drq_w(int state) { - LOG("drq_w %d\n",state); +// LOG("drq_w %d\n",state); + fp1060io_exp_device::inta_w(state); } void fp1020fd_device::device_add_mconfig(machine_config &config) { // UPD765AC - // TODO: verify clock and parameters + // TODO: verify clock + // ready and select lines = true verified (pukes any floppy bootstrap if either is false) UPD765A(config, m_fdc, 8'000'000, true, true); m_fdc->intrq_wr_callback().set(FUNC(fp1020fd_device::intrq_w)); m_fdc->drq_wr_callback().set(FUNC(fp1020fd_device::drq_w)); diff --git a/src/devices/bus/fp1000/fp1060io.cpp b/src/devices/bus/fp1000/fp1060io.cpp index 9ad5116b904..b18b99aa0c0 100644 --- a/src/devices/bus/fp1000/fp1060io.cpp +++ b/src/devices/bus/fp1000/fp1060io.cpp @@ -13,17 +13,42 @@ DEFINE_DEVICE_TYPE(FP1060IO, fp1060io_device, "fp1060io", "FP-1060I/O Expansion 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) { - for (auto slot : m_subslot) - { - // default is just for CLI usability, what a retail '1060 gives back on its own is unconfirmed. - FP1060IO_EXP_SLOT(config, slot, fp1060io_slot_devices, "rampack"); - } + 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() diff --git a/src/devices/bus/fp1000/fp1060io.h b/src/devices/bus/fp1000/fp1060io.h index 6af11b3ef87..c31243324b5 100644 --- a/src/devices/bus/fp1000/fp1060io.h +++ b/src/devices/bus/fp1000/fp1060io.h @@ -8,6 +8,7 @@ #include "fp1000_exp.h" #include "fp1060io_exp.h" +#include "machine/input_merger.h" class fp1060io_device : public fp1000_exp_device //, public device_single_card_slot_interface @@ -26,6 +27,7 @@ protected: private: virtual void device_add_mconfig(machine_config &config) override; required_device_array m_subslot; + required_device_array m_irqs_int; u8 m_slot_select = 0; }; diff --git a/src/devices/bus/fp1000/fp1060io_exp.cpp b/src/devices/bus/fp1000/fp1060io_exp.cpp index 99ba9976412..3c4e7f85894 100644 --- a/src/devices/bus/fp1000/fp1060io_exp.cpp +++ b/src/devices/bus/fp1000/fp1060io_exp.cpp @@ -27,6 +27,10 @@ DEFINE_DEVICE_TYPE(FP1060IO_EXP_SLOT, fp1060io_exp_slot_device, "fp1060io_exp_sl fp1060io_exp_slot_device::fp1060io_exp_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, FP1060IO_EXP_SLOT, tag, owner, clock) , device_single_card_slot_interface(mconfig, *this) + , m_inta_cb(*this) + , m_intb_cb(*this) + , m_intc_cb(*this) + , m_intd_cb(*this) { } @@ -65,6 +69,12 @@ void device_fp1060io_exp_interface::interface_post_start() // Dynamic mapping, shouldn't need anything from here } +void device_fp1060io_exp_interface::inta_w(int state) { m_slot->m_inta_cb(state); } +void device_fp1060io_exp_interface::intb_w(int state) { m_slot->m_intb_cb(state); } +void device_fp1060io_exp_interface::intc_w(int state) { m_slot->m_intc_cb(state); } +void device_fp1060io_exp_interface::intd_w(int state) { m_slot->m_intd_cb(state); } + + fp1060io_exp_device::fp1060io_exp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : device_t(mconfig, type, tag, owner, clock) , device_fp1060io_exp_interface(mconfig, *this) diff --git a/src/devices/bus/fp1000/fp1060io_exp.h b/src/devices/bus/fp1000/fp1060io_exp.h index e85ac26dfa9..3cf0261a863 100644 --- a/src/devices/bus/fp1000/fp1060io_exp.h +++ b/src/devices/bus/fp1000/fp1060io_exp.h @@ -28,11 +28,19 @@ public: device_fp1060io_exp_interface *m_dev; + auto inta_callback() { return m_inta_cb.bind(); } + auto intb_callback() { return m_intb_cb.bind(); } + auto intc_callback() { return m_intc_cb.bind(); } + auto intd_callback() { return m_intd_cb.bind(); } + protected: virtual void device_start() override; virtual void device_config_complete() override; -//private: + devcb_write_line m_inta_cb; + devcb_write_line m_intb_cb; + devcb_write_line m_intc_cb; + devcb_write_line m_intd_cb; }; @@ -52,6 +60,11 @@ protected: virtual void interface_post_start() override; fp1060io_exp_slot_device *m_slot; + + void inta_w(int state); + void intb_w(int state); + void intc_w(int state); + void intd_w(int state); }; class fp1060io_exp_device : public device_t, public device_fp1060io_exp_interface diff --git a/src/mame/casio/fp1100.cpp b/src/mame/casio/fp1100.cpp index 203f30d1101..f4f1a161822 100644 --- a/src/mame/casio/fp1100.cpp +++ b/src/mame/casio/fp1100.cpp @@ -52,6 +52,7 @@ The keyboard is a separate unit. It contains a beeper. #include "cpu/z80/z80.h" #include "imagedev/cassette.h" #include "machine/gen_latch.h" +#include "machine/input_merger.h" #include "machine/timer.h" #include "sound/beep.h" #include "video/mc6845.h" @@ -87,6 +88,7 @@ public: , m_centronics(*this, "centronics") , m_cassette(*this, "cassette") , m_slot(*this, "slot.%u", 0) + , m_irqs_int(*this, { "irqs_inta", "irqs_intb", "irqs_intc", "irqs_intd"}) { } void fp1100(machine_config &config); @@ -109,6 +111,7 @@ private: required_device m_centronics; required_device m_cassette; required_device_array m_slot; + required_device_array m_irqs_int; void main_map(address_map &map); void io_map(address_map &map); @@ -771,11 +774,24 @@ void fp1100_state::fp1100(machine_config &config) BEEP(config, "beeper", 950) // guess .add_route(ALL_OUTPUTS, "mono", 0.50); // inside the keyboard - for (auto slot : m_slot) - { - FP1000_EXP_SLOT(config, slot, fp1000_exp_devices, nullptr); - slot->set_iospace(m_maincpu, AS_IO); - } + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[0]).output_handler().set(FUNC(fp1100_state::int_w<0>)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[1]).output_handler().set(FUNC(fp1100_state::int_w<1>)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[2]).output_handler().set(FUNC(fp1100_state::int_w<2>)); + INPUT_MERGER_ANY_HIGH(config, m_irqs_int[3]).output_handler().set(FUNC(fp1100_state::int_w<3>)); + + FP1000_EXP_SLOT(config, m_slot[0], fp1000_exp_devices, nullptr); + m_slot[0]->set_iospace(m_maincpu, AS_IO); + m_slot[0]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<0>)); + m_slot[0]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<0>)); + m_slot[0]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<0>)); + m_slot[0]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<0>)); + + FP1000_EXP_SLOT(config, m_slot[1], fp1000_exp_devices, nullptr); + m_slot[1]->set_iospace(m_maincpu, AS_IO); + m_slot[1]->inta_callback().set(m_irqs_int[0], FUNC(input_merger_device::in_w<1>)); + m_slot[1]->intb_callback().set(m_irqs_int[1], FUNC(input_merger_device::in_w<1>)); + m_slot[1]->intc_callback().set(m_irqs_int[2], FUNC(input_merger_device::in_w<1>)); + m_slot[1]->intd_callback().set(m_irqs_int[3], FUNC(input_merger_device::in_w<1>)); } // TODO: chargen, keyboard ROM and key tops can be substituted on actual FP-1000/FP-1100 -- cgit v1.2.3