diff options
| author | Julian Blake Kongslie | 2022-11-05 13:28:18 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-11-05 13:28:18 -0700 |
| commit | d56d00d239dce6766947149f721b2f051db02e46 (patch) | |
| tree | ebb34bee9fa0f2926961d340e9bb61fbd0b73bbe /isa/decode.cpp | |
| parent | Add a focal69 version of fib as an evt (diff) | |
| download | biggolf-d56d00d239dce6766947149f721b2f051db02e46.tar.xz | |
Stricter and more accurate decoder for RMF instruction
Diffstat (limited to '')
| -rw-r--r-- | isa/decode.cpp | 23 |
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) { |
