diff options
author | 2021-03-11 14:09:57 +0100 | |
---|---|---|
committer | 2021-03-11 14:10:19 +0100 | |
commit | b38a77bca54c007f995b9bb47687354d154b6be5 (patch) | |
tree | 8b7c04d75a7d9d3d1ccfc710caa946fbec4431b8 | |
parent | 5f7283161f0d3c4f95d4e6965305001141741246 (diff) |
swim3: Just enough emulation that it is not the cause of power mac not booting anymore
-rw-r--r-- | src/devices/machine/swim2.cpp | 3 | ||||
-rw-r--r-- | src/devices/machine/swim3.cpp | 109 | ||||
-rw-r--r-- | src/mame/drivers/mac.cpp | 7 | ||||
-rw-r--r-- | src/mame/includes/mac.h | 2 | ||||
-rw-r--r-- | src/mame/machine/mac.cpp | 25 |
5 files changed, 83 insertions, 63 deletions
diff --git a/src/devices/machine/swim2.cpp b/src/devices/machine/swim2.cpp index 0ae1401f04a..9f2bee96bfc 100644 --- a/src/devices/machine/swim2.cpp +++ b/src/devices/machine/swim2.cpp @@ -78,6 +78,9 @@ void swim2_device::set_floppy(floppy_image_device *floppy) if(m_floppy == floppy) return; + sync(); + flush_write(); + m_floppy = floppy; update_phases(); m_hdsel_cb((m_mode >> 5) & 1); diff --git a/src/devices/machine/swim3.cpp b/src/devices/machine/swim3.cpp index 53ff0ce7151..d57455e575e 100644 --- a/src/devices/machine/swim3.cpp +++ b/src/devices/machine/swim3.cpp @@ -48,12 +48,11 @@ void swim3_device::set_floppy(floppy_image_device *floppy) if(m_floppy == floppy) return; - if(m_floppy) - m_floppy->mon_w(true); + logerror("floppy %s\n", floppy ? floppy->tag() : "-"); + m_floppy = floppy; - if(m_mode & 0x80) - m_floppy->mon_w(false); update_phases(); + m_hdsel_cb((m_mode >> 5) & 1); } floppy_image_device *swim3_device::get_floppy() const @@ -63,36 +62,42 @@ floppy_image_device *swim3_device::get_floppy() const void swim3_device::show_mode() const { - logerror("mode%s %s hdsel=%c %c%s %c%c%s\n", - m_mode & 0x80 ? " motoron" : "", - m_mode & 0x40 ? "ism" : "iwm", + logerror("mode%s%s hdsel=%c %c%s %c%c%s\n", + m_mode & 0x80 ? " step" : "", + m_mode & 0x40 ? " format" : "", m_mode & 0x20 ? '1' : '0', m_mode & 0x10 ? 'w' : 'r', - m_mode & 0x08 ? " action" : "", - m_mode & 0x04 ? 'a' : '-', - m_mode & 0x02 ? 'b' : '-', - m_mode & 0x01 ? " clear" : ""); + m_mode & 0x08 ? " go" : "", + m_mode & 0x04 ? 'b' : '-', + m_mode & 0x02 ? 'a' : '-', + m_mode & 0x01 ? " irq" : ""); } u8 swim3_device::read(offs_t offset) { static const char *const names[] = { - "?0", "?1", "?2", "?3", "?4", "?5", "?6", "?7", - "data", "mark", "crc", "param", "phases", "setup", "status", "handshake" + "data", "timer", "error", "param", "phases", "setup", "?6", "handshake", + "interrupt", "step", "track", "sector", "gap", "sect1", "xfer", "imask" }; switch(offset) { - case 0x3: case 0xb: { - u8 r = m_param[m_param_idx]; - m_param_idx = (m_param_idx + 1) & 15; - return r; - } - case 0x4: case 0xc: - return m_phases; - case 0x5: case 0xd: + case 0x4: // phases + return m_phases & 0xf; + + case 0x5: // setup return m_setup; - case 0xe: + + case 0x6: // mode return m_mode; + + case 0x7: { // handshake + u8 h = 0; + if(!m_floppy || m_floppy->wpt_r()) + h |= 0x08; + logerror("hand %02x\n", h); + return h; + }; + default: logerror("read %s\n", names[offset & 15]); break; @@ -102,65 +107,41 @@ u8 swim3_device::read(offs_t offset) void swim3_device::write(offs_t offset, u8 data) { - machine().debug_break(); + u8 prev_mode = m_mode; + static const char *const names[] = { - "data", "mark", "crc", "param", "phases", "setup", "mode0", "mode1", - "?8", "?9", "?a", "?b", "?c", "?d", "?e", "?f" + "data", "timer", "error", "param", "phases", "setup", "mode0", "mode1", + "?8", "step", "track", "sector", "gap", "sect1", "xfer", "imask" }; switch(offset) { - case 0x3: case 0xb: { -#if 0 - static const char *const pname[16] = { - "minct", "mult", "ssl", "sss", "sll", "sls", "rpt", "csls", - "lsl", "lss", "lll", "lls", "late", "time0", "early", "time1" - }; -#endif - static const char *const pname[4] = { - "late", "time0", "early", "time1" - }; - logerror("param[%s] = %02x\n", pname[m_param_idx], data); - m_param[m_param_idx] = data; - m_param_idx = (m_param_idx + 1) & 3; - break; - } - case 0x4: { - m_phases = data; + case 4: { // phases + m_phases = data | 0xf0; + logerror("phases %x\n", data); update_phases(); break; } - case 0x5: case 0xd: + case 5: // setup m_setup = data; -#if 0 - logerror("setup timer=%s tsm=%s %s ecm=%s %s %s 3.5=%s %s\n", - m_setup & 0x80 ? "on" : "off", - m_setup & 0x40 ? "off" : "on", - m_setup & 0x20 ? "ibm" : "apple", - m_setup & 0x10 ? "on" : "off", - m_setup & 0x08 ? "fclk/2" : "fclk", - m_setup & 0x04 ? "gcr" : "mfm", - m_setup & 0x02 ? "off" : "on", - m_setup & 0x01 ? "hdsel" : "q3"); -#endif - logerror("setup timer=%s tsm=%s %s ecm=%s %s %s 3.5=%s %s\n", - m_setup & 0x80 ? "on" : "off", - m_setup & 0x40 ? "off" : "on", + m_sel35_cb((m_setup >> 1) & 1); + logerror("setup write=%s %s nogcrconv=%s %s %s%s %s\n", + m_setup & 0x40 ? "gcr" : "mfm", m_setup & 0x20 ? "ibm" : "apple", m_setup & 0x10 ? "on" : "off", m_setup & 0x08 ? "fclk/2" : "fclk", m_setup & 0x04 ? "gcr" : "mfm", - m_setup & 0x02 ? "off" : "on", - m_setup & 0x01 ? "hdsel" : "q3"); + m_setup & 0x02 ? " copy" : "", + m_setup & 0x01 ? "wrinvert" : "wrdirect"); break; - case 0x6: + case 6: // mode clear m_mode &= ~data; m_mode |= 0x40; m_param_idx = 0; show_mode(); break; - case 0x7: + case 7: // mode set m_mode |= data; show_mode(); break; @@ -169,6 +150,12 @@ void swim3_device::write(offs_t offset, u8 data) logerror("write %s, %02x\n", names[offset], data); break; } + + if((m_mode ^ prev_mode) & 0x06) + m_devsel_cb((m_mode >> 1) & 3); + if((m_mode ^ prev_mode) & 0x20) + m_hdsel_cb((m_mode >> 5) & 1); + } void swim3_device::sync() diff --git a/src/mame/drivers/mac.cpp b/src/mame/drivers/mac.cpp index 53e4a28c33e..837970d0c46 100644 --- a/src/mame/drivers/mac.cpp +++ b/src/mame/drivers/mac.cpp @@ -739,23 +739,26 @@ void mac_state::add_base_devices(machine_config &config, bool rtc, int woz_versi switch (woz_version) { case 0: IWM(config, m_fdc, C15M); + m_fdc->devsel_cb().set(FUNC(mac_state::devsel_w)); break; case 1: SWIM1(config, m_fdc, C15M); + m_fdc->devsel_cb().set(FUNC(mac_state::devsel_w)); break; case 2: SWIM2(config, m_fdc, C15M); m_fdc->hdsel_cb().set(FUNC(mac_state::hdsel_w)); + m_fdc->devsel_cb().set(FUNC(mac_state::devsel_w)); break; case 3: SWIM3(config, m_fdc, C15M); - m_fdc->hdsel_cb().set(FUNC(mac_state::hdsel_w)); + m_fdc->hdsel_cb().set(FUNC(mac_state::hdsel_s3_w)); + m_fdc->devsel_cb().set(FUNC(mac_state::devsel_s3_w)); break; } m_fdc->phases_cb().set(FUNC(mac_state::phases_w)); m_fdc->sel35_cb().set(FUNC(mac_state::sel35_w)); - m_fdc->devsel_cb().set(FUNC(mac_state::devsel_w)); if (woz_version == 0) { diff --git a/src/mame/includes/mac.h b/src/mame/includes/mac.h index cddb4f2aef9..4a025ce30d1 100644 --- a/src/mame/includes/mac.h +++ b/src/mame/includes/mac.h @@ -406,6 +406,8 @@ private: void sel35_w(int sel35); void devsel_w(uint8_t devsel); void hdsel_w(int hdsel); + void devsel_s3_w(uint8_t devsel); + void hdsel_s3_w(int hdsel); DECLARE_VIDEO_START(mac); DECLARE_VIDEO_START(macsonora); diff --git a/src/mame/machine/mac.cpp b/src/mame/machine/mac.cpp index cfa8d4207ea..912c187350b 100644 --- a/src/mame/machine/mac.cpp +++ b/src/mame/machine/mac.cpp @@ -2464,6 +2464,14 @@ void mac_state::devsel_w(u8) void mac_state::hdsel_w(int) { } + +void mac_state::devsel_s3_w(u8) +{ +} + +void mac_state::hdsel_s3_w(int) +{ +} #else void mac_state::phases_w(uint8_t phases) @@ -2494,4 +2502,21 @@ void mac_state::hdsel_w(int hdsel) { } +void mac_state::devsel_s3_w(uint8_t devsel) +{ + if(devsel == 1) + m_cur_floppy = m_floppy[0]->get_device(); + else if(devsel == 2) + m_cur_floppy = m_floppy[1]->get_device(); + else + m_cur_floppy = nullptr; + m_fdc->set_floppy(m_cur_floppy); +} + +void mac_state::hdsel_s3_w(int hdsel) +{ + if(m_cur_floppy) + m_cur_floppy->ss_w(hdsel); +} + #endif |