diff --git a/main.cpp b/main.cpp index b14d9e4..be00744 100644 --- a/main.cpp +++ b/main.cpp @@ -17,6 +17,7 @@ #include "sforth/forth.hpp" #include <array> +#include <charconv> #include <fstream> #include <iostream> #include <span> @@ -24,25 +25,15 @@ constinit static sforth::forth<4096> forth {sforth::initialize<&forth>()}; -static void putu(sforth::addr v) -{ - char buf[32] = {}; - auto ptr = buf + sizeof(buf); - *--ptr = '\0'; - do { - *--ptr = "0123456789abcdefghijklmnopqrstuvwxyz"[v % forth.base]; - } while (v /= forth.base); - std::cout << ptr << ' '; -} - constinit static sforth::native_word<".", [](auto) { - sforth::addr v = forth.pop(); - if (v & (1 << (8 * sizeof(sforth::cell) - 1))) - std::cout << '-'; - putu(v); + char buf[8 * sizeof(sforth::cell) + 1] = {}; + std::to_chars(buf, buf + sizeof(buf), forth.pop(), forth.base); + std::cout << buf << ' '; }> dot; constinit static sforth::native_word<"U.", [](auto) { - putu(forth.pop()); + char buf[8 * sizeof(sforth::cell) + 1] = {}; + std::to_chars(buf, buf + sizeof(buf), std::bit_cast<sforth::addr>(forth.pop()), forth.base); + std::cout << buf << ' '; }, &dot> udot; constinit static sforth::native_word<"EMIT", [](auto) { std::cout << static_cast<char>(forth.pop()); diff --git a/sforth/forth.hpp b/sforth/forth.hpp index effba62..10b86bf 100644 --- a/sforth/forth.hpp +++ b/sforth/forth.hpp @@ -227,11 +227,11 @@ constexpr auto initialize() , S{"M*" }, [](auto) { dcell a = fthp->pop(); a *= fthp->pop(); - fthp->push(a, a >> 8 * sizeof(cell)); }, 0 + fthp->push(a, a >> (8 * sizeof(cell))); }, 0 , S{"UM*" }, [](auto) { daddr a = std::bit_cast<addr>(fthp->pop()); a *= std::bit_cast<addr>(fthp->pop()); - fthp->push(a, a >> 8 * sizeof(addr)); }, 0 + fthp->push(a, a >> (8 * sizeof(addr))); }, 0 , S{"/" }, [](auto) { fthp->top() /= fthp->pop(); }, 0 , S{"MOD" }, [](auto) { fthp->top() %= fthp->pop(); }, 0 , S{"AND" }, [](auto) { fthp->top() &= fthp->pop(); }, 0 @@ -328,6 +328,9 @@ constexpr auto initialize() fthp->sourcei = oldi; }, 0 >::word; constexpr static auto& dict2 = comp_dict<prologue, &dict1 + //, S{"*/MOD" }, S{">R M* R> SM/REM"}, 0 + , S{"*/" }, S{">R M* D>S R> /"}, 0 + , S{"/MOD" }, S{"2DUP MOD -ROT /"}, 0 , S{"RECURSE"}, S{"R> R> DUP >R SWAP >R >XT ,"}, word_base::immediate , S{">XT" }, S{"CELL+ DUP @ 127 AND + CELL+"}, 0 , S{"ALIGN" }, S{"HERE DUP ALIGNED SWAP - ALLOT"}, 0 @@ -362,6 +365,7 @@ constexpr auto initialize() , S{"CHAR+" }, S{"1 +" }, 0 , S{"-ROT" }, S{"ROT ROT"}, 0 , S{"2DROP" }, S{"DROP DROP"}, 0 + , S{"D>S" }, S{"DROP"}, 0 , S{"S>D" }, S{"DUP 0<"}, 0 , S{"0<" }, S{"0 <"}, 0 , S{"0<>" }, S{"0 <>"}, 0