|
|
|
@ -194,20 +194,6 @@ struct forth : public word_list
|
|
|
|
|
std::array<func *, return_size> rstack;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
template<forth **fthp>
|
|
|
|
|
void prologue(const void *bodyf)
|
|
|
|
|
{
|
|
|
|
|
static auto& fth = **fthp;
|
|
|
|
|
|
|
|
|
|
auto body = (func *)bodyf;
|
|
|
|
|
fth.rpush(fth.ip);
|
|
|
|
|
|
|
|
|
|
for (fth.ip = body + 1; *fth.ip; fth.ip++)
|
|
|
|
|
fth.execute(std::bit_cast<func *>(*fth.ip));
|
|
|
|
|
|
|
|
|
|
fth.ip = fth.rpop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template<forth** fthp>
|
|
|
|
|
void initialize(cell *end_value)
|
|
|
|
|
{
|
|
|
|
@ -216,6 +202,16 @@ void initialize(cell *end_value)
|
|
|
|
|
static auto& fth = **fthp;
|
|
|
|
|
static auto _d = std::bit_cast<cell>(*fthp);
|
|
|
|
|
|
|
|
|
|
constexpr static auto prologue = +[](const void *bodyf) {
|
|
|
|
|
auto body = (func *)bodyf;
|
|
|
|
|
fth.rpush(fth.ip);
|
|
|
|
|
|
|
|
|
|
for (fth.ip = body + 1; *fth.ip; fth.ip++)
|
|
|
|
|
fth.execute(std::bit_cast<func *>(*fth.ip));
|
|
|
|
|
|
|
|
|
|
fth.ip = fth.rpop();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
constexpr static func lit_impl = [](auto) {
|
|
|
|
|
auto ptr = std::bit_cast<cell *>(++fth.ip);
|
|
|
|
|
fth.push(*ptr);
|
|
|
|
@ -264,7 +260,7 @@ void initialize(cell *end_value)
|
|
|
|
|
, S{":" }, [](auto) {
|
|
|
|
|
auto w = fth.parse();
|
|
|
|
|
fth.add(w);
|
|
|
|
|
*fth.here++ = std::bit_cast<cell>(&prologue<fthp>);
|
|
|
|
|
*fth.here++ = std::bit_cast<cell>(prologue);
|
|
|
|
|
fth.compiling = true; }, 0
|
|
|
|
|
, S{";" }, [](auto) { *fth.here++ = 0; fth.compiling = false; }, word_base::immediate
|
|
|
|
|
, S{"\\" }, [](auto) { fth.sourcei = forth::npos; }, word_base::immediate
|
|
|
|
@ -284,7 +280,7 @@ void initialize(cell *end_value)
|
|
|
|
|
assert<error::word_not_found>(g.has_value());
|
|
|
|
|
*fth.here++ = std::bit_cast<cell>((*g)->body()); }, word_base::immediate
|
|
|
|
|
>::word;
|
|
|
|
|
constexpr static auto& dict2 = comp_dict<prologue<fthp>, &dict1
|
|
|
|
|
constexpr static auto& dict2 = comp_dict<prologue, &dict1
|
|
|
|
|
, S{"align" }, S{"here dup aligned swap - allot"}, 0
|
|
|
|
|
, S{"aligned"}, S{"cell 1- + cell 1- invert and"}, 0
|
|
|
|
|
, S{"decimal"}, S{"10 base !"}, 0
|
|
|
|
|