summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/cpu/romp
diff options
context:
space:
mode:
author Patrick Mackinlay <pmackinlay@hotmail.com>2023-01-06 13:30:23 +0700
committer Patrick Mackinlay <pmackinlay@hotmail.com>2023-01-06 13:30:23 +0700
commit07c20e3faf5b3dbcb596733ce4ffc004da29470b (patch)
treea4745b172835bad06af6119dbc4b168882ae4d78 /src/devices/cpu/romp
parente28f20b2d5cc33b5139728e1da42749dbe6af9ca (diff)
rtpc: wip, now able to boot from vrm floppy
* rtpc: improve keyboard/locator/speaker adapter emulation * romp: fully decode memory and i/o access from processor channel * iocc: use emumem flags for isa bus i/o width detection * iocc: correct isa bus access endianness * iocc: internalize tcw and csr
Diffstat (limited to 'src/devices/cpu/romp')
-rw-r--r--src/devices/cpu/romp/romp.cpp6
-rw-r--r--src/devices/cpu/romp/romp.h23
-rw-r--r--src/devices/cpu/romp/rsc.h45
3 files changed, 47 insertions, 27 deletions
diff --git a/src/devices/cpu/romp/romp.cpp b/src/devices/cpu/romp/romp.cpp
index 37d73c4932b..6057c7621d4 100644
--- a/src/devices/cpu/romp/romp.cpp
+++ b/src/devices/cpu/romp/romp.cpp
@@ -5,7 +5,7 @@
* IBM Research and Office Products Division Microprocessor (ROMP).
*
* Sources:
- * - http://bitsavers.org/pdf/ibm/pc/rt/75X0232_RT_PC_Technical_Reference_Volume_1_Jun87.pdf
+ * - IBM RT PC Hardware Technical Reference Volume I, 75X0232, March 1987
*
* TODO:
* - configurable storage channel
@@ -322,7 +322,7 @@ void romp_device::execute_run()
m_icount -= 4;
break;
case 0xcb: // ior: input/output read
- if (((r3 + i) & 0xff00'0000U) || !m_mmu->ior(r3 + i, m_gpr[R2]))
+ if (((r3 + i) & 0xff00'0000U) || !m_mmu->pio_load(r3 + i, m_gpr[R2]))
program_check(PCS_PCK | PCS_DAE);
break;
case 0xcc: // ti: trap on condition immediate
@@ -433,7 +433,7 @@ void romp_device::execute_run()
m_icount -= 4;
break;
case 0xdb: // iow: input/output write
- if (((r3 + i) & 0xff00'0000U) || !m_mmu->iow(r3 + i, m_gpr[R2]))
+ if (((r3 + i) & 0xff00'0000U) || !m_mmu->pio_store(r3 + i, m_gpr[R2]))
program_check(PCS_PCK | PCS_DAE);
m_icount--;
break;
diff --git a/src/devices/cpu/romp/romp.h b/src/devices/cpu/romp/romp.h
index 2d726bbcd4c..63d3e523de2 100644
--- a/src/devices/cpu/romp/romp.h
+++ b/src/devices/cpu/romp/romp.h
@@ -166,7 +166,7 @@ private:
switch (address >> 28)
{
default:
- if (m_mmu->load(address, data, mode))
+ if (m_mmu->mem_load(address, data, mode))
f(data);
else
program_check(PCS_PCK | PCS_DAE);
@@ -176,8 +176,13 @@ private:
switch (address >> 24)
{
case 0xf0:
+ if (m_iou->pio_load(address, data, mode))
+ f(data);
+ else
+ program_check(PCS_PCK | PCS_DAE);
+ break;
case 0xf4:
- if (m_iou->load(address, data, mode))
+ if (m_iou->mem_load(address, data, mode))
f(data);
else
program_check(PCS_PCK | PCS_DAE);
@@ -202,7 +207,7 @@ private:
switch (address >> 28)
{
default:
- if (!m_mmu->store(address, data, mode))
+ if (!m_mmu->mem_store(address, data, mode))
program_check(PCS_PCK | PCS_DAE);
break;
@@ -210,8 +215,11 @@ private:
switch (address >> 24)
{
case 0xf0:
+ if (!m_iou->pio_store(address, data, mode))
+ program_check(PCS_PCK | PCS_DAE);
+ break;
case 0xf4:
- if (!m_iou->store(address, data, mode))
+ if (!m_iou->mem_store(address, data, mode))
program_check(PCS_PCK | PCS_DAE);
break;
@@ -234,7 +242,7 @@ private:
switch (address >> 28)
{
default:
- if (!m_mmu->modify(address, f, mode))
+ if (!m_mmu->mem_modify(address, f, mode))
program_check(PCS_PCK | PCS_DAE);
break;
@@ -242,8 +250,11 @@ private:
switch (address >> 24)
{
case 0xf0:
+ if (!m_iou->pio_modify(address, f, mode))
+ program_check(PCS_PCK | PCS_DAE);
+ break;
case 0xf4:
- if (!m_iou->modify(address, f, mode))
+ if (!m_iou->mem_modify(address, f, mode))
program_check(PCS_PCK | PCS_DAE);
break;
diff --git a/src/devices/cpu/romp/rsc.h b/src/devices/cpu/romp/rsc.h
index 6810a7cefcb..1f9655ce271 100644
--- a/src/devices/cpu/romp/rsc.h
+++ b/src/devices/cpu/romp/rsc.h
@@ -37,17 +37,29 @@ public:
RSC_PUT = 7,
};
- virtual bool load(u32 address, u8 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool load(u32 address, u16 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool load(u32 address, u32 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_load(u32 address, u8 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_load(u32 address, u16 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_load(u32 address, u32 &data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool store(u32 address, u8 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool store(u32 address, u16 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool store(u32 address, u32 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_store(u32 address, u8 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_store(u32 address, u16 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
+ virtual bool mem_store(u32 address, u32 data, rsc_mode const mode = RSC_N, bool sp = false) = 0;
- virtual bool modify(u32 address, std::function<u8(u8)> f, rsc_mode const mode = RSC_N) = 0;
- virtual bool modify(u32 address, std::function<u16(u16)> f, rsc_mode const mode = RSC_N) = 0;
- virtual bool modify(u32 address, std::function<u32(u32)> f, rsc_mode const mode = RSC_N) = 0;
+ virtual bool mem_modify(u32 address, std::function<u8(u8)> f, rsc_mode const mode = RSC_N) = 0;
+ virtual bool mem_modify(u32 address, std::function<u16(u16)> f, rsc_mode const mode = RSC_N) = 0;
+ virtual bool mem_modify(u32 address, std::function<u32(u32)> f, rsc_mode const mode = RSC_N) = 0;
+
+ virtual bool pio_load(u32 address, u8 &data, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_load(u32 address, u16 &data, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_load(u32 address, u32 &data, rsc_mode const mode = RSC_N) = 0;
+
+ virtual bool pio_store(u32 address, u8 data, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_store(u32 address, u16 data, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_store(u32 address, u32 data, rsc_mode const mode = RSC_N) = 0;
+
+ virtual bool pio_modify(u32 address, std::function<u8(u8)> f, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_modify(u32 address, std::function<u16(u16)> f, rsc_mode const mode = RSC_N) = 0;
+ virtual bool pio_modify(u32 address, std::function<u32(u32)> f, rsc_mode const mode = RSC_N) = 0;
protected:
rsc_bus_interface(machine_config const &mconfig, device_t &device, char const *type)
@@ -69,17 +81,14 @@ public:
// cpu interface
virtual bool fetch(u32 address, u16 &data, rsc_mode const mode = RSC_N) = 0;
- virtual bool ior(u32 address, u32 &data) = 0;
- virtual bool iow(u32 address, u32 data) = 0;
-
// rsc_bus_interface overrides
- virtual bool load(u32 address, u8 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
- virtual bool load(u32 address, u16 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
- virtual bool load(u32 address, u32 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_load(u32 address, u8 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_load(u32 address, u16 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_load(u32 address, u32 &data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
- virtual bool store(u32 address, u8 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
- virtual bool store(u32 address, u16 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
- virtual bool store(u32 address, u32 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_store(u32 address, u8 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_store(u32 address, u16 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
+ virtual bool mem_store(u32 address, u32 data, rsc_mode const mode = RSC_N, bool sp = true) override = 0;
};
#endif // MAME_CPU_ROMP_RSC_H