From dcb8f6a391731f90db1018978a220d77b7764c3c Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sun, 11 Feb 2024 19:38:49 +0100 Subject: [PATCH] sfrj/idpartner.cpp add custom floppy drive z80 daisy chain device, fdc ready is tied low --- src/mame/sfrj/idpartner.cpp | 49 ++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/src/mame/sfrj/idpartner.cpp b/src/mame/sfrj/idpartner.cpp index 060f199d753..67d3a33a841 100644 --- a/src/mame/sfrj/idpartner.cpp +++ b/src/mame/sfrj/idpartner.cpp @@ -33,6 +33,48 @@ #include "imagedev/floppy.h" +// Partner use for all pheriperials Z80 daisy chain, and since Intel 8272 +// does not support it, there is actual implementation done in logic on the +// board, that does clear interrupt status on reset and acknowledge +class idpartner_floppy_daisy_device : public device_t, public device_z80daisy_interface +{ +public: + idpartner_floppy_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock = 0); + virtual ~idpartner_floppy_daisy_device() {}; + + // callbacks + auto int_handler() { return m_int_handler.bind(); } + + void set_vector(uint8_t vector) { m_vector = vector; } + void int_w(int state) { m_int = state; m_int_handler(state); } + +protected: + virtual void device_start() override { save_item(NAME(m_int)); } + virtual void device_reset() override { m_int = CLEAR_LINE; } + + // z80daisy_interface overrides + virtual int z80daisy_irq_state() override { return m_int ? Z80_DAISY_INT : 0; } + virtual int z80daisy_irq_ack() override { m_int = CLEAR_LINE; return m_vector; } + virtual void z80daisy_irq_reti() override { } + +private: + devcb_write_line m_int_handler; + + int m_int; + int m_vector; +}; + +DEFINE_DEVICE_TYPE(IDPARTNER_FLOPPY_DAISY, idpartner_floppy_daisy_device, "idpartner_floppy_daisy", "Iskra Delta Partner floppy daisy chain device") + +idpartner_floppy_daisy_device::idpartner_floppy_daisy_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, IDPARTNER_FLOPPY_DAISY, tag, owner, clock) + , device_z80daisy_interface(mconfig, *this) + , m_int_handler(*this) + , m_int(0) + , m_vector(0xff) +{ +} + namespace { class idpartner_state : public driver_device @@ -91,7 +133,7 @@ private: required_device m_sio2; required_device m_ctc; required_device m_fdc; - required_device m_fdc_daisy; + required_device m_fdc_daisy; required_device m_brg; required_device_array m_serial; std::unique_ptr m_ram; @@ -261,11 +303,12 @@ void idpartner_state::partner_base(machine_config &config) m_ctc->zc_callback<0>().set(m_ctc, FUNC(z80ctc_device::trg1)); m_ctc->zc_callback<2>().set(m_ctc, FUNC(z80ctc_device::trg3)); // optional - Z80DAISY_GENERIC(config, m_fdc_daisy, 0xff); + IDPARTNER_FLOPPY_DAISY(config, m_fdc_daisy); m_fdc_daisy->int_handler().set_inputline(m_maincpu, INPUT_LINE_IRQ0); - I8272A(config, m_fdc, 8_MHz_XTAL); + I8272A(config, m_fdc, 8_MHz_XTAL, false); m_fdc->intrq_wr_callback().set(FUNC(idpartner_state::fdc_int_w)); + m_fdc->ready_w(false); FLOPPY_CONNECTOR(config, "fdc:0", partner_floppies, "fdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true); FLOPPY_CONNECTOR(config, "fdc:1", partner_floppies, nullptr, floppy_image_device::default_mfm_floppy_formats).enable_sound(true);