summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/ti99/peb/ti_fdc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/ti99/peb/ti_fdc.cpp')
-rw-r--r--src/devices/bus/ti99/peb/ti_fdc.cpp99
1 files changed, 47 insertions, 52 deletions
diff --git a/src/devices/bus/ti99/peb/ti_fdc.cpp b/src/devices/bus/ti99/peb/ti_fdc.cpp
index 92f450b6627..3daeb24d41f 100644
--- a/src/devices/bus/ti99/peb/ti_fdc.cpp
+++ b/src/devices/bus/ti99/peb/ti_fdc.cpp
@@ -17,24 +17,24 @@
#include "formats/ti99_dsk.h"
#include "machine/rescap.h"
-#define LOG_WARN (1U<<1) // Warnings
-#define LOG_CONFIG (1U<<2)
-#define LOG_RW (1U<<3)
-#define LOG_PORTS (1U<<4) // too noisy in RW
-#define LOG_CRU (1U<<5)
-#define LOG_READY (1U<<6)
-#define LOG_SIGNALS (1U<<7)
-#define LOG_DRQ (1U<<8) // too noisy in SIGNALS
-#define LOG_DATA (1U<<9)
-#define LOG_MOTOR (1U<<10)
-#define LOG_ADDRESS (1U<<11)
-
-#define VERBOSE ( LOG_CONFIG | LOG_WARN )
+#define LOG_WARN (1U << 1) // Warnings
+#define LOG_CONFIG (1U << 2)
+#define LOG_RW (1U << 3)
+#define LOG_PORTS (1U << 4) // too noisy in RW
+#define LOG_CRU (1U << 5)
+#define LOG_READY (1U << 6)
+#define LOG_SIGNALS (1U << 7)
+#define LOG_DRQ (1U << 8) // too noisy in SIGNALS
+#define LOG_DATA (1U << 9)
+#define LOG_MOTOR (1U << 10)
+#define LOG_ADDRESS (1U << 11)
+
+#define VERBOSE (LOG_GENERAL | LOG_CONFIG | LOG_WARN)
#include "logmacro.h"
-DEFINE_DEVICE_TYPE_NS(TI99_FDC, bus::ti99::peb, ti_fdc_device, "ti99_fdc", "TI-99 Standard DSSD Floppy Controller")
+DEFINE_DEVICE_TYPE(TI99_FDC, bus::ti99::peb::ti_fdc_device, "ti99_fdc", "TI-99 Standard DSSD Floppy Controller")
-namespace bus { namespace ti99 { namespace peb {
+namespace bus::ti99::peb {
// ----------------------------------
#define FDC_TAG "fd1771"
@@ -56,6 +56,7 @@ ti_fdc_device::ti_fdc_device(const machine_config &mconfig, const char *tag, dev
m_crulatch(*this, "crulatch"),
m_motormf(*this, "motormf"),
m_dsrrom(nullptr),
+ m_floppy(*this, "%u", 0),
m_sel_floppy(0)
{
}
@@ -79,21 +80,21 @@ void ti_fdc_device::operate_ready_line()
/*
* Callbacks from the FD1771 chip
*/
-WRITE_LINE_MEMBER( ti_fdc_device::fdc_irq_w )
+void ti_fdc_device::fdc_irq_w(int state)
{
m_IRQ = state? ASSERT_LINE : CLEAR_LINE;
LOGMASKED(LOG_SIGNALS, "INTRQ callback = %d\n", m_IRQ);
operate_ready_line();
}
-WRITE_LINE_MEMBER( ti_fdc_device::fdc_drq_w )
+void ti_fdc_device::fdc_drq_w(int state)
{
m_DRQ = state? ASSERT_LINE : CLEAR_LINE;
LOGMASKED(LOG_DRQ, "DRQ callback = %d\n", m_DRQ);
operate_ready_line();
}
-WRITE_LINE_MEMBER( ti_fdc_device::fdc_hld_w )
+void ti_fdc_device::fdc_hld_w(int state)
{
m_HLD = state? ASSERT_LINE : CLEAR_LINE;
LOGMASKED(LOG_SIGNALS, "HLD callback = %d\n", m_HLD);
@@ -230,7 +231,7 @@ void ti_fdc_device::cruwrite(offs_t offset, uint8_t data)
m_crulatch->write_bit((offset >> 1) & 0x07, BIT(data, 0));
}
-WRITE_LINE_MEMBER(ti_fdc_device::dskpgena_w)
+void ti_fdc_device::dskpgena_w(int state)
{
// (De)select the card. Indicated by a LED on the board.
m_selected = state;
@@ -240,12 +241,12 @@ WRITE_LINE_MEMBER(ti_fdc_device::dskpgena_w)
/*
Trigger the motor monoflop.
*/
-WRITE_LINE_MEMBER(ti_fdc_device::kaclk_w)
+void ti_fdc_device::kaclk_w(int state)
{
m_motormf->b_w(state);
}
-WRITE_LINE_MEMBER(ti_fdc_device::dvena_w)
+void ti_fdc_device::dvena_w(int state)
{
m_DVENA = state;
LOGMASKED(LOG_MOTOR, "Motor %s\n", state? "on" : "off");
@@ -255,13 +256,14 @@ WRITE_LINE_MEMBER(ti_fdc_device::dvena_w)
// Set all motors
for (auto & elem : m_floppy)
- if (elem != nullptr) elem->mon_w((state==ASSERT_LINE)? 0 : 1);
+ if (elem->get_device() != nullptr)
+ elem->get_device()->mon_w((state==ASSERT_LINE)? 0 : 1);
// The motor-on line also connects to the wait state logic
operate_ready_line();
}
-WRITE_LINE_MEMBER(ti_fdc_device::waiten_w)
+void ti_fdc_device::waiten_w(int state)
{
// Set disk ready/hold (bit 2)
// 0: ignore IRQ and DRQ
@@ -271,33 +273,34 @@ WRITE_LINE_MEMBER(ti_fdc_device::waiten_w)
LOGMASKED(LOG_CRU, "Arm wait state logic (bit 2) = %d\n", state);
}
-WRITE_LINE_MEMBER(ti_fdc_device::hlt_w)
+void ti_fdc_device::hlt_w(int state)
{
// Load disk heads (HLT pin) (bit 3). Not implemented.
LOGMASKED(LOG_CRU, "Set head load (bit 3) = %d\n", state);
}
-WRITE_LINE_MEMBER(ti_fdc_device::sidsel_w)
+void ti_fdc_device::sidsel_w(int state)
{
// Select side of disk (bit 7)
LOGMASKED(LOG_CRU, "Set side (bit 7) = %d\n", state);
- if (m_sel_floppy != 0) m_floppy[m_sel_floppy-1]->ss_w(state);
+ if (m_sel_floppy > 0)
+ m_floppy[m_sel_floppy-1]->get_device()->ss_w(state);
}
/*
Drive selects
*/
-WRITE_LINE_MEMBER(ti_fdc_device::dsel1_w)
+void ti_fdc_device::dsel1_w(int state)
{
select_drive(1, state);
}
-WRITE_LINE_MEMBER(ti_fdc_device::dsel2_w)
+void ti_fdc_device::dsel2_w(int state)
{
select_drive(2, state);
}
-WRITE_LINE_MEMBER(ti_fdc_device::dsel3_w)
+void ti_fdc_device::dsel3_w(int state)
{
select_drive(3, state);
}
@@ -324,11 +327,11 @@ void ti_fdc_device::select_drive(int n, int state)
LOGMASKED(LOG_WARN, "Warning: DSK%d selected while DSK%d not yet unselected\n", n, m_sel_floppy);
}
- if (m_floppy[n-1] != nullptr)
+ if (m_floppy[n-1]->get_device() != nullptr)
{
m_sel_floppy = n;
- m_fd1771->set_floppy(m_floppy[n-1]);
- m_floppy[n-1]->ss_w(m_crulatch->q7_r());
+ m_fd1771->set_floppy(m_floppy[n-1]->get_device());
+ m_floppy[n-1]->get_device()->ss_w(m_crulatch->q7_r());
}
}
}
@@ -358,32 +361,24 @@ void ti_fdc_device::device_reset()
m_inDsrArea = false;
m_WDsel = false;
- for (int i=0; i < 3; i++)
+ for (auto &flop : m_floppy)
{
- if (m_floppy[i] != nullptr)
- LOGMASKED(LOG_CONFIG, "Connector %d with %s\n", i, m_floppy[i]->name());
+ if (flop->get_device() != nullptr)
+ LOGMASKED(LOG_CONFIG, "Connector %d with %s\n", flop->basetag(), flop->get_device()->name());
else
- LOGMASKED(LOG_CONFIG, "No floppy attached to connector %d\n", i);
+ LOGMASKED(LOG_CONFIG, "Connector %d has no floppy attached\n", flop->basetag());
}
m_sel_floppy = 0;
}
-void ti_fdc_device::device_config_complete()
+void ti_fdc_device::floppy_formats(format_registration &fr)
{
- // Seems to be null when doing a "-listslots"
- for (auto &elem : m_floppy)
- elem = nullptr;
- if (subdevice("0")!=nullptr) m_floppy[0] = static_cast<floppy_image_device*>(subdevice("0")->subdevices().first());
- if (subdevice("1")!=nullptr) m_floppy[1] = static_cast<floppy_image_device*>(subdevice("1")->subdevices().first());
- if (subdevice("2")!=nullptr) m_floppy[2] = static_cast<floppy_image_device*>(subdevice("2")->subdevices().first());
+ fr.add_mfm_containers();
+ fr.add(FLOPPY_TI99_SDF_FORMAT);
+ fr.add(FLOPPY_TI99_TDF_FORMAT);
}
-FLOPPY_FORMATS_MEMBER(ti_fdc_device::floppy_formats)
- FLOPPY_TI99_SDF_FORMAT,
- FLOPPY_TI99_TDF_FORMAT
-FLOPPY_FORMATS_END
-
static void tifdc_floppies(device_slot_interface &device)
{
device.option_add("525dd", FLOPPY_525_DD);
@@ -402,9 +397,9 @@ void ti_fdc_device::device_add_mconfig(machine_config& config)
m_fd1771->drq_wr_callback().set(FUNC(ti_fdc_device::fdc_drq_w));
m_fd1771->hld_wr_callback().set(FUNC(ti_fdc_device::fdc_hld_w));
- FLOPPY_CONNECTOR(config, "0", tifdc_floppies, "525dd", ti_fdc_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "1", tifdc_floppies, "525dd", ti_fdc_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "2", tifdc_floppies, nullptr, ti_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[0], tifdc_floppies, "525dd", ti_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[1], tifdc_floppies, "525dd", ti_fdc_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, m_floppy[2], tifdc_floppies, nullptr, ti_fdc_device::floppy_formats).enable_sound(true);
LS259(config, m_crulatch); // U23
m_crulatch->q_out_cb<0>().set(FUNC(ti_fdc_device::dskpgena_w));
@@ -429,4 +424,4 @@ const tiny_rom_entry *ti_fdc_device::device_rom_region() const
return ROM_NAME( ti_fdc );
}
-} } } // end namespace bus::ti99::peb
+} // end namespace bus::ti99::peb