aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2025-01-26 08:30:01 -0500
committerClyne Sullivan <clyne@bitgloo.com>2025-01-26 08:30:01 -0500
commit9307097160390b384907c193aca0d6703ab63516 (patch)
tree5fb1959c5a84bc71d1eca85f20a4c05dd76ee2d4
parent6aad3b0853ba82e6a6a6d5610d8311d132993c4b (diff)
consting; arch choice; . hex [']
-rw-r--r--Makefile4
-rw-r--r--foci.c67
-rw-r--r--foci.h22
-rw-r--r--main.c9
4 files changed, 62 insertions, 40 deletions
diff --git a/Makefile b/Makefile
index 3408355..4a31f2e 100644
--- 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 c11f69c..6168b35 100644
--- a/foci.c
+++ b/foci.c
@@ -18,16 +18,16 @@
#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 9a87723..3f745a5 100644
--- 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 \
}; \
@@ -54,19 +54,22 @@
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 aae574d..66dcce3 100644
--- a/main.c
+++ b/main.c
@@ -21,14 +21,6 @@
#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;