From 9f2e4a21f2be3e96788e85b7d7bf7e6b076740e4 Mon Sep 17 00:00:00 2001 From: Clyne Sullivan Date: Fri, 24 Jan 2025 06:31:26 -0500 Subject: [PATCH] forth'd : and ; --- main.c | 107 ++++++++++++++++++++++++--------------------------------- 1 file changed, 45 insertions(+), 62 deletions(-) diff --git a/main.c b/main.c index 37e3abd..13b62ff 100644 --- a/main.c +++ b/main.c @@ -61,21 +61,6 @@ register intptr_t ** pp asm("r15"); // pointer to ip #define STASH asm("push %r12; push %r13; push %r14; push %r15") #define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12") -NAKED -void push(void) -{ - *--sp = (intptr_t)*++pp; - NEXT; -} - -NAKED -void sp_at(void) -{ - sp = sp - 1; - *sp = (intptr_t)(sp + 1); - NEXT; -} - NAKED void enter(void) { @@ -90,15 +75,17 @@ void doexit(void) pp = *rp++; NEXT; } - - pp = 0; } intptr_t state = 0; intptr_t *here = dict; -NAKED void drop(void) { ++sp; NEXT; } +NAKED void dot(void); +NAKED void push(void) { *--sp = (intptr_t)*++pp; NEXT; } +NAKED void dup(void) { --sp; sp[0] = sp[1]; NEXT; } +NAKED void drop(void) { ++sp; NEXT; } NAKED void swap(void) { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; } +NAKED void rot(void) { tmp = sp[0]; sp[0] = sp[2]; sp[2] = sp[1]; sp[1] = tmp; NEXT; } NAKED void add(void) { sp[1] += sp[0]; ++sp; NEXT; } NAKED void sub(void) { sp[1] -= sp[0]; ++sp; NEXT; } NAKED void mul(void) { sp[1] *= sp[0]; ++sp; NEXT; } @@ -108,20 +95,17 @@ NAKED void and(void) { sp[1] &= sp[0]; ++sp; NEXT; } NAKED void or(void) { sp[1] |= sp[0]; ++sp; NEXT; } NAKED void xor(void) { sp[1] ^= sp[0]; ++sp; NEXT; } NAKED void peek(void) { *sp = *(intptr_t *)*sp; NEXT; } -NAKED void poke(void) { *(intptr_t *)sp[0] = sp[1]; sp -= 2; NEXT; } +NAKED void poke(void) { *(intptr_t *)sp[0] = sp[1]; sp += 2; NEXT; } NAKED void cpeek(void) { *sp = *(char *)*sp; NEXT; } -NAKED void cpoke(void) { *(char *)sp[0] = sp[1]; sp -= 2; NEXT; } +NAKED void cpoke(void) { *(char *)sp[0] = (char)sp[1]; sp += 2; NEXT; } NAKED void comp(void) { state = -1; NEXT; } NAKED void intr(void) { state = 0; NEXT; } NAKED void comma(void) { *here++ = *sp++; NEXT; } -NAKED void colon(void) +NAKED void compname(void) { static int ch; - tmp = (intptr_t)here++; // body - *here++ = (intptr_t)latest; - STASH; for (;;) { extern int getchar(void); @@ -133,25 +117,17 @@ NAKED void colon(void) *(unsigned char *)here += 1; ((char *)here)[*(unsigned char *)here] = ch; } + here = (intptr_t *)((intptr_t)here + *(unsigned char *)here); RESTORE; - here += *(unsigned char *)here; - here = (intptr_t *)(((intptr_t)here + sizeof(intptr_t) - 1) - & ~(sizeof(intptr_t) - 1)); - *(intptr_t *)tmp = (intptr_t)here; - *--sp = tmp; - state = -1; NEXT; } -//W(two, "2", &w_dup) LIT(2), FTH(dup), END - -NAKED void dot(void); - -W(dup, "dup", 0) sp_at, peek, END +N(dup, "dup", 0) N(drop, "drop", &w_dup) N(swap, "swap", &w_drop) -N(peek, "@", &w_swap) +N(rot, "rot", &w_swap) +N(peek, "@", &w_rot) N(poke, "!", &w_peek) N(cpeek, "c@", &w_poke) N(cpoke, "c!", &w_cpeek) @@ -176,22 +152,29 @@ W(negate, "negate", &w_dot) LIT(-1), mul, END W(invert, "invert", &w_negate) LIT(-1), xor, END W(dec, "1-", &w_invert) LIT(1), sub, END W(inc, "1+", &w_dec) LIT(1), add, END -N(colon, ":", &w_inc) -W(aligned, "aligned", &w_colon) LIT(sizeof(*sp) - 1), add, LIT(~(sizeof(*sp) - 1)), and, END +W(aligned, "aligned", &w_inc) LIT(sizeof(*sp) - 1), add, LIT(~(sizeof(*sp) - 1)), and, END W(align, "align", &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END N(comma, ",", &w_align) -I(semic, ";", &w_comma) LIT(doexit), comma, LIT(&latest), poke, intr, END -#define LATEST &w_semic +W(colon, ":", &w_comma) + FTH(here), LIT(0), comma, FTH(latest), comma, + compname, FTH(align), dup, FTH(here), swap, poke, comp, END +I(semic, ";", &w_colon) LIT(doexit), comma, LIT(&latest), poke, intr, END +#define LATEST &w_semic #include #include #include -NAKED void dot() { printf("%ld ", *sp++); NEXT; } +NAKED void dot() { + STASH; + printf("%ld ", *sp++); + RESTORE; + NEXT; +} extern long strtol(char *, char **, int); static void call(void *ptr); -static void dump(void); +//static void dump(void); static void init(void); int base = 10; @@ -268,26 +251,26 @@ void init(void) latest = LATEST; } -void dump(void) -{ - //printf("IP: %ld\n", (intptr_t)pp); - - printf("DS: "); - intptr_t *it = END_OF(dstack) - 1; - while (it >= sp) { - printf("%ld ", *it); - --it; - } - putchar('\n'); - - //printf("RS: "); - //intptr_t ***rt = END_OF(rstack) - 1; - //while (rt >= rp) { - // printf("%ld ", (intptr_t)*rt); - // --rt; - //} - //putchar('\n'); -} +//void dump(void) +//{ +// //printf("IP: %ld\n", (intptr_t)pp); +// +// printf("DS: "); +// intptr_t *it = END_OF(dstack) - 1; +// while (it >= sp) { +// printf("%ld ", *it); +// --it; +// } +// putchar('\n'); +// +// //printf("RS: "); +// //intptr_t ***rt = END_OF(rstack) - 1; +// //while (rt >= rp) { +// // printf("%ld ", (intptr_t)*rt); +// // --rt; +// //} +// //putchar('\n'); +//} void call(void *ptr) {