Replaced XV with Z to make things uniform + fixed remaining non-valid asm.js.
This commit is contained in:
@ -17,9 +17,9 @@
|
|||||||
Y(rdrop, --rp) \
|
Y(rdrop, --rp) \
|
||||||
XV(forth, "*/", STARSLASH, SSMOD_FUNC; NIP) \
|
XV(forth, "*/", STARSLASH, SSMOD_FUNC; NIP) \
|
||||||
X("*", STAR, tos *= *sp--) \
|
X("*", STAR, tos *= *sp--) \
|
||||||
XV(forth, "/mod", SLASHMOD, DUP; *sp = 1; SSMOD_FUNC) \
|
X("/mod", SLASHMOD, DUP; *sp = 1; SSMOD_FUNC) \
|
||||||
XV(forth, "/", SLASH, DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
X("/", SLASH, DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
||||||
XV(forth, "mod", mod, DUP; *sp = 1; SSMOD_FUNC; DROP) \
|
Y(mod, DUP; *sp = 1; SSMOD_FUNC; DROP) \
|
||||||
Y(invert, tos = ~tos) \
|
Y(invert, tos = ~tos) \
|
||||||
Y(negate, tos = -tos) \
|
Y(negate, tos = -tos) \
|
||||||
X("-", MINUS, tos = (*sp--) - tos) \
|
X("-", MINUS, tos = (*sp--) - tos) \
|
||||||
@ -43,8 +43,8 @@
|
|||||||
X("4/", FOURSLASH, tos = tos >> 2) \
|
X("4/", FOURSLASH, tos = tos >> 2) \
|
||||||
X("+!", PLUSSTORE, *(cell_t *) tos += *sp--; DROP) \
|
X("+!", PLUSSTORE, *(cell_t *) tos += *sp--; DROP) \
|
||||||
X("cell+", CELLPLUS, tos += sizeof(cell_t)) \
|
X("cell+", CELLPLUS, tos += sizeof(cell_t)) \
|
||||||
X("cells", CELLSTAR, tos *= sizeof(cell_t)) \
|
Y(cells, tos *= sizeof(cell_t)) \
|
||||||
XV(forth, "cell/", CELLSLASH, DUP; tos = sizeof(cell_t); DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
X("cell/", CELLSLASH, DUP; tos = sizeof(cell_t); DUP; *sp = 1; SSMOD_FUNC; NIP) \
|
||||||
X("2drop", TWODROP, NIP; DROP) \
|
X("2drop", TWODROP, NIP; DROP) \
|
||||||
X("2dup", TWODUP, DUP; tos = sp[-1]; DUP; tos = sp[-1]) \
|
X("2dup", TWODUP, DUP; tos = sp[-1]; DUP; tos = sp[-1]) \
|
||||||
X("2@", TWOAT, DUP; *sp = *(cell_t *) tos; tos = ((cell_t *) tos)[1]) \
|
X("2@", TWOAT, DUP; *sp = *(cell_t *) tos; tos = ((cell_t *) tos)[1]) \
|
||||||
@ -62,8 +62,8 @@
|
|||||||
Y(allot, g_sys->heap = (cell_t *) (tos + (cell_t) g_sys->heap); DROP) \
|
Y(allot, g_sys->heap = (cell_t *) (tos + (cell_t) g_sys->heap); DROP) \
|
||||||
Y(aligned, tos = CELL_ALIGNED(tos)) \
|
Y(aligned, tos = CELL_ALIGNED(tos)) \
|
||||||
Y(align, g_sys->heap = (cell_t *) CELL_ALIGNED(g_sys->heap)) \
|
Y(align, g_sys->heap = (cell_t *) CELL_ALIGNED(g_sys->heap)) \
|
||||||
XV(forth, ",", COMMA, COMMA(tos); DROP) \
|
X(",", COMMA, COMMA(tos); DROP) \
|
||||||
XV(forth, "c,", CCOMMA, CCOMMA(tos); DROP) \
|
X("c,", CCOMMA, CCOMMA(tos); DROP) \
|
||||||
X(">flags", TOFLAGS, tos = *TOFLAGS(tos)) \
|
X(">flags", TOFLAGS, tos = *TOFLAGS(tos)) \
|
||||||
X(">params", TOPARAMS, tos = *TOPARAMS(tos)) \
|
X(">params", TOPARAMS, tos = *TOPARAMS(tos)) \
|
||||||
X(">size", TOSIZE, tos = TOSIZE(tos)) \
|
X(">size", TOSIZE, tos = TOSIZE(tos)) \
|
||||||
|
|||||||
@ -18,13 +18,13 @@
|
|||||||
|
|
||||||
static cell_t *forth_run(cell_t *init_rp) {
|
static cell_t *forth_run(cell_t *init_rp) {
|
||||||
static const BUILTIN_WORD builtins[] = {
|
static const BUILTIN_WORD builtins[] = {
|
||||||
#define XV(flags, name, op, code) \
|
#define Z(flags, name, op, code) \
|
||||||
name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \
|
name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \
|
||||||
sizeof(name) - 1, (VOC_ ## flags & 0xff), && OP_ ## op,
|
sizeof(name) - 1, (VOC_ ## flags & 0xff), && OP_ ## op,
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
EXTRA_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
0, 0, 0, 0, 0,
|
0, 0, 0, 0, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -36,9 +36,9 @@ static cell_t *forth_run(cell_t *init_rp) {
|
|||||||
register cell_t *ip, *rp, *sp, tos, w;
|
register cell_t *ip, *rp, *sp, tos, w;
|
||||||
register float *fp, ft;
|
register float *fp, ft;
|
||||||
rp = init_rp; UNPARK; NEXT;
|
rp = init_rp; UNPARK; NEXT;
|
||||||
#define XV(flags, name, op, code) OP_ ## op: { code; } NEXT;
|
#define Z(flags, name, op, code) OP_ ## op: { code; } NEXT;
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
EXTRA_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,9 +20,10 @@
|
|||||||
typedef intptr_t cell_t;
|
typedef intptr_t cell_t;
|
||||||
typedef uintptr_t ucell_t;
|
typedef uintptr_t ucell_t;
|
||||||
|
|
||||||
#define YV(flags, op, code) XV(flags, #op, op, code)
|
#define XV(flags, name, op, code) Z(flags, name, op, code)
|
||||||
#define X(name, op, code) XV(forth, name, op, code)
|
#define YV(flags, op, code) Z(flags, #op, op, code)
|
||||||
#define Y(op, code) XV(forth, #op, op, code)
|
#define X(name, op, code) Z(forth, name, op, code)
|
||||||
|
#define Y(op, code) Z(forth, #op, op, code)
|
||||||
|
|
||||||
#define NIP (--sp)
|
#define NIP (--sp)
|
||||||
#define NIPn(n) (sp -= (n))
|
#define NIPn(n) (sp -= (n))
|
||||||
@ -30,10 +31,6 @@ typedef uintptr_t ucell_t;
|
|||||||
#define DROPn(n) (NIPn(n-1), DROP)
|
#define DROPn(n) (NIPn(n-1), DROP)
|
||||||
#define DUP (*++sp = tos)
|
#define DUP (*++sp = tos)
|
||||||
#define PUSH DUP; tos = (cell_t)
|
#define PUSH DUP; tos = (cell_t)
|
||||||
#define COMMA(n) *g_sys->heap++ = (n)
|
|
||||||
#define CCOMMA(n) *(uint8_t *) g_sys->heap = (n); \
|
|
||||||
g_sys->heap = (cell_t *) (1 + ((cell_t) g_sys->heap));
|
|
||||||
#define DOES(ip) **g_sys->current = (cell_t) ADDROF(DODOES); (*g_sys->current)[1] = (cell_t) ip
|
|
||||||
|
|
||||||
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
||||||
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
|
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
|
||||||
@ -48,8 +45,14 @@ typedef uintptr_t ucell_t;
|
|||||||
#define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDROF(DOCREATE) || \
|
#define TOBODY(xt) (((cell_t *) xt) + ((void *) *((cell_t *) xt) == ADDROF(DOCREATE) || \
|
||||||
(void *) *((cell_t *) xt) == ADDROF(DODOES) ? 2 : 1))
|
(void *) *((cell_t *) xt) == ADDROF(DODOES) ? 2 : 1))
|
||||||
|
|
||||||
|
#ifndef COMMA
|
||||||
|
# define COMMA(n) *g_sys->heap++ = (n)
|
||||||
|
# define CCOMMA(n) *(uint8_t *) g_sys->heap = (n); \
|
||||||
|
g_sys->heap = (cell_t *) (1 + ((cell_t) g_sys->heap));
|
||||||
|
# define DOES(ip) **g_sys->current = (cell_t) ADDROF(DODOES); (*g_sys->current)[1] = (cell_t) ip
|
||||||
# define DOIMMEDIATE() *TOFLAGS(*g_sys->current) |= IMMEDIATE
|
# define DOIMMEDIATE() *TOFLAGS(*g_sys->current) |= IMMEDIATE
|
||||||
# define UNSMUDGE() *TOFLAGS(*g_sys->current) &= ~SMUDGE; finish()
|
# define UNSMUDGE() *TOFLAGS(*g_sys->current) &= ~SMUDGE; finish()
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef SSMOD_FUNC
|
#ifndef SSMOD_FUNC
|
||||||
# if __SIZEOF_POINTER__ == 8
|
# if __SIZEOF_POINTER__ == 8
|
||||||
@ -82,17 +85,17 @@ typedef struct {
|
|||||||
X("+", PLUS, tos += *sp--) \
|
X("+", PLUS, tos += *sp--) \
|
||||||
X("U/MOD", USMOD, w = *sp; *sp = (ucell_t) w % (ucell_t) tos; \
|
X("U/MOD", USMOD, w = *sp; *sp = (ucell_t) w % (ucell_t) tos; \
|
||||||
tos = (ucell_t) w / (ucell_t) tos) \
|
tos = (ucell_t) w / (ucell_t) tos) \
|
||||||
XV(forth, "*/MOD", SSMOD, SSMOD_FUNC) \
|
X("*/MOD", SSMOD, SSMOD_FUNC) \
|
||||||
Y(LSHIFT, tos = (*sp << tos); --sp) \
|
Y(LSHIFT, tos = (*sp << tos); --sp) \
|
||||||
Y(RSHIFT, tos = (((ucell_t) *sp) >> tos); --sp) \
|
Y(RSHIFT, tos = (((ucell_t) *sp) >> tos); --sp) \
|
||||||
Y(ARSHIFT, tos = (*sp >> tos); --sp) \
|
Y(ARSHIFT, tos = (*sp >> tos); --sp) \
|
||||||
Y(AND, tos &= *sp--) \
|
Y(AND, tos &= *sp--) \
|
||||||
Y(OR, tos |= *sp--) \
|
Y(OR, tos |= *sp--) \
|
||||||
Y(XOR, tos ^= *sp--) \
|
Y(XOR, tos ^= *sp--) \
|
||||||
XV(forth, "DUP", ALTDUP, DUP) \
|
X("DUP", ALTDUP, DUP) \
|
||||||
Y(SWAP, w = tos; tos = *sp; *sp = w) \
|
Y(SWAP, w = tos; tos = *sp; *sp = w) \
|
||||||
Y(OVER, DUP; tos = sp[-1]) \
|
Y(OVER, DUP; tos = sp[-1]) \
|
||||||
XV(forth, "DROP", ALTDROP, DROP) \
|
X("DROP", ALTDROP, DROP) \
|
||||||
X("@", AT, tos = *(cell_t *) tos) \
|
X("@", AT, tos = *(cell_t *) tos) \
|
||||||
X("SL@", SLAT, tos = *(int32_t *) tos) \
|
X("SL@", SLAT, tos = *(int32_t *) tos) \
|
||||||
X("UL@", ULAT, tos = *(uint32_t *) tos) \
|
X("UL@", ULAT, tos = *(uint32_t *) tos) \
|
||||||
@ -123,7 +126,7 @@ typedef struct {
|
|||||||
YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \
|
YV(internals, DODOES, DUP; tos = w + sizeof(cell_t) * 2; \
|
||||||
++rp; *rp = (cell_t) ip; \
|
++rp; *rp = (cell_t) ip; \
|
||||||
ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t))) \
|
ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t))) \
|
||||||
XV(internals, "ALITERAL", ALITERAL, COMMA(g_sys->DOLIT_XT); COMMA(tos); DROP) \
|
YV(internals, ALITERAL, COMMA(g_sys->DOLIT_XT); COMMA(tos); DROP) \
|
||||||
Y(CELL, DUP; tos = sizeof(cell_t)) \
|
Y(CELL, DUP; tos = sizeof(cell_t)) \
|
||||||
XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \
|
XV(internals, "LONG-SIZE", LONG_SIZE, DUP; tos = sizeof(long)) \
|
||||||
Y(FIND, tos = find((const char *) *sp, tos); --sp) \
|
Y(FIND, tos = find((const char *) *sp, tos); --sp) \
|
||||||
@ -131,17 +134,17 @@ typedef struct {
|
|||||||
XV(internals, "S>NUMBER?", \
|
XV(internals, "S>NUMBER?", \
|
||||||
CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \
|
CONVERT, tos = convert((const char *) *sp, tos, g_sys->base, sp); \
|
||||||
if (!tos) --sp) \
|
if (!tos) --sp) \
|
||||||
XV(forth, "CREATE", CREATE, DUP; DUP; tos = parse(32, sp); \
|
Y(CREATE, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOCREATE)); \
|
||||||
COMMA(0); DROPn(2)) \
|
COMMA(0); DROPn(2)) \
|
||||||
XV(forth, "VARIABLE", VARIABLE, DUP; DUP; tos = parse(32, sp); \
|
Y(VARIABLE, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOVAR)); \
|
||||||
COMMA(0); DROPn(2)) \
|
COMMA(0); DROPn(2)) \
|
||||||
XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
Y(CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
||||||
DROPn(2); COMMA(tos); DROP) \
|
DROPn(2); COMMA(tos); DROP) \
|
||||||
XV(forth, "DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
||||||
XV(forth, "IMMEDIATE", IMMEDIATE, DOIMMEDIATE()) \
|
Y(IMMEDIATE, DOIMMEDIATE()) \
|
||||||
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
||||||
YV(internals, YIELD, PARK; return rp) \
|
YV(internals, YIELD, PARK; return rp) \
|
||||||
X(":", COLON, DUP; DUP; tos = parse(32, sp); \
|
X(":", COLON, DUP; DUP; tos = parse(32, sp); \
|
||||||
|
|||||||
@ -23,16 +23,17 @@
|
|||||||
#define USER_WORDS
|
#define USER_WORDS
|
||||||
#include "builtins.h"
|
#include "builtins.h"
|
||||||
|
|
||||||
#define YV(flags, op, code) XV(flags, #op, op, code)
|
#define XV(flags, name, op, code) Z(flags, name, op, code)
|
||||||
#define X(name, op, code) XV(forth, name, op, code)
|
#define YV(flags, op, code) Z(flags, #op, op, code)
|
||||||
#define Y(op, code) XV(forth, #op, op, code)
|
#define X(name, op, code) Z(forth, name, op, code)
|
||||||
|
#define Y(op, code) Z(forth, #op, op, code)
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
printf("#define PLATFORM_SIMULATED_OPCODE_LIST \\\n");
|
printf("#define PLATFORM_SIMULATED_OPCODE_LIST \\\n");
|
||||||
#define XV(flags, str, name, code) \
|
#define Z(flags, str, name, code) \
|
||||||
printf(" XV(%s, \"%s\", %s, DUP; sp = simulated(sp, STR_%s); DROP) \\\n", #flags, str, #name, #name);
|
printf(" Z(%s, \"%s\", %s, DUP; sp = simulated(sp, STR_%s); DROP) \\\n", #flags, str, #name, #name);
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
printf("\n");
|
printf("\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,9 +28,9 @@ static cell_t *simulated(cell_t *sp, const char *op);
|
|||||||
|
|
||||||
#include "gen/esp32_sim_opcodes.h"
|
#include "gen/esp32_sim_opcodes.h"
|
||||||
|
|
||||||
#define XV(flags, str, name, code) static const char *STR_ ## name = str;
|
#define Z(flags, str, name, code) static const char *STR_ ## name = str;
|
||||||
PLATFORM_SIMULATED_OPCODE_LIST
|
PLATFORM_SIMULATED_OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
|
|
||||||
#define MALLOC_CAP_INTERNAL 0
|
#define MALLOC_CAP_INTERNAL 0
|
||||||
#define heap_caps_get_largest_free_block(x) SIM_HEAP_SIZE
|
#define heap_caps_get_largest_free_block(x) SIM_HEAP_SIZE
|
||||||
|
|||||||
@ -16,6 +16,8 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define JMPW break decode
|
#define JMPW break decode
|
||||||
|
#define SSMOD_FUNC SSMOD_FUNC
|
||||||
|
#define COMMA COMMA
|
||||||
|
|
||||||
#include "common/opcodes.h"
|
#include "common/opcodes.h"
|
||||||
#include "common/floats.h"
|
#include "common/floats.h"
|
||||||
@ -28,10 +30,10 @@
|
|||||||
FLOATING_POINT_LIST
|
FLOATING_POINT_LIST
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
#define XV(flags, name, op, code) OP_ ## op,
|
#define Z(flags, name, op, code) OP_ ## op,
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -49,24 +51,24 @@ enum {
|
|||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
if (argc == 2 && strcmp(argv[1], "cases") == 0) {
|
if (argc == 2 && strcmp(argv[1], "cases") == 0) {
|
||||||
#define XV(flags, name, op, code) \
|
#define Z(flags, name, op, code) \
|
||||||
printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code);
|
printf(" case %d: // %s\n %s; break;\n", OP_ ## op, name, #code);
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
} else if (argc == 2 && strcmp(argv[1], "dict") == 0) {
|
} else if (argc == 2 && strcmp(argv[1], "dict") == 0) {
|
||||||
#define V(name) \
|
#define V(name) \
|
||||||
printf(" create(\"" #name "-builtins\", %d);\n", BUILTIN_FORK, OP_DOCREATE); \
|
printf(" create(\"" #name "-builtins\", %d);\n", BUILTIN_FORK, OP_DOCREATE); \
|
||||||
printf(" comma(%d);\n", VOC_ ## name);
|
printf(" comma(%d);\n", VOC_ ## name);
|
||||||
VOCABULARY_LIST
|
VOCABULARY_LIST
|
||||||
#undef V
|
#undef V
|
||||||
#define XV(flags, name, op, code) \
|
#define Z(flags, name, op, code) \
|
||||||
printf(" builtin(" #name ", %d, %d, %d);\n", \
|
printf(" builtin(" #name ", %d, %d, %d);\n", \
|
||||||
((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \
|
((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, \
|
||||||
(VOC_ ## flags & 0xff), OP_ ## op);
|
(VOC_ ## flags & 0xff), OP_ ## op);
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
} else if (argc == 2 && strcmp(argv[1], "sys") == 0) {
|
} else if (argc == 2 && strcmp(argv[1], "sys") == 0) {
|
||||||
G_SYS *g_sys = 0;
|
G_SYS *g_sys = 0;
|
||||||
#define G_SYS 256
|
#define G_SYS 256
|
||||||
|
|||||||
@ -74,6 +74,7 @@ cases = ReplaceAll(cases, /[*](.)p/, '(i32[$1p>>2]|0)');
|
|||||||
cases = ReplaceAll(cases, 'sp[-1]', '(i32[(sp - 4)>>2]|0)');
|
cases = ReplaceAll(cases, 'sp[-1]', '(i32[(sp - 4)>>2]|0)');
|
||||||
|
|
||||||
cases = ReplaceAll(cases, /([+-]).(.)p/, '$2p = ($2p $1 4) | 0');
|
cases = ReplaceAll(cases, /([+-]).(.)p/, '$2p = ($2p $1 4) | 0');
|
||||||
|
cases = ReplaceAll(cases, 'sp -= (2-1)', 'sp = (sp - 4) | 0');
|
||||||
cases = ReplaceAll(cases, 'sp -= 2', 'sp = (sp - 8) | 0');
|
cases = ReplaceAll(cases, 'sp -= 2', 'sp = (sp - 8) | 0');
|
||||||
cases = ReplaceAll(cases, 'fp -= 2', 'fp = (fp - 8) | 0');
|
cases = ReplaceAll(cases, 'fp -= 2', 'fp = (fp - 8) | 0');
|
||||||
cases = ReplaceAll(cases, 'sizeof(cell_t)', '4');
|
cases = ReplaceAll(cases, 'sizeof(cell_t)', '4');
|
||||||
@ -112,6 +113,7 @@ cases = ReplaceAll(cases, /tos ([^=]?)= /, 'txx $1= ');
|
|||||||
cases = ReplaceAll(cases, ' tos', ' (tos|0)');
|
cases = ReplaceAll(cases, ' tos', ' (tos|0)');
|
||||||
cases = ReplaceAll(cases, /txx ([^=]?)= /, 'tos $1= ');
|
cases = ReplaceAll(cases, /txx ([^=]?)= /, 'tos $1= ');
|
||||||
// Keep Together ^^^
|
// Keep Together ^^^
|
||||||
|
cases = ReplaceAll(cases, 'fp)', 'fp|0)');
|
||||||
cases = ReplaceAll(cases, ' (w>>>0) / (tos>>>0)', ' ((w>>>0) / (tos>>>0))|0');
|
cases = ReplaceAll(cases, ' (w>>>0) / (tos>>>0)', ' ((w>>>0) / (tos>>>0))|0');
|
||||||
cases = ReplaceAll(cases, 'COMMA(tos)', 'COMMA(tos|0)');
|
cases = ReplaceAll(cases, 'COMMA(tos)', 'COMMA(tos|0)');
|
||||||
cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;');
|
cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;');
|
||||||
|
|||||||
@ -207,6 +207,7 @@ function VM(stdlib, foreign, heap) {
|
|||||||
var memset = foreign.memset;
|
var memset = foreign.memset;
|
||||||
var memmove = foreign.memmove;
|
var memmove = foreign.memmove;
|
||||||
var convert = foreign.convert;
|
var convert = foreign.convert;
|
||||||
|
var fconvert = foreign.fconvert;
|
||||||
var evaluate1 = foreign.evaluate1;
|
var evaluate1 = foreign.evaluate1;
|
||||||
var emitlog = foreign.log;
|
var emitlog = foreign.log;
|
||||||
|
|
||||||
@ -264,7 +265,10 @@ var ffi = {
|
|||||||
UNSMUDGE: function() { console.log('unsmudge'); },
|
UNSMUDGE: function() { console.log('unsmudge'); },
|
||||||
parse: function() { console.log('parse'); },
|
parse: function() { console.log('parse'); },
|
||||||
find: function() { console.log('find'); },
|
find: function() { console.log('find'); },
|
||||||
|
memmove: function() { console.log('memmove'); },
|
||||||
|
memset: function() { console.log('memset'); },
|
||||||
convert: function() { console.log('convert'); },
|
convert: function() { console.log('convert'); },
|
||||||
|
fconvert: function() { console.log('fconvert'); },
|
||||||
evaluate1: function() { console.log('evaluate1'); },
|
evaluate1: function() { console.log('evaluate1'); },
|
||||||
log: function(n) { console.log(n); }
|
log: function(n) { console.log(n); }
|
||||||
};
|
};
|
||||||
|
|||||||
@ -17,22 +17,22 @@
|
|||||||
#define ADDROF(x) ((void *) OP_ ## x)
|
#define ADDROF(x) ((void *) OP_ ## x)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
#define XV(flags, name, op, code) OP_ ## op,
|
#define Z(flags, name, op, code) OP_ ## op,
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
EXTRA_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
};
|
};
|
||||||
|
|
||||||
static cell_t *forth_run(cell_t *init_rp) {
|
static cell_t *forth_run(cell_t *init_rp) {
|
||||||
static const BUILTIN_WORD builtins[] = {
|
static const BUILTIN_WORD builtins[] = {
|
||||||
#define XV(flags, name, op, code) \
|
#define Z(flags, name, op, code) \
|
||||||
name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, sizeof(name) - 1, \
|
name, ((VOC_ ## flags >> 8) & 0xff) | BUILTIN_MARK, sizeof(name) - 1, \
|
||||||
(VOC_ ## flags & 0xff), (void *) OP_ ## op,
|
(VOC_ ## flags & 0xff), (void *) OP_ ## op,
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
EXTRA_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
0, 0, 0,
|
0, 0, 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,11 +49,11 @@ next:
|
|||||||
w = *ip++;
|
w = *ip++;
|
||||||
work:
|
work:
|
||||||
switch (*(cell_t *) w & 0xff) {
|
switch (*(cell_t *) w & 0xff) {
|
||||||
#define XV(flags, name, op, code) case OP_ ## op: { code; } NEXT;
|
#define Z(flags, name, op, code) case OP_ ## op: { code; } NEXT;
|
||||||
PLATFORM_OPCODE_LIST
|
PLATFORM_OPCODE_LIST
|
||||||
EXTRA_OPCODE_LIST
|
EXTRA_OPCODE_LIST
|
||||||
OPCODE_LIST
|
OPCODE_LIST
|
||||||
#undef XV
|
#undef Z
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user