diff --git a/src/devices/machine/iwm.cpp b/src/devices/machine/iwm.cpp index 3e847fec66b..9d9d6cbaa75 100644 --- a/src/devices/machine/iwm.cpp +++ b/src/devices/machine/iwm.cpp @@ -133,23 +133,33 @@ void iwm_device::write(offs_t offset, u8 data) void iwm_device::flush_write() { - if(m_floppy && m_flux_write_start && m_last_sync > m_flux_write_start) { - bool last_on_edge = m_flux_write_count && m_flux_write[m_flux_write_count-1] == m_last_sync; + if(!m_flux_write_start) + return; + + if(!when) + when = m_last_sync; + + if(when > m_flux_write_start) { + bool last_on_edge = m_flux_write_count && m_flux_write[m_flux_write_count-1] == when; if(last_on_edge) m_flux_write_count--; + attotime start = cycles_to_time(m_flux_write_start); - attotime end = cycles_to_time(m_last_sync); + attotime end = cycles_to_time(when); std::vector fluxes(m_flux_write_count); for(u32 i=0; i != m_flux_write_count; i++) fluxes[i] = cycles_to_time(m_flux_write[i]); - m_floppy->write_flux(start, end, m_flux_write_count, m_flux_write_count ? &fluxes[0] : nullptr); - m_flux_write_start = m_last_sync; + + if(m_floppy) + m_floppy->write_flux(start, end, m_flux_write_count, m_flux_write_count ? &fluxes[0] : nullptr); + m_flux_write_count = 0; if(last_on_edge) - m_flux_write[m_flux_write_count++] = m_last_sync; + m_flux_write[m_flux_write_count++] = when; + m_flux_write_start = when; + } else m_flux_write_count = 0; - } u8 iwm_device::control(int offset, u8 data) diff --git a/src/devices/machine/swim1.cpp b/src/devices/machine/swim1.cpp index a05b632ccaf..c145cc4bdf7 100644 --- a/src/devices/machine/swim1.cpp +++ b/src/devices/machine/swim1.cpp @@ -376,10 +376,13 @@ void swim1_device::device_timer(emu_timer &, device_timer_id, int, void *) void swim1_device::flush_write(u64 when) { + if(!m_flux_write_start) + return; + if(!when) when = m_last_sync; - if(m_floppy && m_flux_write_start && when > m_flux_write_start) { + if(when > m_flux_write_start) { bool last_on_edge = m_flux_write_count && m_flux_write[m_flux_write_count-1] == when; if(last_on_edge) m_flux_write_count--; @@ -389,11 +392,15 @@ void swim1_device::flush_write(u64 when) std::vector fluxes(m_flux_write_count); for(u32 i=0; i != m_flux_write_count; i++) fluxes[i] = cycles_to_time(m_flux_write[i]); - m_floppy->write_flux(start, end, m_flux_write_count, m_flux_write_count ? &fluxes[0] : nullptr); - m_flux_write_start = m_last_sync; + + if(m_floppy) + m_floppy->write_flux(start, end, m_flux_write_count, m_flux_write_count ? &fluxes[0] : nullptr); + m_flux_write_count = 0; if(last_on_edge) m_flux_write[m_flux_write_count++] = when; + m_flux_write_start = when; + } else m_flux_write_count = 0; } diff --git a/src/devices/machine/swim2.cpp b/src/devices/machine/swim2.cpp index d5fd0a01c1f..788c6dd7aca 100644 --- a/src/devices/machine/swim2.cpp +++ b/src/devices/machine/swim2.cpp @@ -97,17 +97,22 @@ void swim2_device::flush_write(u64 when) when = m_last_sync; if(m_floppy && when > m_flux_write_start) { - if(m_flux_write_count && m_flux_write[m_flux_write_count-1] == when) + bool last_on_edge = m_flux_write_count && m_flux_write[m_flux_write_count-1] == when; + if(last_on_edge) m_flux_write_count--; + attotime start = cycles_to_time(m_flux_write_start); attotime end = cycles_to_time(when); std::vector fluxes(m_flux_write_count); for(u32 i=0; i != m_flux_write_count; i++) fluxes[i] = cycles_to_time(m_flux_write[i]); m_floppy->write_flux(start, end, m_flux_write_count, m_flux_write_count ? &fluxes[0] : nullptr); - } - m_flux_write_count = 0; - m_flux_write_start = when; + + m_flux_write_count = 0; + if(last_on_edge) + m_flux_write[m_flux_write_count++] = when; + } else + m_flux_write_count = 0; } void swim2_device::show_mode() const