main
Clyne 3 weeks ago
parent 2820ff4559
commit b40fba6baf
Signed by: clyne
GPG Key ID: 1B74EE6C49C96795

@ -16,6 +16,7 @@
: ip [ _d cell+ cell+ ] literal ; : ip [ _d cell+ cell+ ] literal ;
: here dp @ ; : here dp @ ;
: unused [ _d 8 cells + ] literal @ here - ; : unused [ _d 8 cells + ] literal @ here - ;
: base [ _d 9 cells + ] literal ;
: latest [ _d 4 cells + ] literal @ ; : latest [ _d 4 cells + ] literal @ ;
\ : dup sp@ @ ; \ : dup sp@ @ ;
@ -39,7 +40,10 @@
: 1+ 1 + ; : 1+ 1 + ;
: 1- 1 - ; : 1- 1 - ;
: if ['] _jmp0 , here 0 , ; immediate : if ['] _jmp0 , here 0 , ; immediate
: then here swap ! ; immediate : then here swap ! ; immediate
: else ['] _jmp , here 0 , swap here swap ! ; immediate : else ['] _jmp , here 0 , swap here swap ! ; immediate
: decimal 10 base ! ;
: hex 16 base ! ;

@ -172,7 +172,8 @@ struct forth
if (auto ent = get(word); !ent) { if (auto ent = get(word); !ent) {
cell n; cell n;
const auto [p, e] = std::from_chars(word.cbegin(), word.cend(), n); const auto [p, e] = std::from_chars(word.cbegin(), word.cend(),
n, base);
assert<error::word_not_found>(e == std::errc() && p == word.cend()); assert<error::word_not_found>(e == std::errc() && p == word.cend());
@ -356,6 +357,7 @@ struct forth
std::size_t sourcei = npos; std::size_t sourcei = npos;
cell compiling = false; cell compiling = false;
cell *end = nullptr; cell *end = nullptr;
cell base = 10;
std::array<cell, data_size> dstack; std::array<cell, data_size> dstack;
std::array<cell, return_size> rstack; std::array<cell, return_size> rstack;
}; };
@ -369,6 +371,7 @@ static_assert(offsetof(forth, source) == 5 * sizeof(forth::cell));
static_assert(offsetof(forth, sourcei) == 6 * sizeof(forth::cell)); static_assert(offsetof(forth, sourcei) == 6 * sizeof(forth::cell));
static_assert(offsetof(forth, compiling) == 7 * sizeof(forth::cell)); static_assert(offsetof(forth, compiling) == 7 * sizeof(forth::cell));
static_assert(offsetof(forth, end) == 8 * sizeof(forth::cell)); static_assert(offsetof(forth, end) == 8 * sizeof(forth::cell));
static_assert(offsetof(forth, base) == 9 * sizeof(forth::cell));
#endif // SFORTH_HPP #endif // SFORTH_HPP

@ -32,7 +32,11 @@ int main(int argc, const char *argv[])
std::span args (argv + 1, argc - 1); std::span args (argv + 1, argc - 1);
forth::initialize<&fth>(dict.end()); forth::initialize<&fth>(dict.end());
fth->add(".", [](auto) { std::cout << fth->pop() << ' '; }); fth->add(".", [](auto) {
char buf[32];
std::to_chars(buf, buf + sizeof(buf), fth->pop(), fth->base);
std::cout << buf << ' ';
});
fth->add("emit", [](auto) { std::cout << static_cast<char>(fth->pop()); }); fth->add("emit", [](auto) { std::cout << static_cast<char>(fth->pop()); });
for (auto arg : args) { for (auto arg : args) {

Loading…
Cancel
Save