summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/devices/bus/fp1000/fp1000_exp.cpp56
-rw-r--r--src/devices/bus/fp1000/fp1000_exp.h16
-rw-r--r--src/devices/bus/fp1000/fp1020fd.cpp9
-rw-r--r--src/devices/bus/fp1000/fp1060io.cpp35
-rw-r--r--src/devices/bus/fp1000/fp1060io.h2
-rw-r--r--src/devices/bus/fp1000/fp1060io_exp.cpp10
-rw-r--r--src/devices/bus/fp1000/fp1060io_exp.h15
-rw-r--r--src/mame/casio/fp1100.cpp26
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<device_fp1000_exp_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<fp1000_exp_slot_device *>(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<fp1000_exp_slot_device *>(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<device_fp1060io_slot_interface>
@@ -26,6 +27,7 @@ protected:
private:
virtual void device_add_mconfig(machine_config &config) override;
required_device_array<fp1060io_exp_slot_device, 4> m_subslot;
+ required_device_array<input_merger_device, 4> 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<device_fp1060io_exp_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<centronics_device> m_centronics;
required_device<cassette_image_device> m_cassette;
required_device_array<fp1000_exp_slot_device, 2> m_slot;
+ required_device_array<input_merger_device, 4> 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