aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2025-01-23 21:03:29 -0500
committerClyne Sullivan <clyne@bitgloo.com>2025-01-23 21:03:29 -0500
commitfc05ba93f9d499532dbb5c0bdef6a368fdc98311 (patch)
tree56bc60d8d8ad617a0b40116b08d817525b86f56a
parentb975575ebc64087f0bb4a78338211eca2d921fdd (diff)
more words; better impls
-rw-r--r--main.c225
1 files 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 <stdint.h>
-#include <stdio.h>
#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 <ctype.h>
+#include <stdio.h>
#include <string.h>
+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)();
+}
+