Merge pull request #2035 from fulivi/hp9845_dev9

Bug fix for HP9895
This commit is contained in:
R. Belmont 2017-02-01 12:17:46 -05:00 committed by GitHub
commit 1af492f420
5 changed files with 15 additions and 31 deletions

View File

@ -48,8 +48,8 @@
Hardware Maintenance Manual Hardware Maintenance Manual
TODO/Issues: TODO/Issues:
* floppy_image_device sometimes reports the wrong state for ready & * floppy_image_device sometimes reports the wrong state for wpt
wpt signals signal
* IBM mode hasn't been tested yet * IBM mode hasn't been tested yet
*********************************************************************/ *********************************************************************/
@ -232,10 +232,6 @@ void hp9895_device::device_reset()
m_timeout_timer->reset(); m_timeout_timer->reset();
m_byte_timer->reset(); m_byte_timer->reset();
m_half_bit_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) 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) 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) { if (state) {
// Set Disk Changed flag when a drive is not ready // Set Disk Changed flag when a drive is not ready
for (unsigned i = 0; i < 2; i++) { for (unsigned i = 0; i < 2; i++) {

View File

@ -109,10 +109,6 @@ private:
uint8_t m_sync_cnt; // U28 & U73 uint8_t m_sync_cnt; // U28 & U73
bool m_hiden; bool m_hiden;
bool m_mgnena; bool m_mgnena;
#if 0
// DEBUG DEBUG DEBUG DEBUG
int m_ready[ 2 ];
#endif
// Timers // Timers
emu_timer *m_timeout_timer; emu_timer *m_timeout_timer;

View File

@ -80,7 +80,7 @@ int fdc_pll_t::feed_read_data(attotime &tm, const attotime& edge, const attotime
ctime = next; ctime = next;
tm = 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 // No transition in the window means 0 and pll in free run mode
phase_adjust = attotime::zero; phase_adjust = attotime::zero;
return 0; return 0;

View File

@ -1274,7 +1274,7 @@ bool phi_device::if_cmd_received(uint8_t byte)
if (m_t_state == PHI_T_TADS) { if (m_t_state == PHI_T_TADS) {
BIT_SET(word, REG_IFIFO_TALK_BIT); 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")); LOG_0(("..stalled\n"));
return false; return false;
} else { } else {
m_fifo_in.enqueue(word);
LOG_0(("..OK\n")); LOG_0(("..OK\n"));
if (m_t_state != PHI_T_TACS && m_t_state != PHI_T_ID3 && rx_n_data_freeze(word);
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);
}
} }
} }
if (end_of_transfer) { if (end_of_transfer) {
@ -1340,6 +1335,15 @@ bool phi_device::byte_received(uint8_t byte , bool eoi)
return true; 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 bool phi_device::ton_msg(void) const
{ {
return BIT(m_reg_address , REG_ADDR_TA_BIT); return BIT(m_reg_address , REG_ADDR_TA_BIT);

View File

@ -276,6 +276,7 @@ private:
void clear_nba(nba_origin_t origin); void clear_nba(nba_origin_t origin);
bool if_cmd_received(uint8_t byte); bool if_cmd_received(uint8_t byte);
bool byte_received(uint8_t byte , bool eoi); bool byte_received(uint8_t byte , bool eoi);
void rx_n_data_freeze(uint16_t word);
bool ton_msg(void) const; bool ton_msg(void) const;
bool lon_msg(void) const; bool lon_msg(void) const;
bool odd_parity(uint8_t byte) const; bool odd_parity(uint8_t byte) const;