aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2024-11-26 07:48:52 -0500
committerClyne Sullivan <clyne@bitgloo.com>2024-11-26 07:48:52 -0500
commitb40fba6baf84dcf8b6d4f108418e55f0da7b0730 (patch)
tree2b36518cbd7b544f6d6b62d1831203f67e00e0f2
parent2820ff4559ab29afbd2c948149dc1eadf1632cf2 (diff)
add base
-rw-r--r--core.fth10
-rw-r--r--forth.hpp5
-rw-r--r--main.cpp6
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<error::word_not_found>(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<cell, data_size> dstack;
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, 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<char>(fth->pop()); });
for (auto arg : args) {