diff options
author | MetalliC <0vetal0@gmail.com> | 2020-05-26 14:50:34 +0300 |
---|---|---|
committer | MetalliC <0vetal0@gmail.com> | 2020-05-26 14:50:34 +0300 |
commit | 0fe92226a8d8f60a95874edf845dd6e124c37b77 (patch) | |
tree | 12629d64c95c09951ea9d18a3b34510bd4a1b899 /src/devices/bus | |
parent | 2eed331a2a6b62c4ab9f173157ca2382d0faa89a (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.cpp | 52 | ||||
-rw-r--r-- | src/devices/bus/spectrum/beta.h | 4 | ||||
-rw-r--r-- | src/devices/bus/spectrum/beta128.cpp | 47 | ||||
-rw-r--r-- | src/devices/bus/spectrum/beta128.h | 4 |
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(); }; |