diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2025-01-27 14:13:14 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2025-01-27 14:13:14 -0500 |
commit | be2b73fa7b0da33d96200c4f51b8c3f5f76130c3 (patch) | |
tree | 53cb2fdc520c2f8d55848b2d620c3e2558ede6a9 | |
parent | 614978068704180412b9926e3bc647f730492139 (diff) |
more const; add msp430 PoC
-rw-r--r-- | Makefile | 3 | ||||
-rw-r--r-- | foci.c | 37 | ||||
-rw-r--r-- | foci.h | 40 | ||||
-rw-r--r-- | main.c | 3 | ||||
-rw-r--r-- | msp430/main.c | 52 |
5 files changed, 97 insertions, 38 deletions
@@ -1,5 +1,6 @@ -#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -DFOCI_ARM CC := gcc -DFOCI_X86_64 +#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -DFOCI_ARM +#CC := msp430-elf-gcc -DFOCI_MSP430 -mmcu=msp430g2553 CFLAGS := -O3 -ggdb -g3 -Wall -Wextra all: foci @@ -18,9 +18,9 @@ #define END_OF(arr) ((arr) + (sizeof((arr)) / sizeof(*(arr)))) -static intptr_t dstack[16]; -static intptr_t **rstack[16]; -static intptr_t dict[1000] = { +static intptr_t dstack[8]; +static intptr_t **rstack[8]; +static intptr_t dict[100] = { 0, 10, 0 }; #define state dict[0] @@ -140,8 +140,8 @@ W(colon, ":", &w_align) FTH(here), LIT(0), comma, FTH(latest), comma, 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; } -I(fif, "if", &w_b) LIT(bz), comma, FTH(here), LIT(0), comma, END +N(bz, "_bz", &w_b) { ++pp; if (!*sp++) { pp = (intptr_t **)*pp; } NEXT; } +I(fif, "if", &w_bz) 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 @@ -153,7 +153,7 @@ N(dot, ".", &w_hex) ; N(emit, "emit", &w_dot) { foci_putchar(*sp++); NEXT; } #define LATEST_INIT &w_emit -void enter_forth(void *ptr) +void enter_forth(const void * const ptr) { STASH; sp = saved_sp; @@ -170,19 +170,20 @@ void enter_forth(void *ptr) __attribute__((noinline)) static void dotimpl(intptr_t n) { - static char dotbuf[16]; + static const char dottbl[16] = "0123456789abcdef"; + static char dotbuf[16] = {0}; + int i; - 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) + if (n < 0) { + n *= -1; foci_putchar('-'); - while (*s) - foci_putchar(*s++); + } + + for (i = 0; n > 0; n /= 10) + dotbuf[i++] = dottbl[n % BASE]; + + while (--i >= 0) + foci_putchar(dotbuf[i]); foci_putchar(' '); } @@ -254,7 +255,7 @@ static void parse_word(const char *start, const char *end) void interpret(void) { - static char buf[128]; + static char buf[80]; char *s = buf - 1; do *++s = foci_getchar(); @@ -26,22 +26,22 @@ #define ATTR_LEN (0x3F) #define WORD(name, tname, prev, attr) \ - extern const void *name##_body[]; \ + extern const void * const name##_body[]; \ const struct word_t w_##name = { \ name##_body, prev, attr + sizeof(tname) - 1, tname \ }; \ - const void *name##_body[] = { + const void * const name##_body[] = { #define LIT(x) push, (void *)(x) #define FTH(w) enter, (w##_body) #define END fexit, }; #define NATIVE(name, tname, prev, attr) \ - extern const void *name##_body[]; \ + static const void * const name##_body[2]; \ NAKED void name(void); \ - const struct word_t w_##name = { \ + static const struct word_t w_##name = { \ name##_body, prev, \ (attr | ATTR_NATIVE) + sizeof(tname) - 1, tname \ }; \ - const void *name##_body[] = { name, fexit }; \ + static const void * const name##_body[2] = { name, fexit }; \ NAKED void name(void) #define W(name, tname, prev) WORD(name, tname, prev, 0) @@ -49,36 +49,44 @@ #define N(name, tname, prev) NATIVE(name, tname, prev, 0) #define C(name, tname, prev) NATIVE(name, tname, prev, ATTR_IMMEDIATE) -#define NEXT { goto *(*++pp); } - struct word_t { - const void **body; + const void * const *body; 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("r4"); // pointer to stack cells +register intptr_t *** rp asm("r5"); // stack of pp +register intptr_t ** pp asm("r6"); // pointer to ip +register intptr_t tmp asm("r7"); +#define STASH asm("push {r4-r7}") +#define RESTORE asm("pop {r4-r7}") +#define NEXT goto *(*++pp) #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 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") +#define NEXT goto *(*++pp) #endif // FOCI_X86_64 +#ifdef FOCI_MSP430 +register intptr_t * sp asm("r4"); // pointer to stack cells +register intptr_t *** rp asm("r5"); // stack of pp +register intptr_t ** pp asm("r6"); // pointer to ip +register intptr_t tmp asm("r7"); +#define STASH asm("push r4; push r5; push r6") +#define RESTORE asm("pop r6; pop r5; pop r4") +#define NEXT asm("incd r6;\n br @r6") +#endif // FOCI_MSP430 + extern void foci_putchar(int); extern int foci_getchar(void); @@ -16,10 +16,7 @@ #include "foci.h" -#include <ctype.h> -#include <stdbool.h> #include <stdio.h> -#include <string.h> void foci_putchar(int ch) { diff --git a/msp430/main.c b/msp430/main.c new file mode 100644 index 0000000..5c83c2e --- /dev/null +++ b/msp430/main.c @@ -0,0 +1,52 @@ +#include <msp430.h> + +#define FOCI_MSP430 +#include "../foci.h" + +int main() +{ + WDTCTL = WDTPW | WDTHOLD; + + DCOCTL = 0; + BCSCTL1 = CALBC1_1MHZ; + DCOCTL = CALDCO_1MHZ; + + P1SEL = BIT1 | BIT2; // P1.1 = RXD, P1.2=TXD + P1SEL2 = BIT1 | BIT2; // P1.1 = RXD, P1.2=TXD + UCA0CTL1 |= UCSSEL_2; // SMCLK + UCA0BR0 = 104; // 1MHz 9600 + UCA0BR1 = 0; // 1MHz 9600 + UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1 + UCA0CTL1 &= ~UCSWRST; + + init(); + + foci_putchar('o'); + foci_putchar('k'); + foci_putchar('\n'); + + for (;;) { + interpret(); + foci_putchar('o'); + foci_putchar('k'); + foci_putchar('\n'); + //printf(compiling() ? "compiled <%d>\n" : "ok <%d>\n", depth()); + } +} + +void foci_putchar(int ch) +{ + while (!(IFG2 & UCA0TXIFG)); + UCA0TXBUF = ch; +} + +int foci_getchar(void) +{ + int ch; + + while (!(IFG2 & UCA0RXIFG)); + ch = UCA0RXBUF; + foci_putchar(ch); + return ch; +} + |