From b40fba6baf84dcf8b6d4f108418e55f0da7b0730 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Tue, 26 Nov 2024 07:48:52 -0500 Subject: [PATCH] add base --- core.fth | 10 +++++++--- forth.hpp | 5 ++++- main.cpp | 6 +++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/core.fth b/core.fth index 1a6f1dd..ed28e1f 100644 --- a/core.fth +++ b/core.fth @@ -16,6 +16,7 @@ : ip [ _d cell+ cell+ ] literal ; : here dp @ ; : unused [ _d 8 cells + ] literal @ here - ; +: base [ _d 9 cells + ] literal ; : latest [ _d 4 cells + ] literal @ ; \ : dup sp@ @ ; @@ -39,7 +40,10 @@ : 1+ 1 + ; : 1- 1 - ; -: if ['] _jmp0 , here 0 , ; immediate -: then here swap ! ; immediate -: else ['] _jmp , here 0 , swap here swap ! ; immediate +: if ['] _jmp0 , here 0 , ; immediate +: then here swap ! ; immediate +: else ['] _jmp , here 0 , swap here swap ! ; immediate + +: decimal 10 base ! ; +: hex 16 base ! ; diff --git a/forth.hpp b/forth.hpp index a9c55df..4aad263 100644 --- a/forth.hpp +++ b/forth.hpp @@ -172,7 +172,8 @@ struct forth if (auto ent = get(word); !ent) { 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(e == std::errc() && p == word.cend()); @@ -356,6 +357,7 @@ struct forth std::size_t sourcei = npos; cell compiling = false; cell *end = nullptr; + cell base = 10; std::array dstack; std::array 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, compiling) == 7 * sizeof(forth::cell)); static_assert(offsetof(forth, end) == 8 * sizeof(forth::cell)); +static_assert(offsetof(forth, base) == 9 * sizeof(forth::cell)); #endif // SFORTH_HPP diff --git a/main.cpp b/main.cpp index d9cb5c5..2788b49 100644 --- a/main.cpp +++ b/main.cpp @@ -32,7 +32,11 @@ int main(int argc, const char *argv[]) std::span args (argv + 1, argc - 1); 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(fth->pop()); }); for (auto arg : args) {