summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2021-03-11 14:09:57 +0100
committer Olivier Galibert <galibert@pobox.com>2021-03-11 14:10:19 +0100
commitb38a77bca54c007f995b9bb47687354d154b6be5 (patch)
tree8b7c04d75a7d9d3d1ccfc710caa946fbec4431b8
parent5f7283161f0d3c4f95d4e6965305001141741246 (diff)
swim3: Just enough emulation that it is not the cause of power mac not booting anymore
-rw-r--r--src/devices/machine/swim2.cpp3
-rw-r--r--src/devices/machine/swim3.cpp109
-rw-r--r--src/mame/drivers/mac.cpp7
-rw-r--r--src/mame/includes/mac.h2
-rw-r--r--src/mame/machine/mac.cpp25
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