From 2602b5251763a2abf93e0c2774ae85837fcdb414 Mon Sep 17 00:00:00 2001 From: fulivi Date: Tue, 31 Jan 2017 15:19:19 +0100 Subject: [PATCH 1/2] hp9845: fixed a bug in PHI driver (no data freeze when a sec. address is received) --- src/devices/machine/phi.cpp | 18 +++++++++++------- src/devices/machine/phi.h | 1 + 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/devices/machine/phi.cpp b/src/devices/machine/phi.cpp index 0fd0c4a90b9..18166c068cc 100644 --- a/src/devices/machine/phi.cpp +++ b/src/devices/machine/phi.cpp @@ -1274,7 +1274,7 @@ bool phi_device::if_cmd_received(uint8_t byte) if (m_t_state == PHI_T_TADS) { BIT_SET(word, REG_IFIFO_TALK_BIT); } - m_fifo_in.enqueue(word); + rx_n_data_freeze(word); } } } @@ -1320,13 +1320,8 @@ bool phi_device::byte_received(uint8_t byte , bool eoi) LOG_0(("..stalled\n")); return false; } else { - m_fifo_in.enqueue(word); LOG_0(("..OK\n")); - if (m_t_state != PHI_T_TACS && m_t_state != PHI_T_ID3 && - m_t_state != PHI_T_ID5 && m_t_state != PHI_T_SPAS) { - // If PHI didn't send this byte to itself, set data freeze - BIT_SET(m_reg_status, REG_STATUS_DATA_FREEZE_BIT); - } + rx_n_data_freeze(word); } } if (end_of_transfer) { @@ -1340,6 +1335,15 @@ bool phi_device::byte_received(uint8_t byte , bool eoi) return true; } +void phi_device::rx_n_data_freeze(uint16_t word) +{ + m_fifo_in.enqueue(word); + if (m_sh_state != PHI_SH_STRS) { + // If PHI didn't send this byte to itself, set data freeze + BIT_SET(m_reg_status, REG_STATUS_DATA_FREEZE_BIT); + } +} + bool phi_device::ton_msg(void) const { return BIT(m_reg_address , REG_ADDR_TA_BIT); diff --git a/src/devices/machine/phi.h b/src/devices/machine/phi.h index 23a9d224108..bd1a0906143 100644 --- a/src/devices/machine/phi.h +++ b/src/devices/machine/phi.h @@ -276,6 +276,7 @@ private: void clear_nba(nba_origin_t origin); bool if_cmd_received(uint8_t byte); bool byte_received(uint8_t byte , bool eoi); + void rx_n_data_freeze(uint16_t word); bool ton_msg(void) const; bool lon_msg(void) const; bool odd_parity(uint8_t byte) const; From 78f23815493641cd82da8e15da6404034830267b Mon Sep 17 00:00:00 2001 From: fulivi Date: Tue, 31 Jan 2017 15:20:31 +0100 Subject: [PATCH 2/2] hp9845: fixed a weird case of missed synchronization in 9895 drive --- src/devices/bus/ieee488/hp9895.cpp | 21 ++------------------- src/devices/bus/ieee488/hp9895.h | 4 ---- src/devices/machine/fdc_pll.cpp | 2 +- 3 files changed, 3 insertions(+), 24 deletions(-) diff --git a/src/devices/bus/ieee488/hp9895.cpp b/src/devices/bus/ieee488/hp9895.cpp index 30df3426ac1..6abe8bc773d 100644 --- a/src/devices/bus/ieee488/hp9895.cpp +++ b/src/devices/bus/ieee488/hp9895.cpp @@ -48,8 +48,8 @@ Hardware Maintenance Manual TODO/Issues: - * floppy_image_device sometimes reports the wrong state for ready & - wpt signals + * floppy_image_device sometimes reports the wrong state for wpt + signal * IBM mode hasn't been tested yet *********************************************************************/ @@ -232,10 +232,6 @@ void hp9895_device::device_reset() m_timeout_timer->reset(); m_byte_timer->reset(); m_half_bit_timer->reset(); -#if 0 - // DEBUG DEBUG DEBUG DEBUG - for (auto& r : m_ready) r = 2; -#endif } void hp9895_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) @@ -705,19 +701,6 @@ READ8_MEMBER(hp9895_device::switches2_r) void hp9895_device::floppy_ready_cb(floppy_image_device *floppy , int state) { -#if 0 - // DEBUG DEBUG DEBUG DEBUG - for (unsigned i = 0; i < 2; i++) { - if (floppy == m_drives[ i ]->get_device()) { - if (m_ready[ i ] != state) { - LOG(("Ready %u=%d\n" , i , state)); - m_ready[ i ] = state; - } - break; - } - } -#endif - if (state) { // Set Disk Changed flag when a drive is not ready for (unsigned i = 0; i < 2; i++) { diff --git a/src/devices/bus/ieee488/hp9895.h b/src/devices/bus/ieee488/hp9895.h index 29d776e6d13..5837792de82 100644 --- a/src/devices/bus/ieee488/hp9895.h +++ b/src/devices/bus/ieee488/hp9895.h @@ -109,10 +109,6 @@ private: uint8_t m_sync_cnt; // U28 & U73 bool m_hiden; bool m_mgnena; -#if 0 - // DEBUG DEBUG DEBUG DEBUG - int m_ready[ 2 ]; -#endif // Timers emu_timer *m_timeout_timer; diff --git a/src/devices/machine/fdc_pll.cpp b/src/devices/machine/fdc_pll.cpp index bec0102f95c..ef93eda920d 100644 --- a/src/devices/machine/fdc_pll.cpp +++ b/src/devices/machine/fdc_pll.cpp @@ -80,7 +80,7 @@ int fdc_pll_t::feed_read_data(attotime &tm, const attotime& edge, const attotime ctime = next; tm = next; - if(edge.is_never() || edge >= next) { + if(edge.is_never() || edge > next) { // No transition in the window means 0 and pll in free run mode phase_adjust = attotime::zero; return 0;