#include #include #include #include #include "io/model.h" #include "isa/isa.h" bool iomodel::interact(std::array &ctlregs) { auto [ebegin, eend] = log.equal_range(time); for (auto e = ebegin; e != eend; ++e) { auto &r = ctlregs[e->second.reg]; r &= ~e->second.mask; r |= e->second.value; } ++time; if (ctlregs[TT_BITS] & TTO_TX) { // PDP-8 doesn't really have support for 8-bit output, this is Jules' contribution std::cout << (char)(((ctlregs[TT_BITS] & TTO_DATA) >> TTO_DATA_SHIFT) ^ 0x80) << std::flush; ctlregs[TT_BITS] &= ~TTO_TX & ~TTO_DATA; log.emplace(time + TT_OUTPUT_DELAY, event(TT_BITS, TTO_FLAG, 0)); } bool interrupt = false; if (ctlregs[INT_ENABLE] & 1) { if (ctlregs[TT_INPUT_INT_ENABLE]) { if (ctlregs[TT_BITS] & TTI_FLAG) interrupt = true; } if (ctlregs[TT_OUTPUT_INT_ENABLE]) { if ((ctlregs[TT_BITS] & (TTO_FLAG|TTO_FLAG_OLD)) == TTO_FLAG) interrupt = true; } } if (interrupt) { ctlregs[DATA_INSTRUCTION_FIELD_SAVED] = ctlregs[DATA_INSTRUCTION_FIELD_BUFFER]; ctlregs[DATA_INSTRUCTION_FIELD_BUFFER] = 0; ctlregs[HALTED] = 0; ctlregs[INT_ENABLE] = 0; ctlregs[TT_BITS] |= (ctlregs[TT_BITS] & TTO_FLAG) ? TTO_FLAG_OLD : 0; } else { ctlregs[INT_ENABLE] = (ctlregs[INT_ENABLE] >> 1) * 3; } return interrupt; };