]> code.bitgloo.com Git - clyne/foci.git/commitdiff
forth'd : and ;
authorClyne Sullivan <clyne@bitgloo.com>
Fri, 24 Jan 2025 11:31:26 +0000 (06:31 -0500)
committerClyne Sullivan <clyne@bitgloo.com>
Fri, 24 Jan 2025 11:31:26 +0000 (06:31 -0500)
main.c

diff --git a/main.c b/main.c
index 37e3abd08e16b8e13cc951fb3ce6d5f6e9916a33..13b62ff7caf730d782fc82880306819f3d5c632b 100644 (file)
--- 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 <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)
 {