]> code.bitgloo.com Git - clyne/foci.git/commitdiff
more words; better impls
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 24 Jan 2025 02:03:29 +0000 (21:03 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 24 Jan 2025 02:03:29 +0000 (21:03 -0500)
main.c

diff --git a/main.c b/main.c
index 63984ba047ed20556d75c60a9584bfc56d60e12b..37e3abd08e16b8e13cc951fb3ce6d5f6e9916a33 100644 (file)
--- 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)();
+}
+