diff --git a/alee.cpp b/alee.cpp index c7c9ddf..bd9c23c 100644 --- a/alee.cpp +++ b/alee.cpp @@ -19,11 +19,15 @@ #include "alee.hpp" #include "memdict.hpp" +#include #include +#include #include #include #include +static void compile(State&); + static bool okay = false; static void readchar(State&); @@ -107,6 +111,9 @@ void user_sys(State& state) case 4: // load load(state); break; + case 5: // compile + compile(state); + break; default: break; } @@ -158,3 +165,37 @@ void parseFile(State& state, std::istream& file) } } +// Prints all compiled words, their start addresses, and their "disassembly". +// Hopefully, it won't be too difficult to translate these into LLVM IR. +void compile(State& state) +{ + auto& dict = state.dict; + + Addr latest = dict.latest(); + Addr attr = 0; + do { + Addr oldlen = attr >> 6; + latest -= oldlen; + + attr = dict.read(latest); + auto lw = Word::fromLength(latest + sizeof(Cell), attr & 0x1F); + + if (!(attr & Dictionary::Immediate)) { + Addr start = dict.getexec(latest); + Addr len = oldlen; + len -= start; + len += latest; + + std::for_each(lw.begin(&dict), lw.end(&dict), putchar); + std::cout << " @ " << start << std::endl; + + for (Addr i = 0; i < len; i += sizeof(Cell)) { + Addr addr = start; + addr += i; + std::cout << '\t' << (Addr)dict.read(addr) << ' '; + } + std::cout << std::endl; + } + } while (latest != Dictionary::Begin); +} +