]> code.bitgloo.com Git - clyne/sforth.git/commitdiff
begin double-cell words
authorClyne Sullivan <clyne@bitgloo.com>
Tue, 3 Dec 2024 23:03:37 +0000 (18:03 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Tue, 3 Dec 2024 23:03:37 +0000 (18:03 -0500)
sforth/forth.hpp
sforth/types.hpp

index de87154230dc2f55e85b02d1933987736ba1de2d..6f29be47b8e680f8928f956804b82f87e7e988f3 100644 (file)
@@ -221,6 +221,14 @@ constexpr auto initialize()
         , S{"+"    }, [](auto) { fthp->top() += fthp->pop(); }, 0
         , S{"-"    }, [](auto) { fthp->top() -= fthp->pop(); }, 0
         , S{"*"    }, [](auto) { fthp->top() *= fthp->pop(); }, 0
+        , S{"M*"   }, [](auto) {
+            dcell a = fthp->pop();
+            a *= fthp->pop();
+            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
         , S{"/"    }, [](auto) { fthp->top() /= fthp->pop(); }, 0
         , S{"MOD"  }, [](auto) { fthp->top() %= fthp->pop(); }, 0
         , S{"AND"  }, [](auto) { fthp->top() &= fthp->pop(); }, 0
@@ -322,6 +330,7 @@ constexpr auto initialize()
         , S{"CHAR+" }, S{"1 +" }, 0
         , S{"-ROT"  }, S{"ROT ROT"}, 0
         , S{"2DROP" }, S{"DROP DROP"}, 0
+        , S{"S>D"   }, S{"DUP 0<"}, 0
         , S{"0<"    }, S{"0 <"}, 0
         , S{"0<>"   }, S{"0 <>"}, 0
         , S{"<>"    }, S{"= 0="}, 0
index 57c37c5779b0b17ab46ca26c4c151360220d437b..ade5d4b194f50d88f0249c29e1f34786f188972d 100644 (file)
@@ -29,6 +29,26 @@ using cell = std::intptr_t;
 using addr = std::uintptr_t;
 using func = void (*)(const void *);
 
+#if UINTPTR_MAX == 0xFFFF
+using dcell = std::int32_t;
+#elif UINTPTR_MAX == 0xFFFFFFFF
+using dcell = std::int64_t;
+#elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF
+using dcell = __int128;
+#else
+#error "Cannot figure out size of double-cell integer"
+#endif
+
+#if UINTPTR_MAX == 0xFFFF
+using daddr = std::uint32_t;
+#elif UINTPTR_MAX == 0xFFFFFFFF
+using daddr = std::uint64_t;
+#elif UINTPTR_MAX == 0xFFFFFFFFFFFFFFFF
+using daddr = __uint128;
+#else
+#error "Cannot figure out size of double-address integer"
+#endif
+
 struct word_base;
 
 template<typename T>