summaryrefslogtreecommitdiff
path: root/isa/decode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'isa/decode.cpp')
-rw-r--r--isa/decode.cpp23
1 files changed, 16 insertions, 7 deletions
diff --git a/isa/decode.cpp b/isa/decode.cpp
index 5484234..745e529 100644
--- a/isa/decode.cpp
+++ b/isa/decode.cpp
@@ -288,13 +288,22 @@ instruction_context decode(std::uint_fast32_t flags, unsigned int pc, unsigned i
288 }; 288 };
289 break; 289 break;
290 case 04: 290 case 04:
291 // RMF restore memory field 291 switch (field) {
292 inst.read_ctlreg = FLAGS_SAVED; 292 case 04:
293 inst.write_ctlreg = FLAGS; 293 // RMF restore memory field
294 inst.ef = [flags](auto &ctx) { 294 inst.read_ctlreg = FLAGS_SAVED;
295 ctx.ctlval.value() &= FLAG_DF | FLAG_IF | FLAG_USER_MODE; 295 inst.write_ctlreg = FLAGS;
296 ctx.ctlval.value() |= flags & ~(FLAG_DF | FLAG_IF | FLAG_USER_MODE); 296 inst.ef = [flags](auto &ctx) {
297 }; 297 ctx.ctlval.value() &= FLAG_DF | FLAG_IF | FLAG_USER_MODE;
298 ctx.ctlval.value() |= flags & ~(FLAG_DF | FLAG_IF | FLAG_USER_MODE);
299 };
300 break;
301 default:
302 inst.ef = [bits, field](auto &ctx) {
303 std::cerr << "unimplemented IOT MEMORY suboperation " << (bits & 07) << " upon field " << field << "\n";
304 assert(false);
305 };
306 }
298 break; 307 break;
299 default: 308 default:
300 inst.ef = [bits, field](auto &ctx) { 309 inst.ef = [bits, field](auto &ctx) {