From 763beb022c799598ef4eaa9750ad259497bd2e84 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 22 Oct 2022 22:53:26 -0700 Subject: Merge TT_INPUT and TT_OUTPUT into TT_BITS --- isa/decode.cpp | 48 ++++++++++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 18 deletions(-) (limited to 'isa/decode.cpp') diff --git a/isa/decode.cpp b/isa/decode.cpp index dde5b74..41d125d 100644 --- a/isa/decode.cpp +++ b/isa/decode.cpp @@ -74,54 +74,66 @@ instruction_context decode(unsigned int dfifb, unsigned int pc, unsigned int bit case 6: // IOT switch ((bits >> 3) & 077) { case 004: + // TELETYPE TELEPRINTER/PUNCH switch (bits & 07) { case 0: - inst.write_ctlreg = TT_OUTPUT; + // Set TTO flag + inst.read_ctlreg = TT_BITS; + inst.write_ctlreg = TT_BITS; inst.ef = [](auto &ctx) { - ctx.ctlval = 0x600; + ctx.ctlval.value() |= TTO_FLAG | TTO_FLAG_OLD; }; break; case 1: - inst.read_ctlreg = TT_OUTPUT; + // Skip if TTO flag is set + inst.read_ctlreg = TT_BITS; inst.possibly_redirects = true; inst.ef = [](auto &ctx) { - if (ctx.ctlval.value() & 0x200) + if (ctx.ctlval.value() & TTO_FLAG) ctx.next_pc = (ctx.next_pc & ~07777) | ((ctx.next_pc + 1) & 07777); }; break; case 2: - inst.write_ctlreg = TT_OUTPUT; + // Clear TTO flag + inst.read_ctlreg = TT_BITS; + inst.write_ctlreg = TT_BITS; inst.ef = [](auto &ctx) { - ctx.ctlval = 0; + ctx.ctlval.value() &= ~TTO_FLAG & ~TTO_FLAG_OLD; }; break; case 4: + // Print to TTO inst.need_read_acc = true; - inst.read_ctlreg = TT_OUTPUT; - inst.write_ctlreg = TT_OUTPUT; + inst.read_ctlreg = TT_BITS; + inst.write_ctlreg = TT_BITS; inst.ef = [](auto &ctx) { auto &x = ctx.ctlval.value(); - x &= ~0x1ff; - x |= (ctx.acc.value() & 0xff) ^ 0x80; // 0x7f instead of 0xff for real PDP-8 IO - x |= 0x100; + auto chr = ctx.acc.value() ^ 0x80; + x &= ~TTO_DATA; + x |= (chr << TTO_DATA_SHIFT) & TTO_DATA; + x |= TTO_TX; }; break; case 5: + // Skip if TTO flag is set or TTI flag is set + inst.read_ctlreg = TT_BITS; inst.possibly_redirects = true; - // FIXME this instruction wants to read both TT_OUTPUT and TT_INPUT inst.ef = [](auto &ctx) { - assert(false); + if (ctx.ctlval.value() & (TTI_FLAG | TTO_FLAG)) + ctx.next_pc = (ctx.next_pc & ~07777) | ((ctx.next_pc + 1) & 07777); }; break; case 6: + // Print to TTO and clear TTO flag inst.need_read_acc = true; - inst.read_ctlreg = TT_OUTPUT; - inst.write_ctlreg = TT_OUTPUT; + inst.read_ctlreg = TT_BITS; + inst.write_ctlreg = TT_BITS; inst.ef = [](auto &ctx) { auto &x = ctx.ctlval.value(); - x &= ~0x7ff; - x |= (ctx.acc.value() & 0xff) ^ 0x80; - x |= 0x100; + auto chr = ctx.acc.value() ^ 0x80; + x &= ~TTO_FLAG & ~TTO_FLAG_OLD & ~TTO_DATA; + x |= (chr << TTO_DATA_SHIFT) & TTO_DATA; + x |= TTO_TX; }; break; default: -- cgit v1.2.3