diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2025-01-26 08:30:01 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2025-01-26 08:30:01 -0500 |
commit | 9307097160390b384907c193aca0d6703ab63516 (patch) | |
tree | 5fb1959c5a84bc71d1eca85f20a4c05dd76ee2d4 | |
parent | 6aad3b0853ba82e6a6a6d5610d8311d132993c4b (diff) |
consting; arch choice; . hex [']
-rw-r--r-- | Makefile | 4 | ||||
-rw-r--r-- | foci.c | 67 | ||||
-rw-r--r-- | foci.h | 22 | ||||
-rw-r--r-- | main.c | 9 |
4 files changed, 62 insertions, 40 deletions
@@ -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 @@ -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; } @@ -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); @@ -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; |