|
|
@ -1,5 +1,4 @@
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define NAKED __attribute__((naked))
|
|
|
|
#define NAKED __attribute__((naked))
|
|
|
|
|
|
|
|
|
|
|
@ -50,6 +49,9 @@ struct word_t
|
|
|
|
intptr_t dstack[32];
|
|
|
|
intptr_t dstack[32];
|
|
|
|
intptr_t **rstack[32];
|
|
|
|
intptr_t **rstack[32];
|
|
|
|
intptr_t dict[8192];
|
|
|
|
intptr_t dict[8192];
|
|
|
|
|
|
|
|
struct word_t *latest;
|
|
|
|
|
|
|
|
//char inbuf [ 128];
|
|
|
|
|
|
|
|
//intptr_t inpos;
|
|
|
|
|
|
|
|
|
|
|
|
register intptr_t tmp asm("r12");
|
|
|
|
register intptr_t tmp asm("r12");
|
|
|
|
register intptr_t * sp asm("r13"); // pointer to stack cells
|
|
|
|
register intptr_t * sp asm("r13"); // pointer to stack cells
|
|
|
@ -60,14 +62,14 @@ register intptr_t ** pp asm("r15"); // pointer to ip
|
|
|
|
#define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12")
|
|
|
|
#define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12")
|
|
|
|
|
|
|
|
|
|
|
|
NAKED
|
|
|
|
NAKED
|
|
|
|
void push()
|
|
|
|
void push(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
*--sp = (intptr_t)*++pp;
|
|
|
|
*--sp = (intptr_t)*++pp;
|
|
|
|
NEXT;
|
|
|
|
NEXT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NAKED
|
|
|
|
NAKED
|
|
|
|
void sp_at()
|
|
|
|
void sp_at(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
sp = sp - 1;
|
|
|
|
sp = sp - 1;
|
|
|
|
*sp = (intptr_t)(sp + 1);
|
|
|
|
*sp = (intptr_t)(sp + 1);
|
|
|
@ -75,14 +77,14 @@ void sp_at()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NAKED
|
|
|
|
NAKED
|
|
|
|
void enter()
|
|
|
|
void enter(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
*--rp = ++pp;
|
|
|
|
*--rp = ++pp;
|
|
|
|
pp = (intptr_t **)*pp;
|
|
|
|
pp = (intptr_t **)*pp;
|
|
|
|
goto *(*pp);
|
|
|
|
goto *(*pp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void doexit()
|
|
|
|
void doexit(void)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (rp < END_OF(rstack)) {
|
|
|
|
if (rp < END_OF(rstack)) {
|
|
|
|
pp = *rp++;
|
|
|
|
pp = *rp++;
|
|
|
@ -95,35 +97,26 @@ void doexit()
|
|
|
|
intptr_t state = 0;
|
|
|
|
intptr_t state = 0;
|
|
|
|
intptr_t *here = dict;
|
|
|
|
intptr_t *here = dict;
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void drop() { ++sp; NEXT; }
|
|
|
|
NAKED void drop(void) { ++sp; NEXT; }
|
|
|
|
NAKED void swap() { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; }
|
|
|
|
NAKED void swap(void) { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; }
|
|
|
|
NAKED void add() { sp[1] += sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void add(void) { sp[1] += sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void sub() { sp[1] -= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void sub(void) { sp[1] -= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void mul() { sp[1] *= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void mul(void) { sp[1] *= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void div() { sp[1] /= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void div(void) { sp[1] /= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void mod() { sp[1] %= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void mod(void) { sp[1] %= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void and() { sp[1] &= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void and(void) { sp[1] &= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void or() { sp[1] |= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void or(void) { sp[1] |= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void xor() { sp[1] ^= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void xor(void) { sp[1] ^= sp[0]; ++sp; NEXT; }
|
|
|
|
NAKED void cell() { *--sp = sizeof(*sp); NEXT; }
|
|
|
|
NAKED void peek(void) { *sp = *(intptr_t *)*sp; NEXT; }
|
|
|
|
NAKED void peek() { *sp = *(intptr_t *)*sp; NEXT; }
|
|
|
|
NAKED void poke(void) { *(intptr_t *)sp[0] = sp[1]; sp -= 2; NEXT; }
|
|
|
|
NAKED void poke() { *(intptr_t *)sp[0] = sp[1]; sp -= 2; NEXT; }
|
|
|
|
NAKED void cpeek(void) { *sp = *(char *)*sp; NEXT; }
|
|
|
|
NAKED void cpeek() { *sp = *(char *)*sp; NEXT; }
|
|
|
|
NAKED void cpoke(void) { *(char *)sp[0] = sp[1]; sp -= 2; NEXT; }
|
|
|
|
NAKED void cpoke() { *(char *)sp[0] = sp[1]; sp -= 2; NEXT; }
|
|
|
|
NAKED void comp(void) { state = -1; NEXT; }
|
|
|
|
NAKED void comp() { state = -1; NEXT; }
|
|
|
|
NAKED void intr(void) { state = 0; NEXT; }
|
|
|
|
NAKED void intr() { state = 0; NEXT; }
|
|
|
|
NAKED void comma(void) { *here++ = *sp++; NEXT; }
|
|
|
|
NAKED void dot() { printf("%ld ", *sp++); NEXT; }
|
|
|
|
|
|
|
|
NAKED void comma() { *here++ = *sp++; NEXT; }
|
|
|
|
NAKED void colon(void)
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void align() {
|
|
|
|
|
|
|
|
here = (intptr_t *)(((intptr_t)here + sizeof(intptr_t) - 1)
|
|
|
|
|
|
|
|
& ~(sizeof(intptr_t) - 1));
|
|
|
|
|
|
|
|
NEXT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void colon()
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
extern struct word_t *latest;
|
|
|
|
|
|
|
|
static int ch;
|
|
|
|
static int ch;
|
|
|
|
|
|
|
|
|
|
|
|
tmp = (intptr_t)here++; // body
|
|
|
|
tmp = (intptr_t)here++; // body
|
|
|
@ -131,6 +124,7 @@ NAKED void colon()
|
|
|
|
|
|
|
|
|
|
|
|
STASH;
|
|
|
|
STASH;
|
|
|
|
for (;;) {
|
|
|
|
for (;;) {
|
|
|
|
|
|
|
|
extern int getchar(void);
|
|
|
|
ch = getchar();
|
|
|
|
ch = getchar();
|
|
|
|
|
|
|
|
|
|
|
|
if (ch <= 0x20)
|
|
|
|
if (ch <= 0x20)
|
|
|
@ -150,18 +144,10 @@ NAKED void colon()
|
|
|
|
NEXT;
|
|
|
|
NEXT;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void semic()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
extern struct word_t *latest;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*here++ = (intptr_t)doexit;
|
|
|
|
|
|
|
|
latest = (struct word_t *)*sp++;
|
|
|
|
|
|
|
|
state = 0;
|
|
|
|
|
|
|
|
NEXT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//W(two, "2", &w_dup) LIT(2), FTH(dup), END
|
|
|
|
//W(two, "2", &w_dup) LIT(2), FTH(dup), END
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void dot(void);
|
|
|
|
|
|
|
|
|
|
|
|
W(dup, "dup", 0) sp_at, peek, END
|
|
|
|
W(dup, "dup", 0) sp_at, peek, END
|
|
|
|
N(drop, "drop", &w_dup)
|
|
|
|
N(drop, "drop", &w_dup)
|
|
|
|
N(swap, "swap", &w_drop)
|
|
|
|
N(swap, "swap", &w_drop)
|
|
|
@ -177,68 +163,36 @@ N(mod, "mod", &w_div)
|
|
|
|
N(and, "and", &w_mod)
|
|
|
|
N(and, "and", &w_mod)
|
|
|
|
N(or, "or", &w_and)
|
|
|
|
N(or, "or", &w_and)
|
|
|
|
N(xor, "xor", &w_or)
|
|
|
|
N(xor, "xor", &w_or)
|
|
|
|
N(cell, "cell", &w_xor)
|
|
|
|
W(cell, "cell", &w_xor) LIT(sizeof(*sp)), END
|
|
|
|
W(cellp, "cell+", &w_cell) cell, add, END
|
|
|
|
W(cellp, "cell+", &w_cell) FTH(cell), add, END
|
|
|
|
W(cells, "cells", &w_cellp) cell, mul, END
|
|
|
|
W(cells, "cells", &w_cellp) FTH(cell), mul, END
|
|
|
|
W(dict, "_d", &w_cells) LIT(dict), END
|
|
|
|
W(dict, "_d", &w_cells) LIT(dict), END
|
|
|
|
W(here, "here", &w_dict) LIT(&here), peek, END
|
|
|
|
W(here, "here", &w_dict) LIT(&here), peek, END
|
|
|
|
C(intr, "[", &w_here)
|
|
|
|
W(latest, "latest", &w_here) LIT(&latest), peek, END
|
|
|
|
|
|
|
|
C(intr, "[", &w_latest)
|
|
|
|
N(comp, "]", &w_intr)
|
|
|
|
N(comp, "]", &w_intr)
|
|
|
|
N(dot, ".", &w_comp)
|
|
|
|
N(dot, ".", &w_comp)
|
|
|
|
N(colon, ":", &w_dot)
|
|
|
|
W(negate, "negate", &w_dot) LIT(-1), mul, END
|
|
|
|
C(semic, ";", &w_colon)
|
|
|
|
W(invert, "invert", &w_negate) LIT(-1), xor, END
|
|
|
|
N(align, "align", &w_semic)
|
|
|
|
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(align, "align", &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END
|
|
|
|
N(comma, ",", &w_align)
|
|
|
|
N(comma, ",", &w_align)
|
|
|
|
struct word_t *latest = &w_comma;
|
|
|
|
I(semic, ";", &w_comma) LIT(doexit), comma, LIT(&latest), poke, intr, END
|
|
|
|
|
|
|
|
#define LATEST &w_semic
|
|
|
|
void init()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
sp = END_OF(dstack);
|
|
|
|
|
|
|
|
rp = END_OF(rstack);
|
|
|
|
|
|
|
|
pp = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void dump()
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//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)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pp = ptr;
|
|
|
|
|
|
|
|
((void (*)())*pp)();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//struct word_t
|
|
|
|
|
|
|
|
//{
|
|
|
|
|
|
|
|
// const void **body;
|
|
|
|
|
|
|
|
// struct word_t *prev;
|
|
|
|
|
|
|
|
// unsigned char attr;
|
|
|
|
|
|
|
|
// char name[];
|
|
|
|
|
|
|
|
//} __attribute__ ((packed));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//NAKED void key() { *--sp = getchar(); NEXT; }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NAKED void dot() { printf("%ld ", *sp++); NEXT; }
|
|
|
|
|
|
|
|
|
|
|
|
extern long strtol(char *, char **, int);
|
|
|
|
extern long strtol(char *, char **, int);
|
|
|
|
|
|
|
|
static void call(void *ptr);
|
|
|
|
|
|
|
|
static void dump(void);
|
|
|
|
|
|
|
|
static void init(void);
|
|
|
|
|
|
|
|
|
|
|
|
int base = 10;
|
|
|
|
int base = 10;
|
|
|
|
|
|
|
|
|
|
|
@ -250,7 +204,6 @@ int main()
|
|
|
|
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
for (;;) {
|
|
|
|
//dump();
|
|
|
|
//dump();
|
|
|
|
printf("> ");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
char c;
|
|
|
|
char c;
|
|
|
|
do c = getchar();
|
|
|
|
do c = getchar();
|
|
|
@ -268,7 +221,9 @@ int main()
|
|
|
|
|
|
|
|
|
|
|
|
struct word_t *l;
|
|
|
|
struct word_t *l;
|
|
|
|
for (l = latest; l; l = l->prev) {
|
|
|
|
for (l = latest; l; l = l->prev) {
|
|
|
|
if (strncmp(buf, l->name, l->attr & ATTR_LEN) == 0)
|
|
|
|
const int ln = l->attr & ATTR_LEN;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (s - buf == ln && !strncmp(buf, l->name, ln))
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -304,3 +259,39 @@ int main()
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void init(void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
sp = END_OF(dstack);
|
|
|
|
|
|
|
|
rp = END_OF(rstack);
|
|
|
|
|
|
|
|
pp = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 call(void *ptr)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pp = ptr;
|
|
|
|
|
|
|
|
((void (*)())*pp)();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|