diff options
Diffstat (limited to 'src/devices/machine/wd_fdc.cpp')
-rw-r--r-- | src/devices/machine/wd_fdc.cpp | 320 |
1 files changed, 163 insertions, 157 deletions
diff --git a/src/devices/machine/wd_fdc.cpp b/src/devices/machine/wd_fdc.cpp index f64c1117ed4..f629fdc08bd 100644 --- a/src/devices/machine/wd_fdc.cpp +++ b/src/devices/machine/wd_fdc.cpp @@ -5,29 +5,35 @@ #include "debugger.h" -const device_type FD1771 = device_creator<fd1771_t>; -const device_type FD1781 = device_creator<fd1781_t>; -const device_type FD1791 = device_creator<fd1791_t>; -const device_type FD1792 = device_creator<fd1792_t>; -const device_type FD1793 = device_creator<fd1793_t>; -const device_type KR1818VG93 = device_creator<kr1818vg93_t>; -const device_type FD1794 = device_creator<fd1794_t>; -const device_type FD1795 = device_creator<fd1795_t>; -const device_type FD1797 = device_creator<fd1797_t>; -const device_type MB8866 = device_creator<mb8866_t>; -const device_type MB8876 = device_creator<mb8876_t>; -const device_type MB8877 = device_creator<mb8877_t>; -const device_type FD1761 = device_creator<fd1761_t>; -const device_type FD1763 = device_creator<fd1763_t>; -const device_type FD1765 = device_creator<fd1765_t>; -const device_type FD1767 = device_creator<fd1767_t>; -const device_type WD2791 = device_creator<wd2791_t>; -const device_type WD2793 = device_creator<wd2793_t>; -const device_type WD2795 = device_creator<wd2795_t>; -const device_type WD2797 = device_creator<wd2797_t>; -const device_type WD1770 = device_creator<wd1770_t>; -const device_type WD1772 = device_creator<wd1772_t>; -const device_type WD1773 = device_creator<wd1773_t>; +DEFINE_DEVICE_TYPE(FD1771, fd1771_device, "fd1771", "FD1771 FDC") + +DEFINE_DEVICE_TYPE(FD1781, fd1781_device, "fd1781", "FD1781 FDC") + +DEFINE_DEVICE_TYPE(FD1791, fd1791_device, "fd1791", "FD1791 FDC") +DEFINE_DEVICE_TYPE(FD1792, fd1792_device, "fd1792", "FD1792 FDC") +DEFINE_DEVICE_TYPE(FD1793, fd1793_device, "fd1793", "FD1793 FDC") +DEFINE_DEVICE_TYPE(KR1818VG93, kr1818vg93_device, "kr1818vg93", "KR1818VG93 FDC") +DEFINE_DEVICE_TYPE(FD1794, fd1794_device, "fd1794", "FD1794 FDC") +DEFINE_DEVICE_TYPE(FD1795, fd1795_device, "fd1795", "FD1795 FDC") +DEFINE_DEVICE_TYPE(FD1797, fd1797_device, "fd1797", "FD1797 FDC") + +DEFINE_DEVICE_TYPE(MB8866, mb8866_device, "mb8866", "Fujitsu MB8866 FDC") +DEFINE_DEVICE_TYPE(MB8876, mb8876_device, "mb8876", "Fujitsu MB8876 FDC") +DEFINE_DEVICE_TYPE(MB8877, mb8877_device, "mb8877", "Fujitsu MB8877 FDC") + +DEFINE_DEVICE_TYPE(FD1761, fd1761_device, "fd1761", "FD1761 FDC") +DEFINE_DEVICE_TYPE(FD1763, fd1763_device, "fd1763", "FD1763 FDC") +DEFINE_DEVICE_TYPE(FD1765, fd1765_device, "fd1765", "FD1765 FDC") +DEFINE_DEVICE_TYPE(FD1767, fd1767_device, "fd1767", "FD1767 FDC") + +DEFINE_DEVICE_TYPE(WD2791, wd2791_device, "wd2791", "Western Digital WD2791 FDC") +DEFINE_DEVICE_TYPE(WD2793, wd2793_device, "wd2793", "Western Digital WD2793 FDC") +DEFINE_DEVICE_TYPE(WD2795, wd2795_device, "wd2795", "Western Digital WD2795 FDC") +DEFINE_DEVICE_TYPE(WD2797, wd2797_device, "wd2797", "Western Digital WD2797 FDC") + +DEFINE_DEVICE_TYPE(WD1770, wd1770_device, "wd1770", "Western Digital WD1770 FDC") +DEFINE_DEVICE_TYPE(WD1772, wd1772_device, "wd1772", "Western Digital WD1772 FDC") +DEFINE_DEVICE_TYPE(WD1773, wd1773_device, "wd1773", "Western Digital WD1773 FDC") /* Debugging flags. Set to 0 or 1. @@ -66,8 +72,8 @@ const device_type WD1773 = device_creator<wd1773_t>; // Show state machine #define TRACE_STATE 0 -wd_fdc_t::wd_fdc_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - device_t(mconfig, type, name, tag, owner, clock, shortname, source), +wd_fdc_device_base::wd_fdc_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, type, tag, owner, clock), intrq_cb(*this), drq_cb(*this), hld_cb(*this), @@ -78,17 +84,17 @@ wd_fdc_t::wd_fdc_t(const machine_config &mconfig, device_type type, const char * disable_motor_control = false; } -void wd_fdc_t::set_force_ready(bool _force_ready) +void wd_fdc_device_base::set_force_ready(bool _force_ready) { force_ready = _force_ready; } -void wd_fdc_t::set_disable_motor_control(bool _disable_motor_control) +void wd_fdc_device_base::set_disable_motor_control(bool _disable_motor_control) { disable_motor_control = _disable_motor_control; } -void wd_fdc_t::device_start() +void wd_fdc_device_base::device_start() { intrq_cb.resolve(); drq_cb.resolve(); @@ -123,12 +129,12 @@ void wd_fdc_t::device_start() save_item(NAME(last_dir)); } -void wd_fdc_t::device_reset() +void wd_fdc_device_base::device_reset() { soft_reset(); } -void wd_fdc_t::soft_reset() +void wd_fdc_device_base::soft_reset() { command = 0x00; main_state = IDLE; @@ -166,7 +172,7 @@ void wd_fdc_t::soft_reset() t_gen->adjust(attotime::zero); } -void wd_fdc_t::set_floppy(floppy_image_device *_floppy) +void wd_fdc_device_base::set_floppy(floppy_image_device *_floppy) { if(floppy == _floppy) return; @@ -186,15 +192,15 @@ void wd_fdc_t::set_floppy(floppy_image_device *_floppy) if(floppy) { if(motor_control && !disable_motor_control) floppy->mon_w(status & S_MON ? 0 : 1); - floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&wd_fdc_t::index_callback, this)); - floppy->setup_ready_cb(floppy_image_device::ready_cb(&wd_fdc_t::ready_callback, this)); + floppy->setup_index_pulse_cb(floppy_image_device::index_pulse_cb(&wd_fdc_device_base::index_callback, this)); + floppy->setup_ready_cb(floppy_image_device::ready_cb(&wd_fdc_device_base::ready_callback, this)); } if(prev_ready != next_ready) ready_callback(floppy, next_ready); } -void wd_fdc_t::dden_w(bool _dden) +void wd_fdc_device_base::dden_w(bool _dden) { if(disable_mfm) { logerror("Error, this chip does not have a dden line\n"); @@ -207,7 +213,7 @@ void wd_fdc_t::dden_w(bool _dden) } } -std::string wd_fdc_t::tts(const attotime &t) +std::string wd_fdc_device_base::tts(const attotime &t) { char buf[256]; int nsec = t.attoseconds() / ATTOSECONDS_PER_NANOSECOND; @@ -215,12 +221,12 @@ std::string wd_fdc_t::tts(const attotime &t) return buf; } -std::string wd_fdc_t::ttsn() +std::string wd_fdc_device_base::ttsn() { return tts(machine().time()); } -void wd_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +void wd_fdc_device_base::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { if (TRACE_EVENT) logerror("Event fired for timer %s\n", (id==TM_GEN)? "TM_GEN" : (id==TM_CMD)? "TM_CMD" : (id==TM_TRACK)? "TM_TRACK" : "TM_SECTOR"); live_sync(); @@ -235,7 +241,7 @@ void wd_fdc_t::device_timer(emu_timer &timer, device_timer_id id, int param, voi general_continue(); } -void wd_fdc_t::command_end() +void wd_fdc_device_base::command_end() { main_state = sub_state = IDLE; motor_timeout = 0; @@ -248,7 +254,7 @@ void wd_fdc_t::command_end() } } -void wd_fdc_t::seek_start(int state) +void wd_fdc_device_base::seek_start(int state) { if (TRACE_COMMAND) logerror("cmd: seek %d %x (track=%d)\n", state, data, track); main_state = state; @@ -265,7 +271,7 @@ void wd_fdc_t::seek_start(int state) seek_continue(); } -void wd_fdc_t::seek_continue() +void wd_fdc_device_base::seek_continue() { for(;;) { switch(sub_state) { @@ -411,7 +417,7 @@ void wd_fdc_t::seek_continue() } } -bool wd_fdc_t::sector_matches() const +bool wd_fdc_device_base::sector_matches() const { if(TRACE_MATCH) logerror("matching read T=%02x H=%02x S=%02x L=%02x - searched T=%02x S=%02x\n", @@ -428,12 +434,12 @@ bool wd_fdc_t::sector_matches() const return !(cur_live.idbuf[1] & 1); } -bool wd_fdc_t::is_ready() +bool wd_fdc_device_base::is_ready() { return !ready_hooked || force_ready || (floppy && !floppy->ready_r()); } -void wd_fdc_t::read_sector_start() +void wd_fdc_device_base::read_sector_start() { if (TRACE_COMMAND) logerror("cmd: read sector%s (c=%02x) t=%d, s=%d\n", command & 0x10 ? " multiple" : "", command, track, sector); if(!is_ready()) { @@ -451,7 +457,7 @@ void wd_fdc_t::read_sector_start() read_sector_continue(); } -void wd_fdc_t::read_sector_continue() +void wd_fdc_device_base::read_sector_continue() { for(;;) { switch(sub_state) { @@ -533,7 +539,7 @@ void wd_fdc_t::read_sector_continue() } } -void wd_fdc_t::read_track_start() +void wd_fdc_device_base::read_track_start() { if (TRACE_COMMAND) logerror("cmd: read track (c=%02x) t=%d\n", command, track); @@ -552,7 +558,7 @@ void wd_fdc_t::read_track_start() read_track_continue(); } -void wd_fdc_t::read_track_continue() +void wd_fdc_device_base::read_track_continue() { for(;;) { switch(sub_state) { @@ -612,7 +618,7 @@ void wd_fdc_t::read_track_continue() } } -void wd_fdc_t::read_id_start() +void wd_fdc_device_base::read_id_start() { if (TRACE_COMMAND) logerror("cmd: read id (c=%02x)\n", command); if(!is_ready()) { @@ -630,7 +636,7 @@ void wd_fdc_t::read_id_start() read_id_continue(); } -void wd_fdc_t::read_id_continue() +void wd_fdc_device_base::read_id_continue() { for(;;) { switch(sub_state) { @@ -687,7 +693,7 @@ void wd_fdc_t::read_id_continue() } } -void wd_fdc_t::write_track_start() +void wd_fdc_device_base::write_track_start() { if (TRACE_COMMAND) logerror("cmd: write track (c=%02x) t=%d\n", command, track); @@ -711,7 +717,7 @@ void wd_fdc_t::write_track_start() write_track_continue(); } -void wd_fdc_t::write_track_continue() +void wd_fdc_device_base::write_track_continue() { for(;;) { switch(sub_state) { @@ -798,7 +804,7 @@ void wd_fdc_t::write_track_continue() } -void wd_fdc_t::write_sector_start() +void wd_fdc_device_base::write_sector_start() { if (TRACE_COMMAND) logerror("cmd: write sector%s (c=%02x) t=%d, s=%d\n", command & 0x10 ? " multiple" : "", command, track, sector); @@ -817,7 +823,7 @@ void wd_fdc_t::write_sector_start() write_sector_continue(); } -void wd_fdc_t::write_sector_continue() +void wd_fdc_device_base::write_sector_continue() { for(;;) { switch(sub_state) { @@ -896,7 +902,7 @@ void wd_fdc_t::write_sector_continue() } } -void wd_fdc_t::interrupt_start() +void wd_fdc_device_base::interrupt_start() { if (TRACE_COMMAND) logerror("cmd: forced interrupt (c=%02x)\n", command); @@ -938,7 +944,7 @@ void wd_fdc_t::interrupt_start() } } -void wd_fdc_t::general_continue() +void wd_fdc_device_base::general_continue() { if(cur_live.state != IDLE) { live_run(); @@ -973,7 +979,7 @@ void wd_fdc_t::general_continue() } } -void wd_fdc_t::do_generic() +void wd_fdc_device_base::do_generic() { switch(sub_state) { case IDLE: @@ -1009,7 +1015,7 @@ void wd_fdc_t::do_generic() } } -void wd_fdc_t::do_cmd_w() +void wd_fdc_device_base::do_cmd_w() { // Only available command when busy is interrupt if(main_state != IDLE && (cmd_buffer & 0xf0) != 0xd0) { @@ -1065,7 +1071,7 @@ void wd_fdc_t::do_cmd_w() } } -void wd_fdc_t::cmd_w(uint8_t val) +void wd_fdc_device_base::cmd_w(uint8_t val) { if (TRACE_COMP) logerror("Initiating command %02x\n", val); if (inverted_bus) val ^= 0xff; @@ -1095,7 +1101,7 @@ void wd_fdc_t::cmd_w(uint8_t val) } } -uint8_t wd_fdc_t::status_r() +uint8_t wd_fdc_device_base::status_r() { if(intrq && !(intrq_cond & I_IMM)) { intrq = false; @@ -1138,13 +1144,13 @@ uint8_t wd_fdc_t::status_r() return val; } -void wd_fdc_t::do_track_w() +void wd_fdc_device_base::do_track_w() { track = track_buffer; track_buffer = -1; } -void wd_fdc_t::track_w(uint8_t val) +void wd_fdc_device_base::track_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1156,7 +1162,7 @@ void wd_fdc_t::track_w(uint8_t val) delay_cycles(t_track, dden ? delay_register_commit*2 : delay_register_commit); } -uint8_t wd_fdc_t::track_r() +uint8_t wd_fdc_device_base::track_r() { uint8_t val = track; if (inverted_bus) val ^= 0xff; @@ -1164,13 +1170,13 @@ uint8_t wd_fdc_t::track_r() return val; } -void wd_fdc_t::do_sector_w() +void wd_fdc_device_base::do_sector_w() { sector = sector_buffer; sector_buffer = -1; } -void wd_fdc_t::sector_w(uint8_t val) +void wd_fdc_device_base::sector_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1188,7 +1194,7 @@ void wd_fdc_t::sector_w(uint8_t val) delay_cycles(t_sector, dden ? delay_register_commit*2 : delay_register_commit); } -uint8_t wd_fdc_t::sector_r() +uint8_t wd_fdc_device_base::sector_r() { uint8_t val = sector; if (inverted_bus) val ^= 0xff; @@ -1196,7 +1202,7 @@ uint8_t wd_fdc_t::sector_r() return val; } -void wd_fdc_t::data_w(uint8_t val) +void wd_fdc_device_base::data_w(uint8_t val) { if (inverted_bus) val ^= 0xff; @@ -1204,7 +1210,7 @@ void wd_fdc_t::data_w(uint8_t val) drop_drq(); } -uint8_t wd_fdc_t::data_r() +uint8_t wd_fdc_device_base::data_r() { drop_drq(); @@ -1214,7 +1220,7 @@ uint8_t wd_fdc_t::data_r() return val; } -void wd_fdc_t::gen_w(int reg, uint8_t val) +void wd_fdc_device_base::gen_w(int reg, uint8_t val) { switch(reg) { case 0: cmd_w(val); break; @@ -1224,7 +1230,7 @@ void wd_fdc_t::gen_w(int reg, uint8_t val) } } -uint8_t wd_fdc_t::gen_r(int reg) +uint8_t wd_fdc_device_base::gen_r(int reg) { switch(reg) { case 0: return status_r(); @@ -1235,12 +1241,12 @@ uint8_t wd_fdc_t::gen_r(int reg) return 0xff; } -void wd_fdc_t::delay_cycles(emu_timer *tm, int cycles) +void wd_fdc_device_base::delay_cycles(emu_timer *tm, int cycles) { tm->adjust(clocks_to_attotime(cycles*clock_ratio)); } -void wd_fdc_t::spinup() +void wd_fdc_device_base::spinup() { if(command & 0x08) sub_state = SPINUP_DONE; @@ -1254,7 +1260,7 @@ void wd_fdc_t::spinup() floppy->mon_w(0); } -void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state) +void wd_fdc_device_base::ready_callback(floppy_image_device *floppy, int state) { // why is this even possible? if (!floppy) @@ -1271,7 +1277,7 @@ void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state) } } -void wd_fdc_t::index_callback(floppy_image_device *floppy, int state) +void wd_fdc_device_base::index_callback(floppy_image_device *floppy, int state) { live_sync(); @@ -1362,32 +1368,32 @@ void wd_fdc_t::index_callback(floppy_image_device *floppy, int state) general_continue(); } -bool wd_fdc_t::intrq_r() +bool wd_fdc_device_base::intrq_r() { return intrq; } -bool wd_fdc_t::drq_r() +bool wd_fdc_device_base::drq_r() { return drq; } -bool wd_fdc_t::hld_r() +bool wd_fdc_device_base::hld_r() { return hld; } -void wd_fdc_t::hlt_w(bool state) +void wd_fdc_device_base::hlt_w(bool state) { hlt = state; } -bool wd_fdc_t::enp_r() +bool wd_fdc_device_base::enp_r() { return enp; } -void wd_fdc_t::live_start(int state) +void wd_fdc_device_base::live_start(int state) { cur_live.tm = machine().time(); cur_live.state = state; @@ -1411,26 +1417,26 @@ void wd_fdc_t::live_start(int state) live_run(); } -void wd_fdc_t::checkpoint() +void wd_fdc_device_base::checkpoint() { pll_commit(floppy, cur_live.tm); checkpoint_live = cur_live; pll_save_checkpoint(); } -void wd_fdc_t::rollback() +void wd_fdc_device_base::rollback() { cur_live = checkpoint_live; pll_retrieve_checkpoint(); } -void wd_fdc_t::live_delay(int state) +void wd_fdc_device_base::live_delay(int state) { cur_live.next_state = state; t_gen->adjust(cur_live.tm - machine().time()); } -void wd_fdc_t::live_sync() +void wd_fdc_device_base::live_sync() { if(!cur_live.tm.is_never()) { if(cur_live.tm > machine().time()) { @@ -1455,7 +1461,7 @@ void wd_fdc_t::live_sync() } } -void wd_fdc_t::live_abort() +void wd_fdc_device_base::live_abort() { if(!cur_live.tm.is_never() && cur_live.tm > machine().time()) { rollback(); @@ -1468,7 +1474,7 @@ void wd_fdc_t::live_abort() cur_live.next_state = -1; } -bool wd_fdc_t::read_one_bit(const attotime &limit) +bool wd_fdc_device_base::read_one_bit(const attotime &limit) { int bit = pll_get_next_bit(cur_live.tm, floppy, limit); if(bit < 0) @@ -1486,7 +1492,7 @@ bool wd_fdc_t::read_one_bit(const attotime &limit) return false; } -bool wd_fdc_t::write_one_bit(const attotime &limit) +bool wd_fdc_device_base::write_one_bit(const attotime &limit) { bool bit = cur_live.shift_reg & 0x8000; if(pll_write_next_bit(bit, cur_live.tm, floppy, limit)) @@ -1502,14 +1508,14 @@ bool wd_fdc_t::write_one_bit(const attotime &limit) return false; } -void wd_fdc_t::live_write_raw(uint16_t raw) +void wd_fdc_device_base::live_write_raw(uint16_t raw) { if (TRACE_WRITE) logerror("write raw %04x, CRC=%04x\n", raw, cur_live.crc); cur_live.shift_reg = raw; cur_live.data_bit_context = raw & 1; } -void wd_fdc_t::live_write_mfm(uint8_t mfm) +void wd_fdc_device_base::live_write_mfm(uint8_t mfm) { bool context = cur_live.data_bit_context; uint16_t raw = 0; @@ -1527,7 +1533,7 @@ void wd_fdc_t::live_write_mfm(uint8_t mfm) } -void wd_fdc_t::live_write_fm(uint8_t fm) +void wd_fdc_device_base::live_write_fm(uint8_t fm) { uint16_t raw = 0xaaaa; for(int i=0; i<8; i++) @@ -1539,7 +1545,7 @@ void wd_fdc_t::live_write_fm(uint8_t fm) if (TRACE_WRITE) logerror("live_write_fm byte=%02x, raw=%04x, CRC=%04x\n", fm, raw, cur_live.crc); } -void wd_fdc_t::live_run(attotime limit) +void wd_fdc_device_base::live_run(attotime limit) { if(cur_live.state == IDLE || cur_live.next_state != -1) return; @@ -2101,7 +2107,7 @@ void wd_fdc_t::live_run(attotime limit) } } -void wd_fdc_t::set_drq() +void wd_fdc_device_base::set_drq() { if(drq) { status |= S_LOST; @@ -2115,7 +2121,7 @@ void wd_fdc_t::set_drq() } } -void wd_fdc_t::drop_drq() +void wd_fdc_device_base::drop_drq() { if(drq) { drq = false; @@ -2130,23 +2136,23 @@ void wd_fdc_t::drop_drq() } } -int wd_fdc_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd_fdc_device_base::calc_sector_size(uint8_t size, uint8_t command) const { return 128 << (size & 3); } -int wd_fdc_t::settle_time() const +int wd_fdc_device_base::settle_time() const { return 60000; } -wd_fdc_analog_t::wd_fdc_analog_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - wd_fdc_t(mconfig, type, name, tag, owner, clock, shortname, source) +wd_fdc_analog_device_base::wd_fdc_analog_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + wd_fdc_device_base(mconfig, type, tag, owner, clock) { clock_ratio = 1; } -void wd_fdc_analog_t::pll_reset(bool fm, bool enmf, const attotime &when) +void wd_fdc_analog_device_base::pll_reset(bool fm, bool enmf, const attotime &when) { int clocks = 2; @@ -2157,50 +2163,50 @@ void wd_fdc_analog_t::pll_reset(bool fm, bool enmf, const attotime &when) cur_pll.set_clock(clocks_to_attotime(clocks)); } -void wd_fdc_analog_t::pll_start_writing(const attotime &tm) +void wd_fdc_analog_device_base::pll_start_writing(const attotime &tm) { cur_pll.start_writing(tm); } -void wd_fdc_analog_t::pll_commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_analog_device_base::pll_commit(floppy_image_device *floppy, const attotime &tm) { cur_pll.commit(floppy, tm); } -void wd_fdc_analog_t::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_analog_device_base::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) { cur_pll.stop_writing(floppy, tm); } -void wd_fdc_analog_t::pll_save_checkpoint() +void wd_fdc_analog_device_base::pll_save_checkpoint() { checkpoint_pll = cur_pll; } -void wd_fdc_analog_t::pll_retrieve_checkpoint() +void wd_fdc_analog_device_base::pll_retrieve_checkpoint() { cur_pll = checkpoint_pll; } -int wd_fdc_analog_t::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_analog_device_base::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.get_next_bit(tm, floppy, limit); } -bool wd_fdc_analog_t::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_analog_device_base::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.write_next_bit(bit, tm, floppy, limit); } -wd_fdc_digital_t::wd_fdc_digital_t(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, uint32_t clock, const char *shortname, const char *source) : - wd_fdc_t(mconfig, type, name, tag, owner, clock, shortname, source) +wd_fdc_digital_device_base::wd_fdc_digital_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) : + wd_fdc_device_base(mconfig, type, tag, owner, clock) { clock_ratio = 4; } -const int wd_fdc_digital_t::wd_digital_step_times[4] = { 12000, 24000, 40000, 60000 }; +constexpr int wd_fdc_digital_device_base::wd_digital_step_times[4]; -void wd_fdc_digital_t::pll_reset(bool fm, bool enmf, const attotime &when) +void wd_fdc_digital_device_base::pll_reset(bool fm, bool enmf, const attotime &when) { int clocks = 1; @@ -2211,48 +2217,48 @@ void wd_fdc_digital_t::pll_reset(bool fm, bool enmf, const attotime &when) cur_pll.set_clock(clocks_to_attotime(clocks)); } -void wd_fdc_digital_t::pll_start_writing(const attotime &tm) +void wd_fdc_digital_device_base::pll_start_writing(const attotime &tm) { cur_pll.start_writing(tm); } -void wd_fdc_digital_t::pll_commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::pll_commit(floppy_image_device *floppy, const attotime &tm) { cur_pll.commit(floppy, tm); } -void wd_fdc_digital_t::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::pll_stop_writing(floppy_image_device *floppy, const attotime &tm) { cur_pll.stop_writing(floppy, tm); } -int wd_fdc_digital_t::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_digital_device_base::pll_get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.get_next_bit(tm, floppy, limit); } -bool wd_fdc_digital_t::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_digital_device_base::pll_write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { return cur_pll.write_next_bit(bit, tm, floppy, limit); } -void wd_fdc_digital_t::pll_save_checkpoint() +void wd_fdc_digital_device_base::pll_save_checkpoint() { checkpoint_pll = cur_pll; } -void wd_fdc_digital_t::pll_retrieve_checkpoint() +void wd_fdc_digital_device_base::pll_retrieve_checkpoint() { cur_pll = checkpoint_pll; } -void wd_fdc_digital_t::digital_pll_t::set_clock(const attotime &period) +void wd_fdc_digital_device_base::digital_pll_t::set_clock(const attotime &period) { for(int i=0; i<42; i++) delays[i] = period*(i+1); } -void wd_fdc_digital_t::digital_pll_t::reset(const attotime &when) +void wd_fdc_digital_device_base::digital_pll_t::reset(const attotime &when) { counter = 0; increment = 128; @@ -2268,7 +2274,7 @@ void wd_fdc_digital_t::digital_pll_t::reset(const attotime &when) write_start_time = attotime::never; } -int wd_fdc_digital_t::digital_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) +int wd_fdc_digital_device_base::digital_pll_t::get_next_bit(attotime &tm, floppy_image_device *floppy, const attotime &limit) { attotime when = floppy ? floppy->get_next_transition(ctime) : attotime::never; @@ -2348,19 +2354,19 @@ int wd_fdc_digital_t::digital_pll_t::get_next_bit(attotime &tm, floppy_image_dev return bit; } -void wd_fdc_digital_t::digital_pll_t::start_writing(const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::start_writing(const attotime &tm) { write_start_time = tm; write_position = 0; } -void wd_fdc_digital_t::digital_pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::stop_writing(floppy_image_device *floppy, const attotime &tm) { commit(floppy, tm); write_start_time = attotime::never; } -bool wd_fdc_digital_t::digital_pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) +bool wd_fdc_digital_device_base::digital_pll_t::write_next_bit(bool bit, attotime &tm, floppy_image_device *floppy, const attotime &limit) { if(write_start_time.is_never()) { write_start_time = ctime; @@ -2390,7 +2396,7 @@ bool wd_fdc_digital_t::digital_pll_t::write_next_bit(bool bit, attotime &tm, flo return false; } -void wd_fdc_digital_t::digital_pll_t::commit(floppy_image_device *floppy, const attotime &tm) +void wd_fdc_digital_device_base::digital_pll_t::commit(floppy_image_device *floppy, const attotime &tm) { if(write_start_time.is_never() || tm == write_start_time) return; @@ -2401,9 +2407,9 @@ void wd_fdc_digital_t::digital_pll_t::commit(floppy_image_device *floppy, const write_position = 0; } -fd1771_t::fd1771_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1771, "FD1771", tag, owner, clock, "fd1771", __FILE__) +fd1771_device::fd1771_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1771, tag, owner, clock) { - const static int fd1771_step_times[4] = { 12000, 12000, 20000, 40000 }; + constexpr static int fd1771_step_times[4] = { 12000, 12000, 20000, 40000 }; step_times = fd1771_step_times; delay_register_commit = 16; @@ -2418,7 +2424,7 @@ fd1771_t::fd1771_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1771_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1771_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2426,9 +2432,9 @@ int fd1771_t::calc_sector_size(uint8_t size, uint8_t command) const return size ? size << 4 : 4096; } -fd1781_t::fd1781_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1781, "FD1781", tag, owner, clock, "fd1781", __FILE__) +fd1781_device::fd1781_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1781, tag, owner, clock) { - const static int fd1781_step_times[4] = { 6000, 12000, 20000, 40000 }; + constexpr static int fd1781_step_times[4] = { 6000, 12000, 20000, 40000 }; step_times = fd1781_step_times; delay_register_commit = 16; @@ -2443,7 +2449,7 @@ fd1781_t::fd1781_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1781_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1781_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2451,10 +2457,10 @@ int fd1781_t::calc_sector_size(uint8_t size, uint8_t command) const return size ? size << 4 : 4096; } -const int wd_fdc_t::fd179x_step_times[4] = { 6000, 12000, 20000, 30000 }; -const int wd_fdc_t::fd176x_step_times[4] = { 12000, 24000, 40000, 60000 }; +constexpr int wd_fdc_device_base::fd179x_step_times[4]; +constexpr int wd_fdc_device_base::fd176x_step_times[4]; -fd1791_t::fd1791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1791, "FD1791", tag, owner, clock, "fd1791", __FILE__) +fd1791_device::fd1791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1791, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2470,7 +2476,7 @@ fd1791_t::fd1791_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1792_t::fd1792_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1792, "FD1792", tag, owner, clock, "fd1792", __FILE__) +fd1792_device::fd1792_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1792, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2486,7 +2492,7 @@ fd1792_t::fd1792_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1793_t::fd1793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1793, "FD1793", tag, owner, clock, "fd1793", __FILE__) +fd1793_device::fd1793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1793, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2502,7 +2508,7 @@ fd1793_t::fd1793_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -kr1818vg93_t::kr1818vg93_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, KR1818VG93, "KR1818VG93", tag, owner, clock, "kr1818vg93", __FILE__) +kr1818vg93_device::kr1818vg93_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, KR1818VG93, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2518,7 +2524,7 @@ kr1818vg93_t::kr1818vg93_t(const machine_config &mconfig, const char *tag, devic nonsticky_immint = true; } -fd1794_t::fd1794_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1794, "FD1794", tag, owner, clock, "fd1794", __FILE__) +fd1794_device::fd1794_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1794, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2534,7 +2540,7 @@ fd1794_t::fd1794_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1795_t::fd1795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1795, "FD1795", tag, owner, clock, "fd1795", __FILE__) +fd1795_device::fd1795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1795, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2550,7 +2556,7 @@ fd1795_t::fd1795_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1795_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1795_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2558,7 +2564,7 @@ int fd1795_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -fd1797_t::fd1797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1797, "FD1797", tag, owner, clock, "fd1797", __FILE__) +fd1797_device::fd1797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1797, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2574,7 +2580,7 @@ fd1797_t::fd1797_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1797_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1797_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2582,7 +2588,7 @@ int fd1797_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -mb8866_t::mb8866_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8866, "MB8866", tag, owner, clock, "mb8866", __FILE__) +mb8866_device::mb8866_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8866, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2598,7 +2604,7 @@ mb8866_t::mb8866_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -mb8876_t::mb8876_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8876, "MB8876", tag, owner, clock, "mb8876", __FILE__) +mb8876_device::mb8876_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8876, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2614,7 +2620,7 @@ mb8876_t::mb8876_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -mb8877_t::mb8877_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, MB8877, "MB8877", tag, owner, clock, "mb8877", __FILE__) +mb8877_device::mb8877_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, MB8877, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 4; @@ -2630,7 +2636,7 @@ mb8877_t::mb8877_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1761_t::fd1761_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1761, "FD1761", tag, owner, clock, "fd1761", __FILE__) +fd1761_device::fd1761_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1761, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2646,7 +2652,7 @@ fd1761_t::fd1761_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1763_t::fd1763_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1763, "FD1763", tag, owner, clock, "fd1763", __FILE__) +fd1763_device::fd1763_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1763, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2662,7 +2668,7 @@ fd1763_t::fd1763_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -fd1765_t::fd1765_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1765, "FD1765", tag, owner, clock, "fd1765", __FILE__) +fd1765_device::fd1765_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1765, tag, owner, clock) { step_times = fd176x_step_times; delay_register_commit = 16; @@ -2678,7 +2684,7 @@ fd1765_t::fd1765_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1765_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1765_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2686,7 +2692,7 @@ int fd1765_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -fd1767_t::fd1767_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, FD1767, "FD1767", tag, owner, clock, "fd1767", __FILE__) +fd1767_device::fd1767_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, FD1767, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2702,7 +2708,7 @@ fd1767_t::fd1767_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int fd1767_t::calc_sector_size(uint8_t size, uint8_t command) const +int fd1767_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2710,7 +2716,7 @@ int fd1767_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd2791_t::wd2791_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2791, "WD2791", tag, owner, clock, "wd2791", __FILE__) +wd2791_device::wd2791_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2791, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2726,7 +2732,7 @@ wd2791_t::wd2791_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd2793_t::wd2793_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2793, "WD2793", tag, owner, clock, "wd2793", __FILE__) +wd2793_device::wd2793_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2793, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2742,7 +2748,7 @@ wd2793_t::wd2793_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd2795_t::wd2795_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2795, "WD2795", tag, owner, clock, "wd2795", __FILE__) +wd2795_device::wd2795_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2795, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2758,7 +2764,7 @@ wd2795_t::wd2795_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd2795_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd2795_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2766,7 +2772,7 @@ int wd2795_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd2797_t::wd2797_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_t(mconfig, WD2797, "WD2797", tag, owner, clock, "wd2797", __FILE__) +wd2797_device::wd2797_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_analog_device_base(mconfig, WD2797, tag, owner, clock) { step_times = fd179x_step_times; delay_register_commit = 16; @@ -2782,7 +2788,7 @@ wd2797_t::wd2797_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd2797_t::calc_sector_size(uint8_t size, uint8_t command) const +int wd2797_device::calc_sector_size(uint8_t size, uint8_t command) const { if(command & 0x08) return 128 << (size & 3); @@ -2790,7 +2796,7 @@ int wd2797_t::calc_sector_size(uint8_t size, uint8_t command) const return 128 << ((size + 1) & 3); } -wd1770_t::wd1770_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1770, "WD1770", tag, owner, clock, "wd1770", __FILE__) +wd1770_device::wd1770_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1770, tag, owner, clock) { step_times = wd_digital_step_times; delay_register_commit = 32; @@ -2806,7 +2812,7 @@ wd1770_t::wd1770_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -wd1772_t::wd1772_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1772, "WD1772", tag, owner, clock, "wd1772", __FILE__) +wd1772_device::wd1772_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1772, tag, owner, clock) { const static int wd1772_step_times[4] = { 12000, 24000, 4000, 6000 }; @@ -2824,12 +2830,12 @@ wd1772_t::wd1772_t(const machine_config &mconfig, const char *tag, device_t *own nonsticky_immint = false; } -int wd1772_t::settle_time() const +int wd1772_device::settle_time() const { return 30000; } -wd1773_t::wd1773_t(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_t(mconfig, WD1773, "WD1773", tag, owner, clock, "wd1773", __FILE__) +wd1773_device::wd1773_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : wd_fdc_digital_device_base(mconfig, WD1773, tag, owner, clock) { step_times = wd_digital_step_times; delay_register_commit = 32; |