aboutsummaryrefslogtreecommitdiffstats
path: root/sprit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sprit.cpp')
-rw-r--r--sprit.cpp92
1 files changed, 46 insertions, 46 deletions
diff --git a/sprit.cpp b/sprit.cpp
index 7b36d2f..faab084 100644
--- a/sprit.cpp
+++ b/sprit.cpp
@@ -1,5 +1,5 @@
// sprit-forth: A portable subroutine-threaded Forth.
-// Copyright (C) 2023 Clyne Sullivan <clyne@bitgloo.com>
+// Copyright (C) 2024 Clyne Sullivan <clyne@bitgloo.com>
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Library General Public License as published by
@@ -27,66 +27,66 @@
// TODO:
// sys m* _/ _% _' depth _rdepth _in _ev find _uma u< um/mod
-static void peek() { *sp() = *(Cell *)(*sp()); }
-static void commaSP() { comma(pop()); }
-static void discard() { auto v = pop(); (void)v; }
-static void tobool() { if (*sp()) *sp() = -1; }
+static void peek() { *Forth.sp = *(Cell *)(*Forth.sp); }
+static void commaSP() { comma(Forth.pop()); }
+static void discard() { auto v = Forth.pop(); (void)v; }
+static void tobool() { if (*Forth.sp) *Forth.sp = -1; }
-constinit WordSet words (
- Word("[", WordWrap<[] { STATE = 0; }>).markImmediate(),
- Word("]", WordWrap<[] { STATE = -1; }>),
+constinit std::array words {
+ Word("[", WordWrap<[] { Forth.state = 0; }>).markImmediate(),
+ Word("]", WordWrap<[] { Forth.state = -1; }>),
Word("@", WordWrap<peek>),
- Word("c@", WordWrap<peek, [] { *sp() &= 0xFF; }>),
- Word("!", WordWrap<[] { auto a = (Cell *)pop(); *a = pop(); }>),
- Word("c!", WordWrap<[] { auto a = (char *)pop(); *a = pop(); }>),
- Word("_d", WordWrap<[] { *sp() += (Cell)DICT.data(); }>),
- Word("_jmp", WordWrap<[] { jump((FuncList)*++IP); }>),
+ Word("c@", WordWrap<peek, [] { *Forth.sp &= 0xFF; }>),
+ Word("!", WordWrap<[] { auto a = (Cell *)Forth.pop(); *a = Forth.pop(); }>),
+ Word("c!", WordWrap<[] { auto a = (char *)Forth.pop(); *a = Forth.pop(); }>),
+ Word("_d", WordWrap<[] { *Forth.sp += (Cell)Forth.dictdata(); }>),
+ Word("_jmp", WordWrap<[] { jump((FuncList)*++Exec.ip); }>),
Word("_jmp0", WordWrap<[] {
- ++IP;
- if (pop() == 0)
- jump((FuncList)*IP);
+ ++Exec.ip;
+ if (Forth.pop() == 0)
+ jump((FuncList)*Exec.ip);
}>),
Word(",", WordWrap<commaSP>),
- Word("emit", WordWrap<[] { std::putchar(pop()); }>),
- Word("key", WordWrap<[] { push(key()); }>),
- Word("key?", WordWrap<[] { push(haskey()); }, tobool>),
- Word("execute", WordWrap<[] { (void)executor((FuncList *)pop()); }>),
+ Word("emit", WordWrap<[] { std::putchar(Forth.pop()); }>),
+ Word("key", WordWrap<[] { Forth.push(key()); }>),
+ Word("key?", WordWrap<[] { Forth.push(haskey()); }, tobool>),
+ Word("execute", WordWrap<[] { (void)Exec.executor((FuncList *)Forth.pop()); }>),
Word(":", WordWrap<colon>),
Word(";", WordWrap<semic>).markImmediate(),
Word("exit", fexit),
Word("drop", WordWrap<discard>),
- Word("dup", WordWrap<[] { push(*sp()); }>),
- Word("swap", WordWrap<[] { std::swap(*sp(), *(sp() - 1)); }>),
- Word("pick", WordWrap<[] { auto t = *(sp() - *sp() - 1); *sp() = t; }>),
- Word("cells", WordWrap<[] { *sp() *= sizeof(Cell); }>),
- Word("+", WordWrap<[] { *(sp() - 1) += *sp(); }, discard>),
- Word("-", WordWrap<[] { *(sp() - 1) -= *sp(); }, discard>),
- Word("*", WordWrap<[] { *(sp() - 1) *= *sp(); }, discard>),
- Word("/", WordWrap<[] { *(sp() - 1) /= *sp(); }, discard>),
- Word("mod", WordWrap<[] { *(sp() - 1) %= *sp(); }, discard>),
- Word("=", WordWrap<[] { *(sp() - 1) = *(sp() - 1) == *sp(); }, discard, tobool>),
- Word("<", WordWrap<[] { *(sp() - 1) = *(sp() - 1) < *sp(); }, discard, tobool>),
- Word("or", WordWrap<[] { *(sp() - 1) |= *sp(); }, discard>),
- Word("and", WordWrap<[] { *(sp() - 1) &= *sp(); }, discard>),
- Word("xor", WordWrap<[] { *(sp() - 1) ^= *sp(); }, discard>),
- Word("lshift", WordWrap<[] { *(sp() - 1) <<= *sp(); }, discard>),
- Word("rshift", WordWrap<[] { *(sp() - 1) >>= *sp(); }, discard>),
- Word(">r", WordWrap<[] { rpush(pop()); }>),
- Word("r>", WordWrap<[] { push(rpop()); }>),
- Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>),
- Word("aligned", WordWrap<[] { *sp() = aligned(*sp()); }>),
+ Word("dup", WordWrap<[] { Forth.push(*Forth.sp); }>),
+ Word("swap", WordWrap<[] { std::swap(*Forth.sp, *(Forth.sp - 1)); }>),
+ Word("pick", WordWrap<[] { auto t = *(Forth.sp - *Forth.sp - 1); *Forth.sp = t; }>),
+ Word("cells", WordWrap<[] { *Forth.sp *= sizeof(Cell); }>),
+ Word("+", WordWrap<[] { *(Forth.sp - 1) += *Forth.sp; }, discard>),
+ Word("-", WordWrap<[] { *(Forth.sp - 1) -= *Forth.sp; }, discard>),
+ Word("*", WordWrap<[] { *(Forth.sp - 1) *= *Forth.sp; }, discard>),
+ Word("/", WordWrap<[] { *(Forth.sp - 1) /= *Forth.sp; }, discard>),
+ Word("mod", WordWrap<[] { *(Forth.sp - 1) %= *Forth.sp; }, discard>),
+ Word("=", WordWrap<[] { *(Forth.sp - 1) = *(Forth.sp - 1) == *Forth.sp; }, discard, tobool>),
+ Word("<", WordWrap<[] { *(Forth.sp - 1) = *(Forth.sp - 1) < *Forth.sp; }, discard, tobool>),
+ Word("or", WordWrap<[] { *(Forth.sp - 1) |= *Forth.sp; }, discard>),
+ Word("and", WordWrap<[] { *(Forth.sp - 1) &= *Forth.sp; }, discard>),
+ Word("xor", WordWrap<[] { *(Forth.sp - 1) ^= *Forth.sp; }, discard>),
+ Word("lshift", WordWrap<[] { *(Forth.sp - 1) <<= *Forth.sp; }, discard>),
+ Word("rshift", WordWrap<[] { *(Forth.sp - 1) >>= *Forth.sp; }, discard>),
+ Word(">r", WordWrap<[] { Forth.rpush(Forth.pop()); }>),
+ Word("r>", WordWrap<[] { Forth.push(Forth.rpop()); }>),
+ Word("immediate", WordWrap<[] { Forth.latest->markImmediate(); }>),
+ Word("aligned", WordWrap<[] { *Forth.sp = aligned(*Forth.sp); }>),
Word("align", WordWrap<align>),
- Word("literal", WordWrap<[] { if (STATE) compileliteral(); }>).markImmediate(),
+ Word("literal", WordWrap<[] { if (Forth.state) compileliteral(); }>).markImmediate(),
Word("\'", WordWrap<tick>),
- Word("_i", WordWrap<[] { *sp() = ((Word *)*sp())->immediate(); }, tobool>),
+ Word("_i", WordWrap<[] { *Forth.sp = ((Word *)*Forth.sp)->immediate(); }, tobool>),
Word("[']", WordWrap<tick, compileliteral>).markImmediate(),
Word("compile,", WordWrap<peek, commaSP>),
Word("word", WordWrap<word>),
Word("_b", WordWrap<[] {
std::putchar('#'); // Gives a good breakpoint spot for gdb
}>),
- Word(".", WordWrap<[] { std::cout << pop() << ' '; }>)
-);
+ Word(".", WordWrap<[] { std::cout << Forth.pop() << ' '; }>)
+};
void getinput()
{
@@ -100,13 +100,13 @@ void getinput()
int main()
{
- initialize(words);
+ std::for_each(words.begin(), words.end(), [](Word& w) { Forth.add(w); });
while (std::cin.good()) {
auto result = parse();
if (result == Error::none)
- std::cout << (STATE ? "compiled" : "ok") << std::endl;
+ std::cout << (Forth.state ? "compiled" : "ok") << std::endl;
else
std::cout << "error " << static_cast<int>(result) << std::endl;
}