diff options
-rw-r--r-- | scripts/src/bus.lua | 14 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/cards.cpp | 46 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/cards.h | 18 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/h89bus.cpp | 18 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/h89bus.h | 26 | ||||
-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.cpp | 74 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/mms77316_fdc.h | 55 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/z37_fdc.cpp | 71 | ||||
-rw-r--r-- | src/devices/bus/heathzenith/h89/z37_fdc.h | 53 | ||||
-rw-r--r-- | src/mame/heathzenith/h89.cpp | 68 |
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); |