+#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb
CC := gcc
CFLAGS := -O3 -ggdb -g3 -Wall -Wextra
-all:
- $(CC) $(CFLAGS) -c foci.c
+all: foci
$(CC) $(CFLAGS) main.c foci.o -o main
+
+foci:
+ $(CC) $(CFLAGS) -c foci.c
poke, comp, END
I(semic, ";", &w_colon) LIT(fexit), comma, LIT(&latest), poke, intr, END
I(literal, "literal", &w_semic) LIT(push), comma, comma, END
-#define LATEST &w_literal
+N(b, "_b", &w_literal) { ++pp; pp = (intptr_t **)*pp; NEXT; }
+N(bz, "_bz", &w_literal) { ++pp; if (!*sp++) { pp = (intptr_t **)*pp; } NEXT; }
+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(here), LIT(sizeof(intptr_t)), sub, swap, poke, END
+#define LATEST &w_felse
void call(void *ptr)
{
#define N(name, tname, prev) NATIVE(name, tname, prev, 0)
#define C(name, tname, prev) NATIVE(name, tname, prev, ATTR_IMMEDIATE)
-#define STASH asm("push %r12; push %r13; push %r14; push %r15")
-#define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12")
#define NEXT { goto *(*++pp); }
struct word_t
char name[];
} __attribute__ ((packed));
-register intptr_t tmp asm("r12");
-register intptr_t * sp asm("r13"); // pointer to stack cells
-register intptr_t *** rp asm("r14"); // stack of pp
-register intptr_t ** pp asm("r15"); // pointer to ip
+// 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}")
+
+// x86_64
+register intptr_t * sp asm("r12"); // pointer to stack cells
+register intptr_t *** rp asm("r13"); // stack of pp
+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")
void init(void);
int depth(void);