summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus
diff options
context:
space:
mode:
author MetalliC <0vetal0@gmail.com>2020-05-26 14:50:34 +0300
committer MetalliC <0vetal0@gmail.com>2020-05-26 14:50:34 +0300
commit0fe92226a8d8f60a95874edf845dd6e124c37b77 (patch)
tree12629d64c95c09951ea9d18a3b34510bd4a1b899 /src/devices/bus
parent2eed331a2a6b62c4ab9f173157ca2382d0faa89a (diff)
ZX-Spectrum Beta-disc FDCs: modernize/fix FDD motor control
Diffstat (limited to 'src/devices/bus')
-rw-r--r--src/devices/bus/spectrum/beta.cpp52
-rw-r--r--src/devices/bus/spectrum/beta.h4
-rw-r--r--src/devices/bus/spectrum/beta128.cpp47
-rw-r--r--src/devices/bus/spectrum/beta128.h4
4 files changed, 79 insertions, 28 deletions
diff --git a/src/devices/bus/spectrum/beta.cpp b/src/devices/bus/spectrum/beta.cpp
index c171f54cd33..68f85d69d4f 100644
--- a/src/devices/bus/spectrum/beta.cpp
+++ b/src/devices/bus/spectrum/beta.cpp
@@ -98,6 +98,7 @@ DEFINE_DEVICE_TYPE(SPECTRUM_BETAPLUS, spectrum_betaplus_device, "spectrum_betapl
static void beta_floppies(device_slot_interface &device)
{
+ device.option_add("525sd", FLOPPY_525_SD);
device.option_add("525qd", FLOPPY_525_QD);
}
@@ -172,8 +173,6 @@ ROM_END
void spectrum_betav2_device::device_add_mconfig_base(machine_config& config)
{
- FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true);
- FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "fdc:2", beta_floppies, nullptr, spectrum_betav2_device::floppy_formats).enable_sound(true);
FLOPPY_CONNECTOR(config, "fdc:3", beta_floppies, nullptr, spectrum_betav2_device::floppy_formats).enable_sound(true);
@@ -186,12 +185,22 @@ void spectrum_betav2_device::device_add_mconfig_base(machine_config& config)
void spectrum_betav2_device::device_add_mconfig(machine_config &config)
{
FD1771(config, m_fdc, 4_MHz_XTAL / 4);
+ m_fdc->hld_wr_callback().set(FUNC(spectrum_betav2_device::fdc_hld_w));
+
+ FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525sd", spectrum_betav2_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525sd", spectrum_betav2_device::floppy_formats).enable_sound(true);
+
device_add_mconfig_base(config);
}
void spectrum_betav3_device::device_add_mconfig(machine_config& config)
{
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
+ m_fdc->hld_wr_callback().set(FUNC(spectrum_betav3_device::fdc_hld_w));
+
+ FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", beta_floppies, "525qd", spectrum_betav2_device::floppy_formats).enable_sound(true);
+
device_add_mconfig_base(config);
}
@@ -262,6 +271,8 @@ spectrum_betaplus_device::spectrum_betaplus_device(const machine_config &mconfig
void spectrum_betav2_device::device_start()
{
save_item(NAME(m_romcs));
+ save_item(NAME(m_control));
+ save_item(NAME(m_motor_active));
#if 0 // we do this in realtime instead
for (int i = 0; i < m_rom->bytes(); i++)
@@ -282,6 +293,7 @@ void spectrum_betav2_device::device_reset()
// always paged in on boot? (no mode switch like beta128)
m_romcs = 1;
m_romlatch = 0;
+ m_control = 0;
// m_masterportdisable = 1;
}
@@ -368,6 +380,7 @@ void spectrum_betav2_device::iorq_w(offs_t offset, uint8_t data)
floppy_image_device* floppy = m_floppy[data & 3]->get_device();
+ m_control = data;
m_fdc->set_floppy(floppy);
if (floppy)
floppy->ss_w(BIT(data, 4) ? 0 : 1);
@@ -376,18 +389,8 @@ void spectrum_betav2_device::iorq_w(offs_t offset, uint8_t data)
// bit 3 connected to pin 23 "HLT" of FDC and via diode to INDEX
//m_fdc->hlt_w(BIT(data, 3)); // not handled in current wd_fdc
- if (BIT(data, 2) == 0) // reset
- {
- m_fdc->reset();
- if (floppy)
- floppy->mon_w(ASSERT_LINE);
- }
- else
- {
- // TODO: implement correct motor control, FDD motor and RDY FDC pin controlled by HLD pin of FDC
- if (floppy)
- floppy->mon_w(CLEAR_LINE);
- }
+ m_fdc->mr_w(BIT(data, 2));
+ motors_control();
break;
}
}
@@ -417,6 +420,27 @@ void spectrum_betav2_device::mreq_w(offs_t offset, uint8_t data)
m_exp->mreq_w(offset, data);
}
+void spectrum_betav2_device::fdc_hld_w(int state)
+{
+ // TODO: HLD connected to RDY pin (current wd_fdc have no external RDY control)
+ m_motor_active = state;
+ motors_control();
+}
+
+void spectrum_betav2_device::motors_control()
+{
+ for (int i = 0; i < 4; i++)
+ {
+ floppy_image_device* floppy = m_floppy[i]->get_device();
+ if (!floppy)
+ continue;
+ if (m_motor_active && (m_control & 3) == i)
+ floppy->mon_w(CLEAR_LINE);
+ else
+ floppy->mon_w(ASSERT_LINE);
+ }
+}
+
// Betaplus has a 'magic button' for dumping RAM
INPUT_PORTS_START(betaplus)
diff --git a/src/devices/bus/spectrum/beta.h b/src/devices/bus/spectrum/beta.h
index 7fed611a49b..95571910c86 100644
--- a/src/devices/bus/spectrum/beta.h
+++ b/src/devices/bus/spectrum/beta.h
@@ -56,6 +56,10 @@ protected:
int m_romcs;
int m_romlatch;
// int m_masterportdisable;
+ u8 m_control;
+ bool m_motor_active;
+ void fdc_hld_w(int state);
+ void motors_control();
void fetch(offs_t offset);
};
diff --git a/src/devices/bus/spectrum/beta128.cpp b/src/devices/bus/spectrum/beta128.cpp
index a2240da737c..d24d1c0f76f 100644
--- a/src/devices/bus/spectrum/beta128.cpp
+++ b/src/devices/bus/spectrum/beta128.cpp
@@ -90,12 +90,12 @@ FLOPPY_FORMATS_END
ROM_START(beta128)
ROM_REGION(0x4000, "rom", 0)
- ROM_DEFAULT_BIOS("trd504")
+ ROM_DEFAULT_BIOS("trd503")
ROM_SYSTEM_BIOS(0, "trd501", "TR-DOS v5.01")
ROMX_LOAD("trd501.rom", 0x0000, 0x4000, CRC(3e3cdd4c) SHA1(8303ba0cc79daa6c04cd1e6ce27e8b6886a3f0de), ROM_BIOS(0))
ROM_SYSTEM_BIOS(1, "trd503", "TR-DOS v5.03")
ROMX_LOAD("trd503.rom", 0x0000, 0x4000, CRC(10751aba) SHA1(21695e3f2a8f796386ce66eea8a246b0ac44810c), ROM_BIOS(1))
- ROM_SYSTEM_BIOS(2, "trd504", "TR-DOS v5.04")
+ ROM_SYSTEM_BIOS(2, "trd504", "TR-DOS v5.04 (hack)")
ROMX_LOAD("trd504.rom", 0x0000, 0x4000, CRC(ba310874) SHA1(05e55e37df8eee6c68601ba9cf6c92195852ce3f), ROM_BIOS(2))
ROM_END
@@ -106,6 +106,7 @@ ROM_END
void spectrum_beta128_device::device_add_mconfig(machine_config &config)
{
FD1793(config, m_fdc, 4_MHz_XTAL / 4);
+ m_fdc->hld_wr_callback().set(FUNC(spectrum_beta128_device::fdc_hld_w));
//KR1818VG93(config, m_fdc, 4_MHz_XTAL / 4);
FLOPPY_CONNECTOR(config, "fdc:0", beta_floppies, "525qd", spectrum_beta128_device::floppy_formats).enable_sound(true);
@@ -141,6 +142,8 @@ spectrum_beta128_device::spectrum_beta128_device(const machine_config &mconfig,
, m_floppy(*this, "fdc:%u", 0)
, m_exp(*this, "exp")
, m_switch(*this, "SWITCH")
+ , m_control(0)
+ , m_motor_active(false)
{
}
@@ -151,6 +154,8 @@ spectrum_beta128_device::spectrum_beta128_device(const machine_config &mconfig,
void spectrum_beta128_device::device_start()
{
save_item(NAME(m_romcs));
+ save_item(NAME(m_control));
+ save_item(NAME(m_motor_active));
}
//-------------------------------------------------
@@ -164,6 +169,8 @@ void spectrum_beta128_device::device_reset()
m_romcs = 1;
else
m_romcs = 0;
+
+ m_control = 0;
}
//**************************************************************************
@@ -224,6 +231,7 @@ void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data)
case 0xff:
floppy_image_device* floppy = m_floppy[data & 3]->get_device();
+ m_control = data;
m_fdc->set_floppy(floppy);
if (floppy)
floppy->ss_w(BIT(data, 4) ? 0 : 1);
@@ -232,18 +240,8 @@ void spectrum_beta128_device::iorq_w(offs_t offset, uint8_t data)
// bit 3 connected to pin 23 "HLT" of FDC and via diode to INDEX
//m_fdc->hlt_w(BIT(data, 3)); // not handled in current wd_fdc
- if (BIT(data, 2) == 0) // reset
- {
- m_fdc->reset();
- if (floppy)
- floppy->mon_w(ASSERT_LINE);
- }
- else
- {
- // TODO: implement correct motor control, FDD motor and RDY FDC pin controlled by HLD pin of FDC
- if (floppy)
- floppy->mon_w(CLEAR_LINE);
- }
+ m_fdc->mr_w(BIT(data, 2));
+ motors_control();
break;
}
}
@@ -282,3 +280,24 @@ INPUT_CHANGED_MEMBER(spectrum_beta128_device::magic_button)
m_slot->nmi_w(CLEAR_LINE);
}
}
+
+void spectrum_beta128_device::fdc_hld_w(int state)
+{
+ // TODO: HLD connected to RDY pin (current wd_fdc have no external RDY control)
+ m_motor_active = state;
+ motors_control();
+}
+
+void spectrum_beta128_device::motors_control()
+{
+ for (int i = 0; i < 4; i++)
+ {
+ floppy_image_device* floppy = m_floppy[i]->get_device();
+ if (!floppy)
+ continue;
+ if (m_motor_active && (m_control & 3) == i)
+ floppy->mon_w(CLEAR_LINE);
+ else
+ floppy->mon_w(ASSERT_LINE);
+ }
+}
diff --git a/src/devices/bus/spectrum/beta128.h b/src/devices/bus/spectrum/beta128.h
index b3734687e72..97e7dfccb6d 100644
--- a/src/devices/bus/spectrum/beta128.h
+++ b/src/devices/bus/spectrum/beta128.h
@@ -54,6 +54,10 @@ protected:
required_ioport m_switch;
int m_romcs;
+ u8 m_control;
+ bool m_motor_active;
+ void fdc_hld_w(int state);
+ void motors_control();
};