From afd80b1a986b09d4503842b61db4fa5adc294f76 Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 10 Mar 2019 16:56:06 -0400 Subject: i8251, upd765: Allow read side effects to be disabled (nw) --- src/devices/machine/i8251.cpp | 8 +++++--- src/devices/machine/upd765.cpp | 28 +++++++++++++++++----------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/devices/machine/i8251.cpp b/src/devices/machine/i8251.cpp index 773262b617e..1c3189d8f8f 100644 --- a/src/devices/machine/i8251.cpp +++ b/src/devices/machine/i8251.cpp @@ -674,9 +674,11 @@ uint8_t i8251_device::data_r() { LOG("read data: %02x, STATUS=%02x\n",m_rx_data,m_status); /* reading clears */ - m_status &= ~I8251_STATUS_RX_READY; - - update_rx_ready(); + if (!machine().side_effects_disabled()) + { + m_status &= ~I8251_STATUS_RX_READY; + update_rx_ready(); + } return m_rx_data; } diff --git a/src/devices/machine/upd765.cpp b/src/devices/machine/upd765.cpp index e077c43bde6..d6dbe6cedea 100644 --- a/src/devices/machine/upd765.cpp +++ b/src/devices/machine/upd765.cpp @@ -444,7 +444,7 @@ uint8_t upd765_family_device::msr_r() } msr |= get_drive_busy(); - if(data_irq) { + if(data_irq && !machine().side_effects_disabled()) { data_irq = false; check_irq(); } @@ -471,6 +471,8 @@ uint8_t upd765_family_device::fifo_r() uint8_t r = 0xff; switch(main_phase) { case PHASE_EXEC: + if(machine().side_effects_disabled()) + return fifo[0]; if(internal_drq) return fifo_pop(false); LOGFIFO("fifo_r in phase %d\n", main_phase); @@ -478,16 +480,18 @@ uint8_t upd765_family_device::fifo_r() case PHASE_RESULT: r = result[0]; - result_pos--; - memmove(result, result+1, result_pos); - if(!result_pos) - main_phase = PHASE_CMD; - else if(result_pos == 1) { - // clear drive busy bit after the first sense interrupt status result byte is read - for(floppy_info &fi : flopi) - if((fi.main_state == RECALIBRATE || fi.main_state == SEEK) && fi.sub_state == IDLE && fi.st0_filled == false) - fi.main_state = IDLE; - clr_drive_busy(); + if(!machine().side_effects_disabled()) { + result_pos--; + memmove(result, result+1, result_pos); + if(!result_pos) + main_phase = PHASE_CMD; + else if(result_pos == 1) { + // clear drive busy bit after the first sense interrupt status result byte is read + for(floppy_info &fi : flopi) + if((fi.main_state == RECALIBRATE || fi.main_state == SEEK) && fi.sub_state == IDLE && fi.st0_filled == false) + fi.main_state = IDLE; + clr_drive_busy(); + } } break; default: @@ -645,6 +649,8 @@ void upd765_family_device::fifo_expect(int size, bool write) uint8_t upd765_family_device::dma_r() { + if(machine().side_effects_disabled()) + return fifo[0]; return fifo_pop(false); } -- cgit v1.2.3