summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--scripts/src/bus.lua14
-rw-r--r--src/devices/bus/heathzenith/h89/cards.cpp46
-rw-r--r--src/devices/bus/heathzenith/h89/cards.h18
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.cpp18
-rw-r--r--src/devices/bus/heathzenith/h89/h89bus.h26
-rw-r--r--src/devices/bus/heathzenith/h89/intr_cntrl.cpp (renamed from src/mame/heathzenith/intr_cntrl.cpp)0
-rw-r--r--src/devices/bus/heathzenith/h89/intr_cntrl.h (renamed from src/mame/heathzenith/intr_cntrl.h)6
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.cpp74
-rw-r--r--src/devices/bus/heathzenith/h89/mms77316_fdc.h55
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.cpp71
-rw-r--r--src/devices/bus/heathzenith/h89/z37_fdc.h53
-rw-r--r--src/mame/heathzenith/h89.cpp68
12 files changed, 198 insertions, 251 deletions
diff --git a/scripts/src/bus.lua b/scripts/src/bus.lua
index 7341724f85c..ae88c1125e6 100644
--- a/scripts/src/bus.lua
+++ b/scripts/src/bus.lua
@@ -5771,8 +5771,6 @@ end
if (BUSES["H89BUS"]~=null) then
files {
- MAME_DIR .. "src/devices/bus/heathzenith/h89/cards.cpp",
- MAME_DIR .. "src/devices/bus/heathzenith/h89/cards.h",
MAME_DIR .. "src/devices/bus/heathzenith/h89/cdr_fdc_880h.cpp",
MAME_DIR .. "src/devices/bus/heathzenith/h89/cdr_fdc_880h.h",
MAME_DIR .. "src/devices/bus/heathzenith/h89/h89bus.cpp",
@@ -5800,6 +5798,18 @@ end
---------------------------------------------------
--
+--@src/devices/bus/heathzenith/h89/intr_cntrl.h,BUSES["HEATH_INTR_SOCKET"] = true
+---------------------------------------------------
+
+if (BUSES["HEATH_INTR_SOCKET"]~=null) then
+ files {
+ MAME_DIR .. "src/devices/bus/heathzenith/h89/intr_cntrl.cpp",
+ MAME_DIR .. "src/devices/bus/heathzenith/h89/intr_cntrl.h",
+ }
+end
+
+---------------------------------------------------
+--
--@src/devices/bus/heathzenith/h19/tlb.h,BUSES["HEATH_TLB_CONNECTOR"] = true
---------------------------------------------------
diff --git a/src/devices/bus/heathzenith/h89/cards.cpp b/src/devices/bus/heathzenith/h89/cards.cpp
deleted file mode 100644
index 0a33bd8593f..00000000000
--- a/src/devices/bus/heathzenith/h89/cards.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:R. Belmont
-/***************************************************************************
-
- H-89 and Z-90 slot cards
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cards.h"
-
-#include "cdr_fdc_880h.h"
-#include "h_88_3.h"
-#include "h_88_5.h"
-#include "mms77316_fdc.h"
-#include "sigmasoft_sound.h"
-#include "we_pullup.h"
-#include "z_89_11.h"
-#include "z37_fdc.h"
-
-
-void h89_right_cards(device_slot_interface &device)
-{
- device.option_add("cdr_fdc", H89BUS_CDR_FDC_880H);
- device.option_add("h_88_3", H89BUS_H_88_3);
- device.option_add("ha_88_3", H89BUS_HA_88_3);
- device.option_add("h_88_5", H89BUS_H_88_5);
- device.option_add("ss_snd", H89BUS_SIGMASOFT_SND);
- device.option_add("z_89_11", H89BUS_Z_89_11);
-
- device.option_add("z37fdc", H89BUS_Z37);
-}
-
-void h89_right_cards_mms(device_slot_interface &device)
-{
- h89_right_cards(device);
- device.option_add("mms77316", H89BUS_MMS77316);
-}
-
-void h89_right_p506_cards(device_slot_interface &device)
-{
- device.option_add("h_88_3", H89BUS_H_88_3);
- device.option_add("ha_88_3", H89BUS_HA_88_3);
- device.option_add("ss_snd", H89BUS_SIGMASOFT_SND);
- device.option_add("we_pullup", H89BUS_WE_PULLUP);
-}
diff --git a/src/devices/bus/heathzenith/h89/cards.h b/src/devices/bus/heathzenith/h89/cards.h
deleted file mode 100644
index f9ca720a021..00000000000
--- a/src/devices/bus/heathzenith/h89/cards.h
+++ /dev/null
@@ -1,18 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:R. Belmont
-/***************************************************************************
-
- Heath/Zenith H-89 and Z-90 cards
-
-***************************************************************************/
-
-#ifndef MAME_BUS_HEATHZENITH_H89_CARDS_H
-#define MAME_BUS_HEATHZENITH_H89_CARDS_H
-
-#pragma once
-
-void h89_right_cards(device_slot_interface &device) ATTR_COLD;
-void h89_right_cards_mms(device_slot_interface &device) ATTR_COLD;
-void h89_right_p506_cards(device_slot_interface &device) ATTR_COLD;
-
-#endif // MAME_BUS_HEATHZENITH_H89_CARDS_H
diff --git a/src/devices/bus/heathzenith/h89/h89bus.cpp b/src/devices/bus/heathzenith/h89/h89bus.cpp
index 1b05c49e480..8bff638a3c8 100644
--- a/src/devices/bus/heathzenith/h89/h89bus.cpp
+++ b/src/devices/bus/heathzenith/h89/h89bus.cpp
@@ -150,9 +150,6 @@ h89bus_device::h89bus_device(const machine_config &mconfig, device_type type, co
m_out_int3_cb(*this),
m_out_int4_cb(*this),
m_out_int5_cb(*this),
- m_out_fdcirq_cb(*this),
- m_out_fdcdrq_cb(*this),
- m_out_blockirq_cb(*this),
m_out_fmwe_cb(*this),
m_out_wait_cb(*this),
m_in_tlb_cb(*this, 0),
@@ -324,21 +321,6 @@ void h89bus_device::set_int5_line(int state)
m_out_int5_cb(state);
}
-void h89bus_device::set_fdcirq_line(int state)
-{
- m_out_fdcirq_cb(state);
-}
-
-void h89bus_device::set_fdcdrq_line(int state)
-{
- m_out_fdcdrq_cb(state);
-}
-
-void h89bus_device::set_blockirq_line(int state)
-{
- m_out_blockirq_cb(state);
-}
-
void h89bus_device::set_fmwe_line(int state)
{
m_out_fmwe_cb(state);
diff --git a/src/devices/bus/heathzenith/h89/h89bus.h b/src/devices/bus/heathzenith/h89/h89bus.h
index 8befec480bb..0cfe29da10a 100644
--- a/src/devices/bus/heathzenith/h89/h89bus.h
+++ b/src/devices/bus/heathzenith/h89/h89bus.h
@@ -149,9 +149,6 @@ public:
void set_slot_int3(int state);
void set_slot_int4(int state);
void set_slot_int5(int state);
- void set_slot_fdcirq(int state);
- void set_slot_fdcdrq(int state);
- void set_slot_blockirq(int state);
void set_slot_fmwe(int state);
void set_slot_wait(int state);
int get_io0();
@@ -304,9 +301,6 @@ public:
auto out_int3_callback() { return m_out_int3_cb.bind(); }
auto out_int4_callback() { return m_out_int4_cb.bind(); }
auto out_int5_callback() { return m_out_int5_cb.bind(); }
- auto out_fdcirq_callback() { return m_out_fdcirq_cb.bind(); }
- auto out_fdcdrq_callback() { return m_out_fdcdrq_cb.bind(); }
- auto out_blockirq_callback() { return m_out_blockirq_cb.bind(); }
auto out_fmwe_callback() { return m_out_fmwe_cb.bind(); }
auto out_wait_callback() { return m_out_wait_cb.bind(); }
auto in_tlb_callback() { return m_in_tlb_cb.bind(); }
@@ -329,9 +323,6 @@ protected:
void set_int3_line(int state);
void set_int4_line(int state);
void set_int5_line(int state);
- void set_fdcirq_line(int state);
- void set_fdcdrq_line(int state);
- void set_blockirq_line(int state);
void set_fmwe_line(int state);
void set_wait_line(int state);
u8 read_gpp();
@@ -343,7 +334,7 @@ protected:
int m_io0, m_io1, m_mem0, m_mem1;
private:
- devcb_write_line m_out_int3_cb, m_out_int4_cb, m_out_int5_cb, m_out_fdcirq_cb, m_out_fdcdrq_cb, m_out_blockirq_cb;
+ devcb_write_line m_out_int3_cb, m_out_int4_cb, m_out_int5_cb;
devcb_write_line m_out_fmwe_cb, m_out_wait_cb;
devcb_read8 m_in_tlb_cb, m_in_nmi_cb, m_in_gpp_cb;
devcb_write8 m_out_tlb_cb, m_out_nmi_cb, m_out_gpp_cb;
@@ -390,21 +381,6 @@ inline void device_h89bus_right_card_interface::set_slot_int5(int state)
h89bus().set_int5_line(state);
}
-inline void device_h89bus_right_card_interface::set_slot_fdcirq(int state)
-{
- h89bus().set_fdcirq_line(state);
-}
-
-inline void device_h89bus_right_card_interface::set_slot_fdcdrq(int state)
-{
- h89bus().set_fdcdrq_line(state);
-}
-
-inline void device_h89bus_right_card_interface::set_slot_blockirq(int state)
-{
- h89bus().set_blockirq_line(state);
-}
-
inline void device_h89bus_right_card_interface::set_slot_fmwe(int state)
{
if (m_p506_signals)
diff --git a/src/mame/heathzenith/intr_cntrl.cpp b/src/devices/bus/heathzenith/h89/intr_cntrl.cpp
index 961d2662bb1..961d2662bb1 100644
--- a/src/mame/heathzenith/intr_cntrl.cpp
+++ b/src/devices/bus/heathzenith/h89/intr_cntrl.cpp
diff --git a/src/mame/heathzenith/intr_cntrl.h b/src/devices/bus/heathzenith/h89/intr_cntrl.h
index e0e9c3966f7..b4f9b76f840 100644
--- a/src/mame/heathzenith/intr_cntrl.h
+++ b/src/devices/bus/heathzenith/h89/intr_cntrl.h
@@ -8,8 +8,8 @@
****************************************************************************/
-#ifndef MAME_HEATHZENITH_INTR_CNTRL_H
-#define MAME_HEATHZENITH_INTR_CNTRL_H
+#ifndef MAME_BUS_HEATHZENITH_H89_INTR_CNTRL_H
+#define MAME_BUS_HEATHZENITH_H89_INTR_CNTRL_H
#pragma once
@@ -165,4 +165,4 @@ protected:
DECLARE_DEVICE_TYPE(HEATH_INTR_SOCKET, heath_intr_socket)
-#endif // MAME_HEATHZENITH_H89_INTR_CNTRL_H
+#endif // MAME_BUS_HEATHZENITH_H89_INTR_CNTRL_H
diff --git a/src/devices/bus/heathzenith/h89/mms77316_fdc.cpp b/src/devices/bus/heathzenith/h89/mms77316_fdc.cpp
index b0af15bdcea..87a1599d8a2 100644
--- a/src/devices/bus/heathzenith/h89/mms77316_fdc.cpp
+++ b/src/devices/bus/heathzenith/h89/mms77316_fdc.cpp
@@ -14,9 +14,6 @@
#include "mms77316_fdc.h"
-#include "imagedev/floppy.h"
-#include "machine/wd_fdc.h"
-
#define LOG_REG (1U << 1) // Shows register setup
#define LOG_LINES (1U << 2) // Show control lines
#define LOG_DRIVE (1U << 3) // Show drive select
@@ -43,60 +40,13 @@
#define FUNCNAME __PRETTY_FUNCTION__
#endif
-namespace {
-
-class mms77316_fdc_device : public device_t, public device_h89bus_right_card_interface
-{
-public:
- mms77316_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
-
- virtual void write(u8 select_lines, u8 offset, u8 data) override;
- virtual u8 read(u8 select_lines, u8 offset) override;
-
-protected:
- virtual void device_start() override ATTR_COLD;
- virtual void device_reset() override ATTR_COLD;
- virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
-
- void ctrl_w(u8 val);
- void data_w(u8 val);
- u8 data_r();
-
- void set_irq(int state);
- void set_drq(int state);
-
- // Burst mode was required for a 2 MHz Z80 to handle 8" DD data rates.
- // The typical irq/drq was too slow, this utilizes wait states to read the
- // WD1797 data port once the drq line is high.
- inline bool burst_mode_r() { return !m_drq_allowed; }
-
-private:
- required_device<fd1797_device> m_fdc;
- required_device_array<floppy_connector, 8> m_floppies;
-
- bool m_irq_allowed;
- bool m_drq_allowed;
-
- bool m_irq;
- bool m_drq;
- u32 m_drq_count;
-
- /// Bits set in cmd_ControlPort_c
- static constexpr u8 ctrl_525DriveSel_c = 2;
- static constexpr u8 ctrl_EnableIntReq_c = 3;
- static constexpr u8 ctrl_EnableDrqInt_c = 5;
- static constexpr u8 ctrl_SetMFMRecording_c = 6;
-
- static constexpr XTAL MASTER_CLOCK = XTAL(8'000'000);
- static constexpr XTAL FIVE_IN_CLOCK = MASTER_CLOCK / 8;
- static constexpr XTAL EIGHT_IN_CLOCK = MASTER_CLOCK / 4;
-};
mms77316_fdc_device::mms77316_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock):
device_t(mconfig, H89BUS_MMS77316, tag, owner, 0),
device_h89bus_right_card_interface(mconfig, *this),
m_fdc(*this, "mms_fdc"),
- m_floppies(*this, "mms_fdc:%u", 0U)
+ m_floppies(*this, "mms_fdc:%u", 0U),
+ m_intr_cntrl(*this, finder_base::DUMMY_TAG)
{
}
@@ -117,13 +67,13 @@ void mms77316_fdc_device::ctrl_w(u8 val)
if (m_irq_allowed)
{
- set_slot_fdcirq(m_irq);
- set_slot_fdcdrq(m_drq);
+ m_intr_cntrl->set_irq(m_irq);
+ m_intr_cntrl->set_drq(m_drq);
}
else
{
- set_slot_fdcirq(CLEAR_LINE);
- set_slot_fdcdrq(CLEAR_LINE);
+ m_intr_cntrl->set_irq(CLEAR_LINE);
+ m_intr_cntrl->set_drq(CLEAR_LINE);
}
LOGDRIVE("%s: floppydrive: %d, 5.25 in: %d\n", FUNCNAME, floppy_drive, five_in_drv);
@@ -273,8 +223,8 @@ void mms77316_fdc_device::device_reset()
m_irq = false;
m_drq_count = 0;
- set_slot_fdcirq(CLEAR_LINE);
- set_slot_fdcdrq(CLEAR_LINE);
+ m_intr_cntrl->set_irq(CLEAR_LINE);
+ m_intr_cntrl->set_drq(CLEAR_LINE);
set_slot_wait(CLEAR_LINE);
for (int i = 0; i < 4; i++)
@@ -355,7 +305,7 @@ void mms77316_fdc_device::set_irq(int state)
m_drq_count = 0;
}
- set_slot_fdcirq(m_irq_allowed ? m_irq : CLEAR_LINE);
+ m_intr_cntrl->set_irq(m_irq_allowed ? m_irq : CLEAR_LINE);
}
void mms77316_fdc_device::set_drq(int state)
@@ -373,14 +323,12 @@ void mms77316_fdc_device::set_drq(int state)
set_slot_wait(CLEAR_LINE);
}
- set_slot_fdcdrq(m_drq_count == 0 ? m_drq : CLEAR_LINE);
+ m_intr_cntrl->set_drq(m_drq_count == 0 ? m_drq : CLEAR_LINE);
}
else
{
- set_slot_fdcdrq(m_drq_allowed ? m_drq : CLEAR_LINE);
+ m_intr_cntrl->set_drq(m_drq_allowed ? m_drq : CLEAR_LINE);
}
}
-} // anonymous namespace
-
DEFINE_DEVICE_TYPE_PRIVATE(H89BUS_MMS77316, device_h89bus_right_card_interface, mms77316_fdc_device, "mms77316_fdc", "Magnolia MicroSystems 77316 Soft-sectored Controller");
diff --git a/src/devices/bus/heathzenith/h89/mms77316_fdc.h b/src/devices/bus/heathzenith/h89/mms77316_fdc.h
index 699db267adf..04838c0fff6 100644
--- a/src/devices/bus/heathzenith/h89/mms77316_fdc.h
+++ b/src/devices/bus/heathzenith/h89/mms77316_fdc.h
@@ -13,6 +13,61 @@
#include "h89bus.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+
+#include "bus/heathzenith/h89/intr_cntrl.h"
+
+class mms77316_fdc_device : public device_t, public device_h89bus_right_card_interface
+{
+public:
+ mms77316_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ virtual void write(u8 select_lines, u8 offset, u8 data) override;
+ virtual u8 read(u8 select_lines, u8 offset) override;
+
+ template <typename T> void set_intr_cntrl(T &&tag) { m_intr_cntrl.set_tag(std::forward<T>(tag)); }
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+
+ void ctrl_w(u8 val);
+ void data_w(u8 val);
+ u8 data_r();
+
+ void set_irq(int state);
+ void set_drq(int state);
+
+ // Burst mode was required for a 2 MHz Z80 to handle 8" DD data rates.
+ // The typical irq/drq was too slow, this utilizes wait states to read the
+ // WD1797 data port once the drq line is high.
+ inline bool burst_mode_r() { return !m_drq_allowed; }
+
+private:
+ required_device<fd1797_device> m_fdc;
+ required_device_array<floppy_connector, 8> m_floppies;
+ required_device<heath_intr_socket> m_intr_cntrl;
+
+ bool m_irq_allowed;
+ bool m_drq_allowed;
+
+ bool m_irq;
+ bool m_drq;
+ u32 m_drq_count;
+
+ /// Bits set in cmd_ControlPort_c
+ static constexpr u8 ctrl_525DriveSel_c = 2;
+ static constexpr u8 ctrl_EnableIntReq_c = 3;
+ static constexpr u8 ctrl_EnableDrqInt_c = 5;
+ static constexpr u8 ctrl_SetMFMRecording_c = 6;
+
+ static constexpr XTAL MASTER_CLOCK = XTAL(8'000'000);
+ static constexpr XTAL FIVE_IN_CLOCK = MASTER_CLOCK / 8;
+ static constexpr XTAL EIGHT_IN_CLOCK = MASTER_CLOCK / 4;
+};
+
DECLARE_DEVICE_TYPE(H89BUS_MMS77316, device_h89bus_right_card_interface)
#endif // MAME_BUS_HEATHZENITH_H89_MMS77316_FDC_H
diff --git a/src/devices/bus/heathzenith/h89/z37_fdc.cpp b/src/devices/bus/heathzenith/h89/z37_fdc.cpp
index 41dc53b4b8a..af0c4d9ae79 100644
--- a/src/devices/bus/heathzenith/h89/z37_fdc.cpp
+++ b/src/devices/bus/heathzenith/h89/z37_fdc.cpp
@@ -35,65 +35,16 @@
#define FUNCNAME __PRETTY_FUNCTION__
#endif
-namespace {
-
-class h89bus_z37_device : public device_t, public device_h89bus_right_card_interface
-{
-public:
- h89bus_z37_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
-
- virtual void write(u8 select_lines, u8 offset, u8 data) override;
- virtual u8 read(u8 select_lines, u8 offset) override;
-
-protected:
- virtual void device_start() override ATTR_COLD;
- virtual void device_reset() override ATTR_COLD;
- virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
-
- void ctrl_w(u8 val);
-
- void intf_w(u8 val);
-
- void cmd_w(u8 val);
- u8 stat_r();
-
- void data_w(u8 val);
- u8 data_r();
-
- void set_irq(int state);
- void set_drq(int state);
-
-private:
- required_device<fd1797_device> m_fdc;
- required_device_array<floppy_connector, 4> m_floppies;
-
- bool m_irq_allowed;
- bool m_drq_allowed;
- bool m_access_track_sector;
-
- /// Bits set in cmd_ControlPort_c - DK.CON
- static constexpr u8 ctrl_EnableIntReq_c = 0;
- static constexpr u8 ctrl_EnableDrqInt_c = 1;
- static constexpr u8 ctrl_SetMFMRecording_c = 2;
- static constexpr u8 ctrl_MotorsOn_c = 3;
- static constexpr u8 ctrl_Drive_0_c = 4;
- static constexpr u8 ctrl_Drive_1_c = 5;
- static constexpr u8 ctrl_Drive_2_c = 6;
- static constexpr u8 ctrl_Drive_3_c = 7;
-
- /// Bits to set alternate registers on InterfaceControl_c - DK.INT
- static constexpr u8 if_SelectSectorTrack_c = 0;
-};
h89bus_z37_device::h89bus_z37_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock):
device_t(mconfig, H89BUS_Z37, tag, owner, 0),
device_h89bus_right_card_interface(mconfig, *this),
m_fdc(*this, "z37_fdc"),
- m_floppies(*this, "z37_fdc:%u", 0U)
+ m_floppies(*this, "z37_fdc:%u", 0U),
+ m_intr_cntrl(*this, finder_base::DUMMY_TAG)
{
}
-
void h89bus_z37_device::ctrl_w(u8 val)
{
bool motor_on = bool(BIT(val, ctrl_MotorsOn_c));
@@ -107,12 +58,12 @@ void h89bus_z37_device::ctrl_w(u8 val)
if (m_drq_allowed)
{
- set_slot_blockirq(1);
+ m_intr_cntrl->block_interrupts(1);
}
else
{
- set_slot_blockirq(0);
- set_slot_fdcdrq(0);
+ m_intr_cntrl->block_interrupts(0);
+ m_intr_cntrl->set_drq(0);
}
if (BIT(val, ctrl_Drive_0_c))
@@ -246,9 +197,9 @@ void h89bus_z37_device::device_reset()
m_drq_allowed = false;
m_access_track_sector = false;
- set_slot_fdcirq(0);
- set_slot_fdcdrq(0);
- set_slot_blockirq(0);
+ m_intr_cntrl->set_irq(0);
+ m_intr_cntrl->set_drq(0);
+ m_intr_cntrl->block_interrupts(0);
}
static void z37_floppies(device_slot_interface &device)
@@ -285,16 +236,14 @@ void h89bus_z37_device::set_irq(int state)
{
LOGLINES("set irq, allowed: %d state: %d\n", m_irq_allowed, state);
- set_slot_fdcirq(m_irq_allowed ? state : CLEAR_LINE);
+ m_intr_cntrl->set_irq(m_irq_allowed ? state : CLEAR_LINE);
}
void h89bus_z37_device::set_drq(int state)
{
LOGLINES("set drq, allowed: %d state: %d\n", m_drq_allowed, state);
- set_slot_fdcdrq(m_drq_allowed ? state : CLEAR_LINE);
+ m_intr_cntrl->set_drq(m_drq_allowed ? state : CLEAR_LINE);
}
-} // anonymous namespace
-
DEFINE_DEVICE_TYPE_PRIVATE(H89BUS_Z37, device_h89bus_right_card_interface, h89bus_z37_device, "h89_z37", "Heathkit Z-37 Floppy Disk Controller");
diff --git a/src/devices/bus/heathzenith/h89/z37_fdc.h b/src/devices/bus/heathzenith/h89/z37_fdc.h
index 045ccabc74a..ad2e52027be 100644
--- a/src/devices/bus/heathzenith/h89/z37_fdc.h
+++ b/src/devices/bus/heathzenith/h89/z37_fdc.h
@@ -13,6 +13,59 @@
#include "h89bus.h"
+#include "bus/heathzenith/h89/intr_cntrl.h"
+
+class h89bus_z37_device : public device_t, public device_h89bus_right_card_interface
+{
+public:
+ h89bus_z37_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0);
+
+ virtual void write(u8 select_lines, u8 offset, u8 data) override;
+ virtual u8 read(u8 select_lines, u8 offset) override;
+
+ template <typename T> void set_intr_cntrl(T &&tag) { m_intr_cntrl.set_tag(std::forward<T>(tag)); }
+
+protected:
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+ virtual void device_add_mconfig(machine_config &config) override ATTR_COLD;
+
+ void ctrl_w(u8 val);
+
+ void intf_w(u8 val);
+
+ void cmd_w(u8 val);
+ u8 stat_r();
+
+ void data_w(u8 val);
+ u8 data_r();
+
+ void set_irq(int state);
+ void set_drq(int state);
+
+private:
+ required_device<fd1797_device> m_fdc;
+ required_device_array<floppy_connector, 4> m_floppies;
+ required_device<heath_intr_socket> m_intr_cntrl;
+
+ bool m_irq_allowed;
+ bool m_drq_allowed;
+ bool m_access_track_sector;
+
+ /// Bits set in cmd_ControlPort_c - DK.CON
+ static constexpr u8 ctrl_EnableIntReq_c = 0;
+ static constexpr u8 ctrl_EnableDrqInt_c = 1;
+ static constexpr u8 ctrl_SetMFMRecording_c = 2;
+ static constexpr u8 ctrl_MotorsOn_c = 3;
+ static constexpr u8 ctrl_Drive_0_c = 4;
+ static constexpr u8 ctrl_Drive_1_c = 5;
+ static constexpr u8 ctrl_Drive_2_c = 6;
+ static constexpr u8 ctrl_Drive_3_c = 7;
+
+ /// Bits to set alternate registers on InterfaceControl_c - DK.INT
+ static constexpr u8 if_SelectSectorTrack_c = 0;
+};
+
DECLARE_DEVICE_TYPE(H89BUS_Z37, device_h89bus_right_card_interface)
#endif // MAME_BUS_HEATHZENITH_H89_Z37_FDC_H
diff --git a/src/mame/heathzenith/h89.cpp b/src/mame/heathzenith/h89.cpp
index 04029c902ee..19300b532e9 100644
--- a/src/mame/heathzenith/h89.cpp
+++ b/src/mame/heathzenith/h89.cpp
@@ -43,12 +43,18 @@
#include "emu.h"
-#include "intr_cntrl.h"
-
#include "bus/heathzenith/h19/tlb.h"
#include "bus/heathzenith/h89/h89bus.h"
-#include "bus/heathzenith/h89/cards.h"
+#include "bus/heathzenith/h89/intr_cntrl.h"
+#include "bus/heathzenith/h89/cdr_fdc_880h.h"
+#include "bus/heathzenith/h89/h_88_3.h"
+#include "bus/heathzenith/h89/h_88_5.h"
+#include "bus/heathzenith/h89/mms77316_fdc.h"
#include "bus/heathzenith/h89/sigmasoft_parallel_port.h"
+#include "bus/heathzenith/h89/sigmasoft_sound.h"
+#include "bus/heathzenith/h89/we_pullup.h"
+#include "bus/heathzenith/h89/z_89_11.h"
+#include "bus/heathzenith/h89/z37_fdc.h"
#include "cpu/z80/z80.h"
#include "machine/ins8250.h"
@@ -161,6 +167,9 @@ protected:
template <int line> void slot_irq(int state);
void h89_left_cards(device_slot_interface &device);
+ void h89_right_cards(device_slot_interface &device);
+ void h89_right_cards_mms(device_slot_interface &device);
+ void h89_right_p506_cards(device_slot_interface &device);
};
/**
@@ -934,6 +943,39 @@ void h89_base_state::h89_left_cards(device_slot_interface &device)
});
}
+void h89_base_state::h89_right_cards(device_slot_interface &device)
+{
+ device.option_add("cdr_fdc", H89BUS_CDR_FDC_880H);
+ device.option_add("h_88_3", H89BUS_H_88_3);
+ device.option_add("ha_88_3", H89BUS_HA_88_3);
+ device.option_add("h_88_5", H89BUS_H_88_5);
+ device.option_add("ss_snd", H89BUS_SIGMASOFT_SND);
+ device.option_add("z_89_11", H89BUS_Z_89_11);
+
+ device.option_add("z37fdc", H89BUS_Z37).machine_config(
+ [this](device_t *device)
+ {
+ downcast<h89bus_z37_device &>(*device).set_intr_cntrl(m_intr_socket);
+ });
+}
+
+void h89_base_state::h89_right_cards_mms(device_slot_interface &device)
+{
+ h89_right_cards(device);
+ device.option_add("mms77316", H89BUS_MMS77316).machine_config(
+ [this](device_t *device)
+ {
+ downcast<mms77316_fdc_device &>(*device).set_intr_cntrl(m_intr_socket);
+ });
+}
+
+void h89_base_state::h89_right_p506_cards(device_slot_interface &device)
+{
+ device.option_add("h_88_3", H89BUS_H_88_3);
+ device.option_add("ha_88_3", H89BUS_HA_88_3);
+ device.option_add("ss_snd", H89BUS_SIGMASOFT_SND);
+ device.option_add("we_pullup", H89BUS_WE_PULLUP);
+}
void h89_base_state::h89_base(machine_config &config)
{
@@ -979,16 +1021,13 @@ void h89_base_state::h89_base(machine_config &config)
m_h89bus->out_int4_callback().set(FUNC(h89_base_state::slot_irq<4>));
m_h89bus->out_int5_callback().set(FUNC(h89_base_state::slot_irq<5>));
m_h89bus->out_wait_callback().set(FUNC(h89_base_state::set_wait_state));
- m_h89bus->out_fdcirq_callback().set(m_intr_socket, FUNC(heath_intr_socket::set_irq));
- m_h89bus->out_fdcdrq_callback().set(m_intr_socket, FUNC(heath_intr_socket::set_drq));
- m_h89bus->out_blockirq_callback().set(m_intr_socket, FUNC(heath_intr_socket::block_interrupts));
m_h89bus->out_fmwe_callback().set(FUNC(h89_base_state::set_fmwe));
H89BUS_LEFT_SLOT(config, "p501", "h89bus", [this](device_slot_interface &device) { h89_left_cards(device); }, nullptr);
H89BUS_LEFT_SLOT(config, "p502", "h89bus", [this](device_slot_interface &device) { h89_left_cards(device); }, nullptr);
H89BUS_LEFT_SLOT(config, "p503", "h89bus", [this](device_slot_interface &device) { h89_left_cards(device); }, nullptr);
- H89BUS_RIGHT_SLOT(config, "p504", "h89bus", h89_right_cards, nullptr);
- H89BUS_RIGHT_SLOT(config, "p505", "h89bus", h89_right_cards, "ha_88_3");
- H89BUS_RIGHT_SLOT(config, "p506", "h89bus", h89_right_p506_cards, "we_pullup").set_p506_signalling(true);
+ H89BUS_RIGHT_SLOT(config, "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards(device); }, nullptr);
+ H89BUS_RIGHT_SLOT(config, "p505", "h89bus", [this](device_slot_interface &device) { h89_right_cards(device); }, "ha_88_3");
+ H89BUS_RIGHT_SLOT(config, "p506", "h89bus", [this](device_slot_interface &device) { h89_right_p506_cards(device); }, "we_pullup").set_p506_signalling(true);
// H89 interrupt interval is 2mSec
TIMER(config, "irq_timer", 0).configure_periodic(FUNC(h89_base_state::h89_irq_timer), attotime::from_msec(2));
@@ -1002,7 +1041,7 @@ void h88_state::h88(machine_config &config)
m_intr_socket->set_default_option("original");
m_intr_socket->set_fixed(true);
- H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", h89_right_cards, "h_88_5");
+ H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards(device); }, "h_88_5");
}
void h89_state::h89(machine_config &config)
@@ -1013,7 +1052,7 @@ void h89_state::h89(machine_config &config)
m_intr_socket->set_default_option("h37");
m_intr_socket->set_fixed(true);
- H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", h89_right_cards, "z37fdc");
+ H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards(device); }, "z37fdc");
}
void h89_cdr_state::h89_cdr(machine_config &config)
@@ -1024,7 +1063,7 @@ void h89_cdr_state::h89_cdr(machine_config &config)
m_intr_socket->set_default_option("original");
m_intr_socket->set_fixed(true);
- H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", h89_right_cards, "cdr_fdc");
+ H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards(device); }, "cdr_fdc");
}
void h89_mms_state::h89_mms(machine_config &config)
@@ -1036,9 +1075,8 @@ void h89_mms_state::h89_mms(machine_config &config)
m_h89bus->out_gpp_callback().set(FUNC(h89_mms_state::port_f2_mms_w));
// the card selection is different with the MMS mapping PROM
- H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", h89_right_cards_mms, "mms77316");
- H89BUS_RIGHT_SLOT(config.replace(), "p505", "h89bus", h89_right_cards_mms, "ha_88_3");
- H89BUS_RIGHT_SLOT(config.replace(), "p506", "h89bus", h89_right_cards_mms, nullptr).set_p506_signalling(true);
+ H89BUS_RIGHT_SLOT(config.replace(), "p504", "h89bus", [this](device_slot_interface &device) { h89_right_cards_mms(device); }, "mms77316");
+ H89BUS_RIGHT_SLOT(config.replace(), "p505", "h89bus", [this](device_slot_interface &device) { h89_right_cards_mms(device); }, "ha_88_3");
m_intr_socket->set_default_option("mms");
m_intr_socket->set_fixed(true);