limit to 22b if bit 4 of mmr3 is not set
This commit is contained in:
parent
1d4b9ba073
commit
83e223e2bd
1 changed files with 33 additions and 6 deletions
39
bus.cpp
39
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);
|
||||
|
|
Loading…
Add table
Reference in a new issue