From b40fba6baf84dcf8b6d4f108418e55f0da7b0730 Mon Sep 17 00:00:00 2001
From: Clyne Sullivan <clyne@bitgloo.com>
Date: Tue, 26 Nov 2024 07:48:52 -0500
Subject: 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<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) {
-- 
cgit v1.2.3