i/o logging: handle peek_only-flag correct

This commit is contained in:
folkert van heusden 2023-03-21 13:45:17 +01:00
parent 470919e85d
commit 406c2a5a09
Signed by untrusted user who does not match committer: folkert
GPG key ID: 6B6455EDFEED3BD1

82
bus.cpp
View file

@ -58,7 +58,8 @@ uint16_t bus::read_pdr(const uint32_t a, const int run_mode, const bool word_mod
bool is_d = a & 16; bool is_d = a & 16;
uint16_t t = pages[run_mode][is_d][page].pdr; uint16_t t = pages[run_mode][is_d][page].pdr;
DOLOG(debug, !peek_only, "read run-mode %d: %c PDR for %d: %o", run_mode, is_d ? 'D' : 'I', page, t); if (!peek_only)
DOLOG(debug, false, "read run-mode %d: %c PDR for %d: %o", run_mode, is_d ? 'D' : 'I', page, t);
return word_mode ? (a & 1 ? t >> 8 : t & 255) : t; return word_mode ? (a & 1 ? t >> 8 : t & 255) : t;
} }
@ -69,7 +70,8 @@ uint16_t bus::read_par(const uint32_t a, const int run_mode, const bool word_mod
bool is_d = a & 16; bool is_d = a & 16;
uint16_t t = pages[run_mode][is_d][page].par; uint16_t t = pages[run_mode][is_d][page].par;
DOLOG(debug, !peek_only, "read run-mode %d: %c PAR for %d: %o (phys: %07o)", run_mode, is_d ? 'D' : 'I', page, t, t * 64); if (!peek_only)
DOLOG(debug, false, "read run-mode %d: %c PAR for %d: %o (phys: %07o)", run_mode, is_d ? 'D' : 'I', page, t, t * 64);
return word_mode ? (a & 1 ? t >> 8 : t & 255) : t; return word_mode ? (a & 1 ? t >> 8 : t & 255) : t;
} }
@ -79,34 +81,36 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
uint16_t temp = 0; uint16_t temp = 0;
if (a >= 0160000) { if (a >= 0160000) {
DOLOG(debug, !peek_only, "READ from %06o/IO %c %c", a, space == d_space ? 'D' : 'I', word_mode ? 'B' : 'W'); if (!peek_only) {
DOLOG(debug, false, "READ from %06o/IO %c %c", a, space == d_space ? 'D' : 'I', word_mode ? 'B' : 'W');
if (word_mode) if (word_mode)
DOLOG(debug, false, "READ I/O %06o in byte mode", a); DOLOG(debug, false, "READ I/O %06o in byte mode", a);
}
//// REGISTERS //// //// REGISTERS ////
if (a >= ADDR_KERNEL_R && a <= ADDR_KERNEL_R + 5) { // kernel R0-R5 if (a >= ADDR_KERNEL_R && a <= ADDR_KERNEL_R + 5) { // kernel R0-R5
DOLOG(debug, !peek_only, "readb kernel R%d", a - ADDR_KERNEL_R); if (!peek_only) DOLOG(debug, false, "readb kernel R%d", a - ADDR_KERNEL_R);
return c -> getRegister(a - ADDR_KERNEL_R, 0, false) & (word_mode ? 0xff : 0xffff); return c -> getRegister(a - ADDR_KERNEL_R, 0, false) & (word_mode ? 0xff : 0xffff);
} }
if (a >= ADDR_USER_R && a <= ADDR_USER_R + 5) { // user R0-R5 if (a >= ADDR_USER_R && a <= ADDR_USER_R + 5) { // user R0-R5
DOLOG(debug, !peek_only, "readb user R%d", a - ADDR_USER_R); if (!peek_only) DOLOG(debug, false, "readb user R%d", a - ADDR_USER_R);
return c -> getRegister(a - ADDR_USER_R, 3, false) & (word_mode ? 0xff : 0xffff); return c -> getRegister(a - ADDR_USER_R, 3, false) & (word_mode ? 0xff : 0xffff);
} }
if (a == ADDR_KERNEL_SP) { // kernel SP if (a == ADDR_KERNEL_SP) { // kernel SP
DOLOG(debug, !peek_only, "readb kernel sp"); if (!peek_only) DOLOG(debug, false, "readb kernel sp");
return c -> getStackPointer(0) & (word_mode ? 0xff : 0xffff); return c -> getStackPointer(0) & (word_mode ? 0xff : 0xffff);
} }
if (a == ADDR_PC) { // PC if (a == ADDR_PC) { // PC
DOLOG(debug, !peek_only, "readb pc"); if (!peek_only) DOLOG(debug, false, "readb pc");
return c -> getPC() & (word_mode ? 0xff : 0xffff); return c -> getPC() & (word_mode ? 0xff : 0xffff);
} }
if (a == ADDR_SV_SP) { // supervisor SP if (a == ADDR_SV_SP) { // supervisor SP
DOLOG(debug, !peek_only, "readb supervisor sp"); if (!peek_only) DOLOG(debug, false, "readb supervisor sp");
return c -> getStackPointer(1) & (word_mode ? 0xff : 0xffff); return c -> getStackPointer(1) & (word_mode ? 0xff : 0xffff);
} }
if (a == ADDR_USER_SP) { // user SP if (a == ADDR_USER_SP) { // user SP
DOLOG(debug, !peek_only, "readb user sp"); if (!peek_only) DOLOG(debug, false, "readb user sp");
return c -> getStackPointer(3) & (word_mode ? 0xff : 0xffff); return c -> getStackPointer(3) & (word_mode ? 0xff : 0xffff);
} }
///^ registers ^/// ///^ registers ^///
@ -120,43 +124,42 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
} }
if (a == ADDR_CPU_ERR) { // cpu error register if (a == ADDR_CPU_ERR) { // cpu error register
DOLOG(debug, !peek_only, "readb cpuerr"); if (!peek_only) DOLOG(debug, false, "readb cpuerr");
return CPUERR & 0xff; return CPUERR & 0xff;
} }
if (a == ADDR_MAINT) { // MAINT if (a == ADDR_MAINT) { // MAINT
DOLOG(debug, !peek_only, "read MAINT"); if (!peek_only) DOLOG(debug, false, "read MAINT");
return 1; // POWER OK return 1; // POWER OK
} }
if (a == ADDR_CONSW) { // console switch & display register if (a == ADDR_CONSW) { // console switch & display register
DOLOG(debug, !peek_only, "read console switch (%06o)", console_switches); if (!peek_only) DOLOG(debug, false, "read console switch (%06o)", console_switches);
return console_switches; return console_switches;
} }
if (a == ADDR_KW11P) { // KW11P programmable clock if (a == ADDR_KW11P) { // KW11P programmable clock
DOLOG(debug, !peek_only, "read programmable clock"); if (!peek_only) DOLOG(debug, false, "read programmable clock");
return 128; return 128;
} }
if (a == ADDR_PIR) { // PIR if (a == ADDR_PIR) { // PIR
DOLOG(debug, !peek_only, "read PIR"); if (!peek_only) DOLOG(debug, false, "read PIR");
return PIR; return PIR;
} }
if (a == ADDR_SYSTEM_ID) { if (a == ADDR_SYSTEM_ID) {
DOLOG(debug, !peek_only, "read system id"); if (!peek_only) DOLOG(debug, false, "read system id");
return 011064; return 011064;
} }
if (a == ADDR_LFC) { // line frequency clock and status register if (a == ADDR_LFC) { // line frequency clock and status register
DOLOG(debug, !peek_only, "read line freq clock"); if (!peek_only) DOLOG(debug, false, "read line freq clock");
return lf_csr; return lf_csr;
} }
if (a == ADDR_LP11CSR) { // printer, CSR register, LP11 if (a == ADDR_LP11CSR) { // printer, CSR register, LP11
DOLOG(debug, !peek_only, "read LP11 CSR"); if (!peek_only) DOLOG(debug, false, "read LP11 CSR");
return 0x80; return 0x80;
} }
@ -181,76 +184,77 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
} }
if (a >= 0170200 && a <= 0170377) { // unibus map if (a >= 0170200 && a <= 0170377) { // unibus map
DOLOG(debug, !peek_only, "reading unibus map (%06o)", a); if (!peek_only) DOLOG(debug, false, "reading unibus map (%06o)", a);
// TODO // TODO
return 0; return 0;
} }
if (word_mode) { if (word_mode) {
if (a == ADDR_PSW) { // PSW if (a == ADDR_PSW) { // PSW
DOLOG(debug, !peek_only, "readb PSW LSB"); if (!peek_only) DOLOG(debug, false, "readb PSW LSB");
return c -> getPSW() & 255; return c -> getPSW() & 255;
} }
if (a == ADDR_PSW + 1) { if (a == ADDR_PSW + 1) {
DOLOG(debug, !peek_only, "readb PSW MSB"); if (!peek_only) DOLOG(debug, false, "readb PSW MSB");
return c -> getPSW() >> 8; return c -> getPSW() >> 8;
} }
if (a == ADDR_STACKLIM) { // stack limit register if (a == ADDR_STACKLIM) { // stack limit register
DOLOG(debug, !peek_only, "readb stack limit register (low)"); if (!peek_only) DOLOG(debug, false, "readb stack limit register (low)");
return c -> getStackLimitRegister() & 0xff; return c -> getStackLimitRegister() & 0xff;
} }
if (a == ADDR_STACKLIM + 1) { // stack limit register if (a == ADDR_STACKLIM + 1) { // stack limit register
DOLOG(debug, !peek_only, "readb stack limit register (high)"); if (!peek_only) DOLOG(debug, false, "readb stack limit register (high)");
return c -> getStackLimitRegister() >> 8; return c -> getStackLimitRegister() >> 8;
} }
if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register
DOLOG(debug, !peek_only, "readb micropgrogram break register (low: %03o)", microprogram_break_register & 255); if (!peek_only) DOLOG(debug, false, "readb micropgrogram break register (low: %03o)", microprogram_break_register & 255);
return microprogram_break_register & 255; return microprogram_break_register & 255;
} }
if (a == ADDR_MICROPROG_BREAK_REG + 1) { // microprogram break register if (a == ADDR_MICROPROG_BREAK_REG + 1) { // microprogram break register
DOLOG(debug, !peek_only, "readb micropgrogram break register (high: %03o)", microprogram_break_register >> 8); if (!peek_only) DOLOG(debug, false, "readb micropgrogram break register (high: %03o)", microprogram_break_register >> 8);
return microprogram_break_register >> 8; return microprogram_break_register >> 8;
} }
} }
else { else {
if (a == ADDR_MMR0) { if (a == ADDR_MMR0) {
DOLOG(debug, !peek_only, "read MMR0"); if (!peek_only) DOLOG(debug, false, "read MMR0");
return MMR0; return MMR0;
} }
if (a == ADDR_MMR1) { // MMR1 if (a == ADDR_MMR1) { // MMR1
DOLOG(debug, !peek_only, "read MMR1"); if (!peek_only) DOLOG(debug, false, "read MMR1");
return MMR1; return MMR1;
} }
if (a == ADDR_MMR2) { // MMR2 if (a == ADDR_MMR2) { // MMR2
DOLOG(debug, !peek_only, "read MMR2"); if (!peek_only) DOLOG(debug, false, "read MMR2");
return MMR2; return MMR2;
} }
if (a == ADDR_MMR3) { // MMR3 if (a == ADDR_MMR3) { // MMR3
DOLOG(debug, !peek_only, "read MMR3"); if (!peek_only) DOLOG(debug, false, "read MMR3");
return MMR3; return MMR3;
} }
if (a == ADDR_PSW) { // PSW if (a == ADDR_PSW) { // PSW
DOLOG(debug, !peek_only, "read PSW"); if (!peek_only) DOLOG(debug, false, "read PSW");
return c -> getPSW(); return c -> getPSW();
} }
if (a == ADDR_STACKLIM) { // stack limit register if (a == ADDR_STACKLIM) { // stack limit register
if (!peek_only) DOLOG(debug, false, "read stack limit register");
return c -> getStackLimitRegister(); return c -> getStackLimitRegister();
} }
if (a == ADDR_CPU_ERR) { // cpu error register if (a == ADDR_CPU_ERR) { // cpu error register
DOLOG(debug, !peek_only, "read CPUERR"); if (!peek_only) DOLOG(debug, false, "read CPUERR");
return CPUERR; return CPUERR;
} }
if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register if (a == ADDR_MICROPROG_BREAK_REG) { // microprogram break register
DOLOG(debug, !peek_only, "read micropgrogram break register (%06o)", microprogram_break_register); if (!peek_only) DOLOG(debug, false, "read micropgrogram break register (%06o)", microprogram_break_register);
return microprogram_break_register; return microprogram_break_register;
} }
} }
@ -275,12 +279,12 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
constexpr uint32_t system_size = n_pages * 8192 / 64 - 1; constexpr uint32_t system_size = n_pages * 8192 / 64 - 1;
if (a == ADDR_SYSSIZE + 2) { // system size HI if (a == ADDR_SYSSIZE + 2) { // system size HI
// printf("accessing system size HI\r\n"); if (!peek_only) DOLOG(debug, false, "accessing system size HI");
return system_size >> 16; return system_size >> 16;
} }
if (a == ADDR_SYSSIZE) { // system size LO if (a == ADDR_SYSSIZE) { // system size LO
// printf("accessing system size LO\r\n"); if (!peek_only) DOLOG(debug, false, "accessing system size LO");
return system_size; return system_size;
} }
@ -295,7 +299,7 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
} }
if (peek_only == false && word_mode == false && (a & 1)) { if (peek_only == false && word_mode == false && (a & 1)) {
DOLOG(debug, true, "READ from %06o - odd address!", a); if (!peek_only) DOLOG(debug, true, "READ from %06o - odd address!", a);
c->schedule_trap(004); // invalid access c->schedule_trap(004); // invalid access
return 0; return 0;
} }
@ -305,7 +309,7 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
uint32_t m_offset = calculate_physical_address(run_mode, a, !peek_only, false, peek_only, space == d_space); uint32_t m_offset = calculate_physical_address(run_mode, a, !peek_only, false, peek_only, space == d_space);
if (peek_only == false && m_offset >= n_pages * 8192) { if (peek_only == false && m_offset >= n_pages * 8192) {
DOLOG(debug, false, "Read non existing mapped memory (%o >= %o)", m_offset, n_pages * 8192); if (!peek_only) DOLOG(debug, false, "Read non existing mapped memory (%o >= %o)", m_offset, n_pages * 8192);
c->schedule_trap(004); // no such memory c->schedule_trap(004); // no such memory
} }
@ -314,7 +318,7 @@ uint16_t bus::read(const uint16_t a, const bool word_mode, const bool use_prev,
else else
temp = m -> readWord(m_offset); temp = m -> readWord(m_offset);
DOLOG(debug, !peek_only, "READ from %06o/%07o %c %c: %o", a, m_offset, space == d_space ? 'D' : 'I', word_mode ? 'B' : 'W', temp); if (!peek_only) DOLOG(debug, false, "READ from %06o/%07o %c %c: %o", a, m_offset, space == d_space ? 'D' : 'I', word_mode ? 'B' : 'W', temp);
return temp; return temp;
} }