aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2025-01-24 06:31:26 -0500
committerClyne Sullivan <clyne@bitgloo.com>2025-01-24 06:31:26 -0500
commit9f2e4a21f2be3e96788e85b7d7bf7e6b076740e4 (patch)
tree5cd15a8e2be68f459c2177cb86c4144b71a25c11
parentfc05ba93f9d499532dbb5c0bdef6a368fdc98311 (diff)
forth'd : and ;
-rw-r--r--main.c107
1 files changed, 45 insertions, 62 deletions
diff --git a/main.c b/main.c
index 37e3abd..13b62ff 100644
--- a/main.c
+++ b/main.c
@@ -62,21 +62,6 @@ register intptr_t ** pp asm("r15"); // pointer to ip
#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)
{
*--rp = ++pp;
@@ -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 <ctype.h>
#include <stdio.h>
#include <string.h>
-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)
{