concise wordwrap

main
Clyne 1 year ago
parent 1c097a3f53
commit 1eefd5f51c
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -9,9 +9,10 @@ all: sprit
msp430: CXX := msp430-elf-g++ msp430: CXX := msp430-elf-g++
msp430: AR := msp430-elf-ar msp430: AR := msp430-elf-ar
msp430: CXXFLAGS += -mmcu=msp430fr2476 -Os #-flto msp430: CXXFLAGS += -mmcu=msp430fr2476 -Os -flto -ffunction-sections -fdata-sections
msp430: LDFLAGS += -L/usr/msp430-elf/usr/include msp430: CXXFLAGS += -L/usr/msp430-elf/usr/include
msp430: sprit msp430: LDFLAGS += -Tmsp430fr2476.ld -Wl,-gc-sections
msp430: source/libsprit.a
x86: CXXFLAGS += -m32 x86: CXXFLAGS += -m32
x86: sprit x86: sprit

@ -30,7 +30,7 @@ void jump(FuncList ip)
// LITERAL's run-time semantics: push the given value onto the stack. // LITERAL's run-time semantics: push the given value onto the stack.
static auto literall = WordWrap<[] { static auto literall = WordWrap<[] {
push((Cell)*++IP); push((Cell)*++IP);
}>(); }>;
void compileliteral() void compileliteral()
{ {

@ -33,7 +33,7 @@ constexpr auto fexit = WordWrap<[] {
extern FuncList IP; extern FuncList IP;
extern Cell rpop(); extern Cell rpop();
IP = reinterpret_cast<FuncList>(rpop()); IP = reinterpret_cast<FuncList>(rpop());
}>(); }>;
void jump(FuncList ip); /** Jumps to the given instruction pointer. */ void jump(FuncList ip); /** Jumps to the given instruction pointer. */
void compileliteral(); /** Compiles LITERAL into the current definition. */ void compileliteral(); /** Compiles LITERAL into the current definition. */

@ -24,6 +24,7 @@
FuncList IP = nullptr; FuncList IP = nullptr;
std::array<Cell, DictSize> DICT; std::array<Cell, DictSize> DICT;
Cell& BASE = DICT[DIdxBase];
Cell& HERE = DICT[DIdxHere]; Cell& HERE = DICT[DIdxHere];
Cell& LATEST = DICT[DIdxLatest]; Cell& LATEST = DICT[DIdxLatest];
Cell& STATE = DICT[DIdxState]; Cell& STATE = DICT[DIdxState];

@ -22,7 +22,7 @@
constexpr Addr DS = 16; /** Data stack size */ constexpr Addr DS = 16; /** Data stack size */
constexpr Addr RS = 16; /** Return stack size */ constexpr Addr RS = 16; /** Return stack size */
constexpr auto DictSize = 4096u; /** Dictionary size */ constexpr auto DictSize = 2048u; /** Dictionary size */
constexpr Addr DIdxBase = 0; constexpr Addr DIdxBase = 0;
constexpr Addr DIdxHere = 1; constexpr Addr DIdxHere = 1;
@ -39,6 +39,7 @@ constexpr Addr DIdxBegin = DIdxInBuf + 80 * sizeof(char);
*/ */
extern std::array<Cell, DictSize> DICT; extern std::array<Cell, DictSize> DICT;
extern Cell& BASE;
extern Cell& HERE; /** Linked to HERE's storage in DICT. */ extern Cell& HERE; /** Linked to HERE's storage in DICT. */
extern Cell& LATEST; /** Linked to LATEST's storage in DICT. */ extern Cell& LATEST; /** Linked to LATEST's storage in DICT. */
extern Cell& STATE; /** Linked to STATE's storage in DICT. */ extern Cell& STATE; /** Linked to STATE's storage in DICT. */

@ -100,13 +100,10 @@ struct WordSet
* and used for a word's definition. * and used for a word's definition.
*/ */
template<auto... funcs> template<auto... funcs>
auto WordWrap = [] { constexpr auto WordWrap = []() noexcept {
constexpr static Func list[1] = { constexpr static auto wrapper = +[] { (funcs(), ...); };
+[] { (funcs(), ...); } return &wrapper;
}; }();
return list;
};
enum class Error : int { enum class Error : int {
none = 1, none = 1,

@ -33,59 +33,59 @@ static void discard() { auto v = pop(); (void)v; }
static void tobool() { if (*sp()) *sp() = -1; } static void tobool() { if (*sp()) *sp() = -1; }
constinit WordSet words ( constinit WordSet words (
Word("[", WordWrap<[] { STATE = 0; }>()).markImmediate(), Word("[", WordWrap<[] { STATE = 0; }>).markImmediate(),
Word("]", WordWrap<[] { STATE = -1; }>()), Word("]", WordWrap<[] { STATE = -1; }>),
Word("@", WordWrap<peek>()), Word("@", WordWrap<peek>),
Word("c@", WordWrap<peek, [] { *sp() &= 0xFF; }>()), Word("c@", WordWrap<peek, [] { *sp() &= 0xFF; }>),
Word("!", WordWrap<[] { auto a = (Cell *)pop(); *a = pop(); }>()), Word("!", WordWrap<[] { auto a = (Cell *)pop(); *a = pop(); }>),
Word("c!", WordWrap<[] { auto a = (char *)pop(); *a = pop(); }>()), Word("c!", WordWrap<[] { auto a = (char *)pop(); *a = pop(); }>),
Word("_d", WordWrap<[] { *sp() += (Cell)DICT.data(); }>()), Word("_d", WordWrap<[] { *sp() += (Cell)DICT.data(); }>),
Word("_jmp", WordWrap<[] { jump((FuncList)*++IP); }>()), Word("_jmp", WordWrap<[] { jump((FuncList)*++IP); }>),
Word("_jmp0", WordWrap<[] { Word("_jmp0", WordWrap<[] {
++IP; ++IP;
if (pop() == 0) if (pop() == 0)
jump((FuncList)*IP); jump((FuncList)*IP);
}>()), }>),
Word(",", WordWrap<commaSP>()), Word(",", WordWrap<commaSP>),
Word("emit", WordWrap<[] { std::putchar(pop()); }>()), Word("emit", WordWrap<[] { std::putchar(pop()); }>),
Word("key", WordWrap<[] { push(key()); }>()), Word("key", WordWrap<[] { push(key()); }>),
Word("key?", WordWrap<[] { push(haskey()); }, tobool>()), Word("key?", WordWrap<[] { push(haskey()); }, tobool>),
Word("execute", WordWrap<[] { (void)executor((FuncList *)pop()); }>()), Word("execute", WordWrap<[] { (void)executor((FuncList *)pop()); }>),
Word(":", WordWrap<colon>()), Word(":", WordWrap<colon>),
Word(";", WordWrap<semic>()).markImmediate(), Word(";", WordWrap<semic>).markImmediate(),
Word("exit", fexit), Word("exit", fexit),
Word("drop", WordWrap<discard>()), Word("drop", WordWrap<discard>),
Word("dup", WordWrap<[] { push(*sp()); }>()), Word("dup", WordWrap<[] { push(*sp()); }>),
Word("swap", WordWrap<[] { std::swap(*sp(), *(sp() - 1)); }>()), Word("swap", WordWrap<[] { std::swap(*sp(), *(sp() - 1)); }>),
Word("pick", WordWrap<[] { auto t = *(sp() - *sp() - 1); *sp() = t; }>()), Word("pick", WordWrap<[] { auto t = *(sp() - *sp() - 1); *sp() = t; }>),
Word("cells", WordWrap<[] { *sp() *= sizeof(Cell); }>()), 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("*", 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("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("<", 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("or", WordWrap<[] { *(sp() - 1) |= *sp(); }, discard>),
Word("and", WordWrap<[] { *(sp() - 1) &= *sp(); }, discard>()), Word("and", WordWrap<[] { *(sp() - 1) &= *sp(); }, discard>),
Word("xor", WordWrap<[] { *(sp() - 1) ^= *sp(); }, discard>()), Word("xor", WordWrap<[] { *(sp() - 1) ^= *sp(); }, discard>),
Word("lshift", WordWrap<[] { *(sp() - 1) <<= *sp(); }, discard>()), Word("lshift", WordWrap<[] { *(sp() - 1) <<= *sp(); }, discard>),
Word("rshift", WordWrap<[] { *(sp() - 1) >>= *sp(); }, discard>()), Word("rshift", WordWrap<[] { *(sp() - 1) >>= *sp(); }, discard>),
Word(">r", WordWrap<[] { rpush(pop()); }>()), Word(">r", WordWrap<[] { rpush(pop()); }>),
Word("r>", WordWrap<[] { push(rpop()); }>()), Word("r>", WordWrap<[] { push(rpop()); }>),
Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>()), Word("immediate", WordWrap<[] { ((Word *)LATEST)->markImmediate(); }>),
Word("aligned", WordWrap<[] { *sp() = aligned(*sp()); }>()), Word("aligned", WordWrap<[] { *sp() = aligned(*sp()); }>),
Word("align", WordWrap<align>()), Word("align", WordWrap<align>),
Word("literal", WordWrap<[] { if (STATE) compileliteral(); }>()).markImmediate(), Word("literal", WordWrap<[] { if (STATE) compileliteral(); }>).markImmediate(),
Word("\'", WordWrap<tick>()), Word("\'", WordWrap<tick>),
Word("_i", WordWrap<[] { *sp() = ((Word *)*sp())->immediate(); }, tobool>()), Word("_i", WordWrap<[] { *sp() = ((Word *)*sp())->immediate(); }, tobool>),
Word("[']", WordWrap<tick, compileliteral>()).markImmediate(), Word("[']", WordWrap<tick, compileliteral>).markImmediate(),
Word("compile,", WordWrap<peek, commaSP>()), Word("compile,", WordWrap<peek, commaSP>),
Word("word", WordWrap<word>()), Word("word", WordWrap<word>),
Word("_b", WordWrap<[] { Word("_b", WordWrap<[] {
std::putchar('#'); // Gives a good breakpoint spot for gdb std::putchar('#'); // Gives a good breakpoint spot for gdb
}>()), }>),
Word(".", WordWrap<[] { std::cout << pop() << ' '; }>()) Word(".", WordWrap<[] { std::cout << pop() << ' '; }>)
); );
void getinput() void getinput()

Loading…
Cancel
Save