From 83e223e2bd46701b124887361a5431e4ccd5512d Mon Sep 17 00:00:00 2001 From: folkert van heusden Date: Sat, 26 Mar 2022 17:55:02 +0100 Subject: [PATCH] limit to 22b if bit 4 of mmr3 is not set --- bus.cpp | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/bus.cpp b/bus.cpp index 05a257f..f18f539 100644 --- a/bus.cpp +++ b/bus.cpp @@ -53,6 +53,7 @@ void bus::clearmem() void bus::init() { MMR0 = 0; + MMR3 = 0; } uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev) @@ -316,21 +317,34 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev) uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1) * 64; - if (p_offset >= pdr_len && (MMR0 & 1)) { + bool direction = !!(pages[run_mode][apf].pdr & 8); + + if ((p_offset >= pdr_len && (MMR0 & 1) && direction == false) || (p_offset < pdr_len && (MMR0 & 1) && direction == true)) { D(fprintf(stderr, "bus::read::p_offset %o >= %o\n", p_offset, pdr_len);) - c->schedule_trap(04); // invalid address + c->schedule_trap(0250); // invalid access + + pages[run_mode][apf].pdr |= 1 << 7; + + MMR2 = c->getPC(); } else if (m_offset >= n_pages * 8192) { D(fprintf(stderr, "bus::read %o >= %o\n", m_offset, n_pages * 8192);) c->schedule_trap(04); // invalid address + + pages[run_mode][apf].pdr |= 1 << 7; + + MMR2 = c->getPC(); } + if (direction == false) // 18 bit + m_offset &= 01777777777; + if (word_mode) temp = m -> readByte(m_offset); else temp = m -> readWord(m_offset); - D(fprintf(stderr, "BUS read from %o (pages: %o/%o/%o, run mode %d, apf %d, PDR: %06o): %06o\n", m_offset, pages[run_mode][apf].par, pages[run_mode][apf].par * 64, n_pages * 8192, run_mode, apf, pages[run_mode][apf].pdr, temp);) + D(fprintf(stderr, "BUS read from %o (pages: %o/%o/%o, run mode %d, apf %d, PDR: %06o, b22: %d): %06o\n", m_offset, pages[run_mode][apf].par, pages[run_mode][apf].par * 64, n_pages * 8192, run_mode, apf, pages[run_mode][apf].pdr, MMR3 & 16, temp);) return temp; } @@ -597,16 +611,29 @@ uint16_t bus::write(const uint16_t a, const bool word_mode, uint16_t value, cons uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1)* 64; - if (p_offset >= pdr_len && (MMR0 & 1)) { + bool direction = !!(pages[run_mode][apf].pdr & 8); + + if ((p_offset >= pdr_len && (MMR0 & 1) && direction == false) || (p_offset < pdr_len && (MMR0 & 1) && direction == true)) { D(fprintf(stderr, "bus::write::p_offset %o >= %o\n", p_offset, pdr_len);) - c->schedule_trap(04); // invalid address + c->schedule_trap(0250); // invalid access + + pages[run_mode][apf].pdr |= 1 << 7; + + MMR2 = c->getPC(); } else if (m_offset >= n_pages * 8192) { D(fprintf(stderr, "bus::write %o >= %o\n", m_offset, n_pages * 8192);) c->schedule_trap(04); // invalid address + + pages[run_mode][apf].pdr |= 1 << 7; + + MMR2 = c->getPC(); } - D(fprintf(stderr, "BUS write to %o (pages: %o/%o/%o, run mode %d, apf %d, PDR: %06o): %06o\n", m_offset, pages[run_mode][apf].par, pages[run_mode][apf].par * 64, n_pages * 8192, run_mode, apf, pages[run_mode][apf].pdr, value);) + D(fprintf(stderr, "BUS write to %o (pages: %o/%o/%o, run mode %d, apf %d, PDR: %06o, b22: %d): %06o\n", m_offset, pages[run_mode][apf].par, pages[run_mode][apf].par * 64, n_pages * 8192, run_mode, apf, pages[run_mode][apf].pdr, MMR3 & 16, value);) + + if (direction == false) // 18 bit + m_offset &= 01777777777; if (word_mode) m->writeByte(m_offset, value);