summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Jaen <639345+jaens@users.noreply.github.com>2021-06-15 12:58:48 -0700
committer GitHub <noreply@github.com>2021-06-16 05:58:48 +1000
commitc6088eebee0b68657cf262b91dfd34200e4e3580 (patch)
tree64213468a870ff6fed73d2226c0977d782713bb9
parent3c1ca80a75832bbf22b3a52fc8bf68cb4dba027f (diff)
pofo.cpp: Atari Portfolio fixes and improvements. (#8191)
* Fixed RAM expander reads. * Implemented magic port 0x61. * Fixed external drive B: detection. * Improved control register 0x8051 emulation.
-rw-r--r--src/devices/bus/pofo/hpc104.cpp2
-rw-r--r--src/mame/drivers/pofo.cpp61
2 files changed, 45 insertions, 18 deletions
diff --git a/src/devices/bus/pofo/hpc104.cpp b/src/devices/bus/pofo/hpc104.cpp
index 11744206c7e..2cf0d03b825 100644
--- a/src/devices/bus/pofo/hpc104.cpp
+++ b/src/devices/bus/pofo/hpc104.cpp
@@ -169,7 +169,7 @@ uint8_t pofo_hpc104_device::nrdi_r(offs_t offset, uint8_t data, bool iom, bool b
{
if (offset >= 0x1f000 && offset < 0x5f000)
{
- data = m_nvram[offset - 0x1f000] = data;
+ data = m_nvram[offset - 0x1f000];
}
}
}
diff --git a/src/mame/drivers/pofo.cpp b/src/mame/drivers/pofo.cpp
index 23b8f72fbbb..66e20a90ec3 100644
--- a/src/mame/drivers/pofo.cpp
+++ b/src/mame/drivers/pofo.cpp
@@ -113,10 +113,10 @@ private:
enum
{
- ROM_APP,
- CCM_A,
- CCM_B,
- ROM_EXT
+ ROM_APP = 0b000, // 0
+ CCM_A = 0b011, // 3
+ CCM_B = 0b111, // 7
+ ROM_EXT = 0b010, // 2
};
uint8_t mem_r(offs_t offset);
@@ -233,9 +233,17 @@ WRITE_LINE_MEMBER( portfolio_state::keyboard_int_w )
uint8_t portfolio_state::irq_status_r()
{
- return m_ip;
-}
+ uint8_t data = m_ip;
+ /*
+ The BIOS interrupt 11h (Equipment list) reports that the second floppy drive (B:) is
+ installed if the 3rd bit is set (which is also the external interrupt line).
+ It is not clear if the ~NMD1 line is OR or XORed or muxed with the interrupt line,
+ but this way seems to work.
+ */
+ data |= !m_exp->nmd1_r() << 3;
+ return data;
+}
//-------------------------------------------------
// irq_mask_w - interrupt enable mask
@@ -361,10 +369,10 @@ uint8_t portfolio_state::battery_r()
bit signal description
- 0 ? 1=boots from B:
- 1 ? 1=boots from external ROM
- 2 ? 1=boots from B:
- 3 ? 1=boots from ???
+ 0 ? bit 0 from bus select (m_rom_b)
+ 1 ?
+ 2 ? bit 2 from bus select (m_rom_b)
+ 3 ?
4 ?
5 PDET 1=peripheral connected
6 LOWB 0=battery low
@@ -374,6 +382,14 @@ uint8_t portfolio_state::battery_r()
uint8_t data = 0;
+ /*
+ Partially stores what has been written into this port.
+ Used by interrupt 61h service 24h (Get ROM/CCM state).
+ Setting bit 1 here causes the BIOS to permanently wedge the external ROM
+ select on, so mask it out as a workaround.
+ */
+ data |= (m_rom_b & 0b101);
+
// peripheral detect
data |= m_exp->pdet_r() << 5;
@@ -407,13 +423,7 @@ void portfolio_state::select_w(uint8_t data)
if (LOG) logerror("%s %s SELECT %02x\n", machine().time().as_string(), machine().describe_context(), data);
- switch (data & 0x0f)
- {
- case 3: m_rom_b = CCM_A; break;
- case 7: m_rom_b = CCM_B; break;
- case 0: m_rom_b = ROM_APP; break;
- case 2: m_rom_b = ROM_EXT; break;
- }
+ m_rom_b = data & 0x0f;
}
@@ -530,6 +540,10 @@ uint8_t portfolio_state::mem_r(offs_t offset)
case ROM_EXT:
// TODO
break;
+
+ default:
+ logerror("%s %s Invalid bus read %05x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff);
+ break;
}
}
else if (offset >= 0xe0000)
@@ -574,6 +588,14 @@ void portfolio_state::mem_w(offs_t offset, uint8_t data)
case CCM_B:
ncc1 = 0;
break;
+
+ case ROM_EXT:
+ case ROM_APP:
+ break;
+
+ default:
+ logerror("%s %s Invalid bus write %05x\n", machine().time().as_string(), machine().describe_context(), offset & 0x1ffff);
+ break;
}
}
@@ -632,6 +654,11 @@ uint8_t portfolio_state::io_r(offs_t offset)
break;
}
}
+ else if (offset == 0x61)
+ {
+ // Magic port to detect the Pofo
+ data = 0x61;
+ }
data = m_exp->nrdi_r(offset, data, iom, bcom, ncc1);