diff options
author | 2019-06-01 16:08:40 -0400 | |
---|---|---|
committer | 2019-06-01 16:08:40 -0400 | |
commit | af61dd9e97cc236b686cb01e896424c1947c1ebc (patch) | |
tree | 56af0ff465bbdf0d882929bef25e12f24fd05703 /src | |
parent | 9c41b55ac3024d4626b4b61fdc0c020b41aa3c35 (diff) |
wd_fdc: Emulate writes to master reset line; allow read side effects to be disabled (nw)
Diffstat (limited to 'src')
-rw-r--r-- | src/devices/machine/wd_fdc.cpp | 94 | ||||
-rw-r--r-- | src/devices/machine/wd_fdc.h | 5 |
2 files changed, 64 insertions, 35 deletions
diff --git a/src/devices/machine/wd_fdc.cpp b/src/devices/machine/wd_fdc.cpp index 9f100fe5b9d..77124372063 100644 --- a/src/devices/machine/wd_fdc.cpp +++ b/src/devices/machine/wd_fdc.cpp @@ -122,6 +122,7 @@ void wd_fdc_device_base::device_start() enmf = false; floppy = nullptr; status = 0x00; + mr = true; save_item(NAME(status)); save_item(NAME(command)); @@ -136,6 +137,9 @@ void wd_fdc_device_base::device_start() save_item(NAME(counter)); save_item(NAME(status_type_1)); save_item(NAME(last_dir)); + if (!disable_mfm) + save_item(NAME(dden)); + save_item(NAME(mr)); } void wd_fdc_device_base::device_reset() @@ -145,40 +149,52 @@ void wd_fdc_device_base::device_reset() void wd_fdc_device_base::soft_reset() { - command = 0x00; - main_state = IDLE; - sub_state = IDLE; - cur_live.state = IDLE; - track = 0x00; - sector = 0x01; - status = 0x00; - data = 0x00; - cmd_buffer = track_buffer = sector_buffer = -1; - counter = 0; - status_type_1 = true; - last_dir = 1; + if(mr) { + mr_w(0); + mr_w(1); + } +} - // gnd == enmf enabled, otherwise disabled (default) - if (!enmf_cb.isnull() && has_enmf) - enmf = enmf_cb() ? false : true; +WRITE_LINE_MEMBER(wd_fdc_device_base::mr_w) +{ + if(mr && !state) { + command = 0x00; + main_state = IDLE; + sub_state = IDLE; + cur_live.state = IDLE; + track = 0x00; + sector = 0x01; + status = 0x00; + data = 0x00; + cmd_buffer = track_buffer = sector_buffer = -1; + counter = 0; + status_type_1 = true; + last_dir = 1; + mr = false; - intrq = false; - if (!intrq_cb.isnull()) - { - intrq_cb(intrq); - } - drq = false; - if (!drq_cb.isnull()) - { - drq_cb(drq); - } - hld = false; - intrq_cond = 0; - live_abort(); + // gnd == enmf enabled, otherwise disabled (default) + if (!enmf_cb.isnull() && has_enmf) + enmf = enmf_cb() ? false : true; - // trigger a restore after everything else is reset too, in particular the floppy device itself - sub_state = INITIAL_RESTORE; - t_gen->adjust(attotime::zero); + intrq = false; + if (!intrq_cb.isnull()) + { + intrq_cb(intrq); + } + drq = false; + if (!drq_cb.isnull()) + { + drq_cb(drq); + } + hld = false; + intrq_cond = 0; + live_abort(); + } else if(state && !mr) { + // trigger a restore after everything else is reset too, in particular the floppy device itself + sub_state = INITIAL_RESTORE; + t_gen->adjust(attotime::zero); + mr = true; + } } void wd_fdc_device_base::set_floppy(floppy_image_device *_floppy) @@ -1090,6 +1106,11 @@ void wd_fdc_device_base::do_cmd_w() void wd_fdc_device_base::cmd_w(uint8_t val) { if (inverted_bus) val ^= 0xff; + if (!mr) { + logerror("Not initiating command %02x during master reset\n", val); + return; + } + LOGCOMP("Initiating command %02x\n", val); if(intrq && !(intrq_cond & I_IMM)) { @@ -1119,7 +1140,7 @@ void wd_fdc_device_base::cmd_w(uint8_t val) uint8_t wd_fdc_device_base::status_r() { - if(intrq && !(intrq_cond & I_IMM)) { + if(intrq && !(intrq_cond & I_IMM) && !machine().side_effects_disabled()) { intrq = false; if(!intrq_cb.isnull()) intrq_cb(intrq); @@ -1171,7 +1192,7 @@ void wd_fdc_device_base::track_w(uint8_t val) if (inverted_bus) val ^= 0xff; // No more than one write in flight - if(track_buffer != -1) + if(track_buffer != -1 || !mr) return; track_buffer = val; @@ -1194,6 +1215,8 @@ void wd_fdc_device_base::do_sector_w() void wd_fdc_device_base::sector_w(uint8_t val) { + if (!mr) return; + if (inverted_bus) val ^= 0xff; // No more than one write in flight @@ -1220,6 +1243,8 @@ uint8_t wd_fdc_device_base::sector_r() void wd_fdc_device_base::data_w(uint8_t val) { + if (!mr) return; + if (inverted_bus) val ^= 0xff; data = val; @@ -1228,7 +1253,8 @@ void wd_fdc_device_base::data_w(uint8_t val) uint8_t wd_fdc_device_base::data_r() { - drop_drq(); + if (!machine().side_effects_disabled()) + drop_drq(); uint8_t val = data; if (inverted_bus) val ^= 0xff; diff --git a/src/devices/machine/wd_fdc.h b/src/devices/machine/wd_fdc.h index a14c868f75f..e09b092e7cc 100644 --- a/src/devices/machine/wd_fdc.h +++ b/src/devices/machine/wd_fdc.h @@ -86,6 +86,8 @@ public: DECLARE_READ_LINE_MEMBER(enp_r); + DECLARE_WRITE_LINE_MEMBER(mr_w); + void index_callback(floppy_image_device *floppy, int state); protected: @@ -277,7 +279,8 @@ private: emu_timer *t_gen, *t_cmd, *t_track, *t_sector; - bool dden, status_type_1, intrq, drq, hld, hlt, enp, force_ready, disable_motor_control; + bool dden, status_type_1, intrq, drq, hld, hlt, enp, mr; + bool force_ready, disable_motor_control; int main_state, sub_state; uint8_t command, track, sector, data, status, intrq_cond; int last_dir; |