|
|
@ -282,6 +282,16 @@ struct forth
|
|
|
|
auto f_semic = [](auto) { *fth.here++ = 0; fth.compiling = false; };
|
|
|
|
auto f_semic = [](auto) { *fth.here++ = 0; fth.compiling = false; };
|
|
|
|
auto f_comm = [](auto) { fth.sourcei = npos; };
|
|
|
|
auto f_comm = [](auto) { fth.sourcei = npos; };
|
|
|
|
auto f_cell = [](auto) { fth.push(sizeof(cell)); };
|
|
|
|
auto f_cell = [](auto) { fth.push(sizeof(cell)); };
|
|
|
|
|
|
|
|
auto f_jmp = [](auto) {
|
|
|
|
|
|
|
|
auto ptr = ++fth.ip;
|
|
|
|
|
|
|
|
fth.ip = *reinterpret_cast<func **>(ptr) - 1;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
auto f_jmp0 = [](auto) {
|
|
|
|
|
|
|
|
auto ptr = ++fth.ip;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (fth.pop() == 0)
|
|
|
|
|
|
|
|
fth.ip = *reinterpret_cast<func **>(ptr) - 1;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
constexpr static word w_dict {"_d", f_dict};
|
|
|
|
constexpr static word w_dict {"_d", f_dict};
|
|
|
|
constexpr static word w_add {"+", f_add, &w_dict};
|
|
|
|
constexpr static word w_add {"+", f_add, &w_dict};
|
|
|
@ -308,8 +318,10 @@ struct forth
|
|
|
|
constexpr static word w_semic {";", f_semic, &w_colon, word_base::immediate};
|
|
|
|
constexpr static word w_semic {";", f_semic, &w_colon, word_base::immediate};
|
|
|
|
constexpr static word w_comm {"\\", f_comm, &w_semic, word_base::immediate};
|
|
|
|
constexpr static word w_comm {"\\", f_comm, &w_semic, word_base::immediate};
|
|
|
|
constexpr static word w_cell {"cell", f_cell, &w_comm};
|
|
|
|
constexpr static word w_cell {"cell", f_cell, &w_comm};
|
|
|
|
|
|
|
|
constexpr static word w_jmp {"_jmp", f_jmp, &w_cell};
|
|
|
|
|
|
|
|
constexpr static word w_jmp0 {"_jmp0", f_jmp0, &w_jmp};
|
|
|
|
|
|
|
|
|
|
|
|
fth.latest = &w_cell;
|
|
|
|
fth.latest = &w_jmp0;
|
|
|
|
fth.end = end_value;
|
|
|
|
fth.end = end_value;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|