diff options
Diffstat (limited to 'sprit.cpp')
-rw-r--r-- | sprit.cpp | 92 |
1 files changed, 46 insertions, 46 deletions
@@ -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; } |