]> code.bitgloo.com Git - clyne/foci.git/commitdiff
consting; arch choice; . hex [']
authorClyne Sullivan <clyne@bitgloo.com>
Sun, 26 Jan 2025 13:30:01 +0000 (08:30 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Sun, 26 Jan 2025 13:30:01 +0000 (08:30 -0500)
Makefile
foci.c
foci.h
main.c

index 3408355035b283786b2367dd32bb51d8da5c8778..4a31f2ebb043fd3447aefa82e1abb3bdad23f7ab 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,5 +1,5 @@
-#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb
-CC := gcc
+#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -DFOCI_ARM
+CC := gcc -DFOCI_X86_64
 CFLAGS := -O3 -ggdb -g3 -Wall -Wextra
 
 all: foci
diff --git a/foci.c b/foci.c
index c11f69c281c28912ff477877ab0ed6c9f102735e..6168b35e8ed8625467ce431133d233ae212d8df4 100644 (file)
--- a/foci.c
+++ b/foci.c
 
 #define END_OF(arr) ((arr) + (sizeof((arr)) / sizeof(*(arr))))
 
-static intptr_t dstack[32];
-static intptr_t **rstack[32];
-static intptr_t dict[8192] = {
-    0, 10
+static intptr_t dstack[16];
+static intptr_t **rstack[16];
+static intptr_t dict[1000] = {
+    0, 10, 0
 };
-#define state dict[0]
-#define BASE  dict[1]
-#define begin dict[2]
+#define state  dict[0]
+#define BASE   dict[1]
+#define LATEST dict[2]
+#define begin  dict[3]
 static intptr_t *here = &begin;
-static struct word_t *latest;
 
 static intptr_t     saved_tmp;
 static intptr_t *   saved_sp;
@@ -69,9 +69,9 @@ int compare(const char *a, const char *b, int l)
     return 0;
 }
 
-struct word_t *lookup_p(const char *s, int len)
+const struct word_t *lookup_p(const char *s, int len)
 {
-    for (struct word_t *l = latest; l; l = l->prev) {
+    for (const struct word_t *l = (const struct word_t *)LATEST; l; l = l->prev) {
         if (len == (l->attr & ATTR_LEN) && !compare(s, l->name, len))
             return l;
     }
@@ -82,7 +82,7 @@ struct word_t *lookup_p(const char *s, int len)
 NAKED
 void lookup()
 {
-    static struct word_t *l;
+    static const struct word_t *l;
 
     STASH;
     l = lookup_p((char *)((intptr_t)here + 1), *(char *)here);
@@ -121,7 +121,7 @@ W(dict,   "_d",     &w_cells)   LIT(dict),          END
 W(base,   "base",   &w_dict)    LIT(&BASE), END
 W(here,   "here",   &w_base)    LIT(&here), peek,   END
 W(allot,  "allot",  &w_here)    LIT(&here), FTH(addto), END
-W(latest, "latest", &w_allot)   LIT(&latest), peek, END
+W(latest, "latest", &w_allot)   LIT(&LATEST), peek, END
 W(negate, "negate", &w_latest)  LIT(-1), mul, END
 W(invert, "invert", &w_negate)  LIT(-1), xor, END
 W(dec,    "1-",     &w_invert)  LIT(1), sub,  END
@@ -132,7 +132,7 @@ W(align,  "align",  &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END
 W(colon,  ":",      &w_align)   FTH(here), LIT(0), comma, FTH(latest), comma,
                                 compname, FTH(allot), FTH(align), dup,
                                 FTH(here), swap, poke, comp, END
-I(semic,  ";",      &w_colon)   LIT(fexit), comma, LIT(&latest), poke, intr, END
+I(semic,  ";",      &w_colon)   LIT(fexit), comma, LIT(&LATEST), poke, intr, END
 I(literal, "literal", &w_semic) LIT(push), comma, comma, END
 N(b,      "_b",     &w_literal) { ++pp; pp = (intptr_t **)*pp; NEXT; }
 N(bz,     "_bz",    &w_literal) { ++pp; if (!*sp++) { pp = (intptr_t **)*pp; } NEXT; }
@@ -140,10 +140,12 @@ I(fif,    "if",     &w_b)       LIT(bz), comma, FTH(here), LIT(0), comma, END
 I(then,   "then",   &w_fif)     FTH(here), LIT(sizeof(intptr_t)), sub, swap, poke, END
 I(felse,  "else",   &w_then)    LIT(b), comma, FTH(here), LIT(0), comma, swap, FTH(then), END
 W(tick,   "\'",     &w_felse)   compname, drop, lookup, peek, END
-N(execute, "execute", &w_tick)  { pp = (intptr_t **)*sp++ - 1; NEXT; }
+I(ctick,  "[\']",   &w_tick)    FTH(tick), FTH(literal), END
+N(execute, "execute", &w_ctick) { pp = (intptr_t **)*sp++ - 1; NEXT; }
 W(decimal, "decimal", &w_execute) LIT(10), LIT(&BASE), poke, END
-W(hex,    "hex",    &w_decimal) LIT(16), LIT(&BASE), poke, END
-#define LATEST      &w_hex
+W(hex,     "hex",    &w_decimal) LIT(16), LIT(&BASE), poke, END
+N(dot,    ".",      &w_hex) ;
+#define LATEST_INIT &w_dot
 
 void call(void *ptr)
 {
@@ -151,6 +153,31 @@ void call(void *ptr)
     ((void (*)())*pp)();
 }
 
+NAKED
+void dot()
+{
+    static char dotbuf[16];
+
+    STASH;
+    intptr_t n = *sp;
+    char *s = dotbuf + sizeof(dotbuf);
+    int neg = n < 0;
+    if (neg) n *= -1;
+    *--s = '\0';
+
+    do *--s = "0123456789abcdef"[n % BASE];
+    while (n /= BASE);
+    if (neg)
+        foci_putchar('-');
+    while (*s)
+        foci_putchar(*s++);
+    foci_putchar(' ');
+
+    RESTORE;
+    ++sp;
+    NEXT;
+}
+
 intptr_t parse_number(const char *s, const char **endp, int b)
 {
     intptr_t n = 0;
@@ -176,7 +203,7 @@ intptr_t parse_number(const char *s, const char **endp, int b)
 
 void parse_word(const char *buf, const char *s)
 {
-    struct word_t *l = lookup_p(buf, s - buf);
+    const struct word_t *l = lookup_p(buf, s - buf);
 
     tmp = saved_tmp;
     sp = saved_sp;
@@ -224,7 +251,7 @@ void init(void)
     saved_rp = END_OF(rstack);
     saved_pp = 0;
 
-    latest = LATEST;
+    LATEST = (intptr_t)LATEST_INIT;
 }
 
 int depth(void)
@@ -239,7 +266,7 @@ int compiling(void)
 
 void define(struct word_t *w)
 {
-    w->prev = latest;
-    latest = w;
+    w->prev = (struct word_t *)LATEST;
+    LATEST = (intptr_t)w;
 }
 
diff --git a/foci.h b/foci.h
index 9a87723a11fb5006214571d458c0d1c6aa78b55b..3f745a55196fb6eda4a73124ff74f0fa8f13efa7 100644 (file)
--- a/foci.h
+++ b/foci.h
@@ -27,7 +27,7 @@
 
 #define WORD(name, tname, prev, attr) \
     extern const void *name##_body[]; \
-    struct word_t w_##name = { \
+    const struct word_t w_##name = { \
         name##_body, prev, attr + sizeof(tname) - 1, tname \
     }; \
     const void *name##_body[] = {
@@ -37,7 +37,7 @@
 #define NATIVE(name, tname, prev, attr) \
     extern const void *name##_body[]; \
     NAKED void name(void); \
-    struct word_t w_##name = { \
+    const struct word_t w_##name = { \
         name##_body, prev, \
         (attr | ATTR_NATIVE) + sizeof(tname) - 1, tname \
     }; \
 struct word_t
 {
     const void **body;
-    struct word_t *prev;
+    const struct word_t *prev;
     unsigned char attr;
     char name[];
 } __attribute__ ((packed));
 
+#ifdef FOCI_ARM
 // ARM Cortex-M:
-//register intptr_t *   sp  asm("r0"); // pointer to stack cells
-//register intptr_t *** rp  asm("r1"); // stack of pp
-//register intptr_t **  pp  asm("r2"); // pointer to ip
-//register intptr_t     tmp asm("r8");
-//#define STASH             asm("push {r0-r2,r8}")
-//#define RESTORE           asm("pop {r0-r2,r8}")
+register intptr_t *   sp  asm("r0"); // pointer to stack cells
+register intptr_t *** rp  asm("r1"); // stack of pp
+register intptr_t **  pp  asm("r2"); // pointer to ip
+register intptr_t     tmp asm("r8");
+#define STASH             asm("push {r0-r2,r8}")
+#define RESTORE           asm("pop {r0-r2,r8}")
+#endif // FOCI_ARM
 
+#ifdef FOCI_X86_64
 // x86_64
 register intptr_t *   sp  asm("r12"); // pointer to stack cells
 register intptr_t *** rp  asm("r13"); // stack of pp
@@ -74,6 +77,7 @@ register intptr_t **  pp  asm("r14"); // pointer to ip
 register intptr_t     tmp asm("r15");
 #define STASH             asm("push %r12; push %r13; push %r14")
 #define RESTORE           asm("pop %r14; pop %r13; pop %r12")
+#endif // FOCI_X86_64
 
 extern void foci_putchar(int);
 extern int  foci_getchar(void);
diff --git a/main.c b/main.c
index aae574dc535cd7acd7a0a2071f82a0a098b1ffa3..66dcce359efa10c9b6b675d8928e339ac9b8c158 100644 (file)
--- a/main.c
+++ b/main.c
 #include <stdio.h>
 #include <string.h>
 
-N(dot, ".", 0) {
-    STASH;
-    printf("%ld ", *sp);
-    RESTORE;
-    ++sp;
-    NEXT;
-}
-
 void foci_putchar(int ch)
 {
     putchar(ch);
@@ -44,7 +36,6 @@ int main()
     char buf[128];
 
     init();
-    define(&w_dot);
 
     for (;;) {
         char c;