diff options
author | 2023-01-06 13:30:23 +0700 | |
---|---|---|
committer | 2023-01-06 13:30:23 +0700 | |
commit | 07c20e3faf5b3dbcb596733ce4ffc004da29470b (patch) | |
tree | a4745b172835bad06af6119dbc4b168882ae4d78 /src/devices/cpu/romp | |
parent | e28f20b2d5cc33b5139728e1da42749dbe6af9ca (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.cpp | 6 | ||||
-rw-r--r-- | src/devices/cpu/romp/romp.h | 23 | ||||
-rw-r--r-- | src/devices/cpu/romp/rsc.h | 45 |
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 |