restructured

This commit is contained in:
folkert van heusden 2022-03-27 13:17:28 +02:00
parent 9226f63eda
commit fd95246f2f
2 changed files with 33 additions and 29 deletions

56
bus.cpp
View file

@ -313,25 +313,27 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev)
m_offset += p_offset; m_offset += p_offset;
uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1) * 64; if (MMR0 & 1) {
uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1) * 64;
bool direction = !!(pages[run_mode][apf].pdr & 8); 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)) { if ((p_offset >= pdr_len && direction == false) || (p_offset < pdr_len && direction == true)) {
D(fprintf(stderr, "bus::read::p_offset %o >= %o\n", p_offset, pdr_len);) D(fprintf(stderr, "bus::read::p_offset %o >= %o\n", p_offset, pdr_len);)
c->schedule_trap(0250); // invalid access c->schedule_trap(0250); // invalid access
pages[run_mode][apf].pdr |= 1 << 7; pages[run_mode][apf].pdr |= 1 << 7;
throw 1; throw 1;
} }
else if (m_offset >= n_pages * 8192) { else if (m_offset >= n_pages * 8192) {
D(fprintf(stderr, "bus::read %o >= %o\n", m_offset, n_pages * 8192);) D(fprintf(stderr, "bus::read %o >= %o\n", m_offset, n_pages * 8192);)
c->schedule_trap(04); // invalid address c->schedule_trap(04); // invalid address
pages[run_mode][apf].pdr |= 1 << 7; pages[run_mode][apf].pdr |= 1 << 7;
throw 1; throw 1;
}
} }
if (word_mode) if (word_mode)
@ -602,25 +604,27 @@ uint16_t bus::write(const uint16_t a, const bool word_mode, uint16_t value, cons
m_offset += p_offset; m_offset += p_offset;
uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1)* 64; if (MMR0 & 1) {
uint16_t pdr_len = (((pages[run_mode][apf].pdr >> 8) & 127) + 1)* 64;
bool direction = !!(pages[run_mode][apf].pdr & 8); 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)) { if ((p_offset >= pdr_len && direction == false) || (p_offset < pdr_len && direction == true)) {
D(fprintf(stderr, "bus::write::p_offset %o >= %o\n", p_offset, pdr_len);) D(fprintf(stderr, "bus::write::p_offset %o >= %o\n", p_offset, pdr_len);)
c->schedule_trap(0250); // invalid access c->schedule_trap(0250); // invalid access
pages[run_mode][apf].pdr |= 1 << 7; pages[run_mode][apf].pdr |= 1 << 7;
throw 1; throw 1;
} }
else if (m_offset >= n_pages * 8192) { else if (m_offset >= n_pages * 8192) {
D(fprintf(stderr, "bus::write %o >= %o\n", m_offset, n_pages * 8192);) D(fprintf(stderr, "bus::write %o >= %o\n", m_offset, n_pages * 8192);)
c->schedule_trap(04); // invalid address c->schedule_trap(04); // invalid address
pages[run_mode][apf].pdr |= 1 << 7; pages[run_mode][apf].pdr |= 1 << 7;
throw 1; throw 1;
}
} }
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);) 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);)

View file

@ -1626,10 +1626,10 @@ void cpu::step()
if (temp_pc & 1) if (temp_pc & 1)
busError(); busError();
if (disas)
disassemble();
try { try {
if (disas)
disassemble();
uint16_t instr = b->readWord(temp_pc); uint16_t instr = b->readWord(temp_pc);
addRegister(7, false, 2); addRegister(7, false, 2);