From fc05ba93f9d499532dbb5c0bdef6a368fdc98311 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Thu, 23 Jan 2025 21:03:29 -0500 Subject: [PATCH] more words; better impls --- main.c | 225 +++++++++++++++++++++++++++------------------------------ 1 file changed, 108 insertions(+), 117 deletions(-) diff --git a/main.c b/main.c index 63984ba..37e3abd 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ #include -#include #define NAKED __attribute__((naked)) @@ -50,6 +49,9 @@ struct word_t intptr_t dstack[32]; intptr_t **rstack[32]; intptr_t dict[8192]; +struct word_t *latest; +//char inbuf [ 128]; +//intptr_t inpos; register intptr_t tmp asm("r12"); register intptr_t * sp asm("r13"); // pointer to stack cells @@ -60,14 +62,14 @@ register intptr_t ** pp asm("r15"); // pointer to ip #define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12") NAKED -void push() +void push(void) { *--sp = (intptr_t)*++pp; NEXT; } NAKED -void sp_at() +void sp_at(void) { sp = sp - 1; *sp = (intptr_t)(sp + 1); @@ -75,14 +77,14 @@ void sp_at() } NAKED -void enter() +void enter(void) { *--rp = ++pp; pp = (intptr_t **)*pp; goto *(*pp); } -void doexit() +void doexit(void) { if (rp < END_OF(rstack)) { pp = *rp++; @@ -95,35 +97,26 @@ void doexit() intptr_t state = 0; intptr_t *here = dict; -NAKED void drop() { ++sp; NEXT; } -NAKED void swap() { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; } -NAKED void add() { sp[1] += sp[0]; ++sp; NEXT; } -NAKED void sub() { sp[1] -= sp[0]; ++sp; NEXT; } -NAKED void mul() { sp[1] *= sp[0]; ++sp; NEXT; } -NAKED void div() { sp[1] /= sp[0]; ++sp; NEXT; } -NAKED void mod() { sp[1] %= sp[0]; ++sp; NEXT; } -NAKED void and() { sp[1] &= sp[0]; ++sp; NEXT; } -NAKED void or() { sp[1] |= sp[0]; ++sp; NEXT; } -NAKED void xor() { sp[1] ^= sp[0]; ++sp; NEXT; } -NAKED void cell() { *--sp = sizeof(*sp); NEXT; } -NAKED void peek() { *sp = *(intptr_t *)*sp; NEXT; } -NAKED void poke() { *(intptr_t *)sp[0] = sp[1]; sp -= 2; NEXT; } -NAKED void cpeek() { *sp = *(char *)*sp; NEXT; } -NAKED void cpoke() { *(char *)sp[0] = sp[1]; sp -= 2; NEXT; } -NAKED void comp() { state = -1; NEXT; } -NAKED void intr() { state = 0; NEXT; } -NAKED void dot() { printf("%ld ", *sp++); NEXT; } -NAKED void comma() { *here++ = *sp++; NEXT; } - -NAKED void align() { - here = (intptr_t *)(((intptr_t)here + sizeof(intptr_t) - 1) - & ~(sizeof(intptr_t) - 1)); - NEXT; -} - -NAKED void colon() +NAKED void drop(void) { ++sp; NEXT; } +NAKED void swap(void) { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; } +NAKED void add(void) { sp[1] += sp[0]; ++sp; NEXT; } +NAKED void sub(void) { sp[1] -= sp[0]; ++sp; NEXT; } +NAKED void mul(void) { sp[1] *= sp[0]; ++sp; NEXT; } +NAKED void div(void) { sp[1] /= sp[0]; ++sp; NEXT; } +NAKED void mod(void) { sp[1] %= sp[0]; ++sp; NEXT; } +NAKED void and(void) { sp[1] &= sp[0]; ++sp; NEXT; } +NAKED void or(void) { sp[1] |= sp[0]; ++sp; NEXT; } +NAKED void xor(void) { sp[1] ^= sp[0]; ++sp; NEXT; } +NAKED void peek(void) { *sp = *(intptr_t *)*sp; NEXT; } +NAKED void poke(void) { *(intptr_t *)sp[0] = sp[1]; sp -= 2; NEXT; } +NAKED void cpeek(void) { *sp = *(char *)*sp; NEXT; } +NAKED void cpoke(void) { *(char *)sp[0] = sp[1]; sp -= 2; NEXT; } +NAKED void comp(void) { state = -1; NEXT; } +NAKED void intr(void) { state = 0; NEXT; } +NAKED void comma(void) { *here++ = *sp++; NEXT; } + +NAKED void colon(void) { - extern struct word_t *latest; static int ch; tmp = (intptr_t)here++; // body @@ -131,6 +124,7 @@ NAKED void colon() STASH; for (;;) { + extern int getchar(void); ch = getchar(); if (ch <= 0x20) @@ -150,95 +144,55 @@ NAKED void colon() NEXT; } -NAKED void semic() -{ - extern struct word_t *latest; - - *here++ = (intptr_t)doexit; - latest = (struct word_t *)*sp++; - state = 0; - NEXT; -} - //W(two, "2", &w_dup) LIT(2), FTH(dup), END -W(dup, "dup", 0) sp_at, peek, END -N(drop, "drop", &w_dup) -N(swap, "swap", &w_drop) -N(peek, "@", &w_swap) -N(poke, "!", &w_peek) -N(cpeek, "c@", &w_poke) -N(cpoke, "c!", &w_cpeek) -N(add, "+", &w_cpoke) -N(sub, "-", &w_add) -N(mul, "*", &w_sub) -N(div, "/", &w_mul) -N(mod, "mod", &w_div) -N(and, "and", &w_mod) -N(or, "or", &w_and) -N(xor, "xor", &w_or) -N(cell, "cell", &w_xor) -W(cellp, "cell+", &w_cell) cell, add, END -W(cells, "cells", &w_cellp) cell, mul, END -W(dict, "_d", &w_cells) LIT(dict), END -W(here, "here", &w_dict) LIT(&here), peek, END -C(intr, "[", &w_here) -N(comp, "]", &w_intr) -N(dot, ".", &w_comp) -N(colon, ":", &w_dot) -C(semic, ";", &w_colon) -N(align, "align", &w_semic) -N(comma, ",", &w_align) -struct word_t *latest = &w_comma; - -void init() -{ - sp = END_OF(dstack); - rp = END_OF(rstack); - pp = 0; -} - -void dump() -{ - //printf("IP: %ld\n", (intptr_t)pp); - - printf("DS: "); - intptr_t *it = END_OF(dstack) - 1; - while (it >= sp) { - printf("%ld ", *it); - --it; - } - putchar('\n'); - - //printf("RS: "); - //intptr_t ***rt = END_OF(rstack) - 1; - //while (rt >= rp) { - // printf("%ld ", (intptr_t)*rt); - // --rt; - //} - //putchar('\n'); -} - -void call(void *ptr) -{ - pp = ptr; - ((void (*)())*pp)(); -} - -//struct word_t -//{ -// const void **body; -// struct word_t *prev; -// unsigned char attr; -// char name[]; -//} __attribute__ ((packed)); - -//NAKED void key() { *--sp = getchar(); NEXT; } +NAKED void dot(void); + +W(dup, "dup", 0) sp_at, peek, END +N(drop, "drop", &w_dup) +N(swap, "swap", &w_drop) +N(peek, "@", &w_swap) +N(poke, "!", &w_peek) +N(cpeek, "c@", &w_poke) +N(cpoke, "c!", &w_cpeek) +N(add, "+", &w_cpoke) +N(sub, "-", &w_add) +N(mul, "*", &w_sub) +N(div, "/", &w_mul) +N(mod, "mod", &w_div) +N(and, "and", &w_mod) +N(or, "or", &w_and) +N(xor, "xor", &w_or) +W(cell, "cell", &w_xor) LIT(sizeof(*sp)), END +W(cellp, "cell+", &w_cell) FTH(cell), add, END +W(cells, "cells", &w_cellp) FTH(cell), mul, END +W(dict, "_d", &w_cells) LIT(dict), END +W(here, "here", &w_dict) LIT(&here), peek, END +W(latest, "latest", &w_here) LIT(&latest), peek, END +C(intr, "[", &w_latest) +N(comp, "]", &w_intr) +N(dot, ".", &w_comp) +W(negate, "negate", &w_dot) LIT(-1), mul, END +W(invert, "invert", &w_negate) LIT(-1), xor, END +W(dec, "1-", &w_invert) LIT(1), sub, END +W(inc, "1+", &w_dec) LIT(1), add, END +N(colon, ":", &w_inc) +W(aligned, "aligned", &w_colon) LIT(sizeof(*sp) - 1), add, LIT(~(sizeof(*sp) - 1)), and, END +W(align, "align", &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END +N(comma, ",", &w_align) +I(semic, ";", &w_comma) LIT(doexit), comma, LIT(&latest), poke, intr, END +#define LATEST &w_semic #include +#include #include +NAKED void dot() { printf("%ld ", *sp++); NEXT; } + extern long strtol(char *, char **, int); +static void call(void *ptr); +static void dump(void); +static void init(void); int base = 10; @@ -250,7 +204,6 @@ int main() for (;;) { //dump(); - printf("> "); char c; do c = getchar(); @@ -268,7 +221,9 @@ int main() struct word_t *l; for (l = latest; l; l = l->prev) { - if (strncmp(buf, l->name, l->attr & ATTR_LEN) == 0) + const int ln = l->attr & ATTR_LEN; + + if (s - buf == ln && !strncmp(buf, l->name, ln)) break; } @@ -304,3 +259,39 @@ int main() return 0; } +void init(void) +{ + sp = END_OF(dstack); + rp = END_OF(rstack); + pp = 0; + + latest = LATEST; +} + +void dump(void) +{ + //printf("IP: %ld\n", (intptr_t)pp); + + printf("DS: "); + intptr_t *it = END_OF(dstack) - 1; + while (it >= sp) { + printf("%ld ", *it); + --it; + } + putchar('\n'); + + //printf("RS: "); + //intptr_t ***rt = END_OF(rstack) - 1; + //while (rt >= rp) { + // printf("%ld ", (intptr_t)*rt); + // --rt; + //} + //putchar('\n'); +} + +void call(void *ptr) +{ + pp = ptr; + ((void (*)())*pp)(); +} +