#include "forth.h" void forth_run(void) { here = user_mem; // Hidden words first w_exit = add_primitive("exit", do_exit, 0); w_docolon = add_primitive("docolon", do_docolon, F_HIDDEN); w_lit = add_primitive("lit", do_lit, F_HIDDEN); w_dot_quote_inner = add_primitive("do_dot_quote_inner", do_dot_quote_inner, F_HIDDEN); w_zbranch = add_primitive("0branch", do_zero_branch, F_HIDDEN); w_branch = add_primitive("branch", do_branch, F_HIDDEN); // Public primitives // Stack ops add_primitive("dup", do_dup, 0); add_primitive("drop", do_drop, 0); add_primitive("swap", do_swap, 0); add_primitive("over", do_over, 0); add_primitive("rot", do_rot, 0); add_primitive("-rot", do_minus_rot, 0); add_primitive("nip", do_nip, 0); add_primitive("tuck", do_tuck, 0); // Arithmetic add_primitive("+", do_add, 0); add_primitive("-", do_sub, 0); add_primitive("*", do_mul, 0); add_primitive("/", do_div, 0); add_primitive("mod", do_mod, 0); add_primitive("/mod", do_slash_mod, 0); add_primitive("1+", do_one_plus, 0); add_primitive("1-", do_one_minus, 0); add_primitive("2+", do_two_plus, 0); add_primitive("2-", do_two_minus, 0); add_primitive("negate", do_negate, 0); add_primitive("abs", do_abs, 0); add_primitive("min", do_min, 0); add_primitive("max", do_max, 0); // Logic add_primitive("and", do_and, 0); add_primitive("or", do_or, 0); add_primitive("xor", do_xor, 0); add_primitive("invert", do_invert, 0); add_primitive("lshift", do_lshift, 0); add_primitive("rshift", do_rshift, 0); // Comparison add_primitive("=", do_eq, 0); add_primitive("<>", do_neq, 0); add_primitive("<", do_lt, 0); add_primitive(">", do_gt, 0); add_primitive("<=", do_lte, 0); add_primitive(">=", do_gte, 0); add_primitive("0=", do_zero_eq, 0); add_primitive("0<", do_zero_lt, 0); add_primitive("0>", do_zero_gt, 0); // I/O add_primitive(".", do_dot, 0); add_primitive("cr", do_cr, 0); add_primitive("emit", do_emit, 0); add_primitive("key", do_key, 0); add_primitive(".\"", do_dot_quote, F_IMMEDIATE); // immediate add_primitive("words", do_words, 0); // Memory add_primitive("@", do_fetch, 0); add_primitive("!", do_store, 0); add_primitive("+!", do_plus_store, 0); add_primitive("c@", do_cfetch, 0); add_primitive("c!", do_cstore, 0); add_primitive("variable", do_variable, 0); add_primitive("constant", do_constant, 0); add_primitive("here", do_here, 0); add_primitive("allot", do_allot, 0); add_primitive(",", do_comma, 0); // Return stack add_primitive(">r", do_to_r, 0); add_primitive("r>", do_r_from, 0); add_primitive("r@", do_r_fetch, 0); // Compilation / control flow add_primitive(":", do_colon, 0); add_primitive(";", do_semicolon, F_IMMEDIATE); add_primitive("if", do_if, F_IMMEDIATE); add_primitive("else", do_else, F_IMMEDIATE); add_primitive("then", do_then, F_IMMEDIATE); add_primitive("begin", do_begin, F_IMMEDIATE); add_primitive("until", do_until, F_IMMEDIATE); add_primitive("while", do_while, F_IMMEDIATE); add_primitive("repeat", do_repeat, F_IMMEDIATE); /* Additional words */ add_primitive("depth", do_depth, 0); add_primitive("pick", do_pick, 0); add_primitive("roll", do_roll, 0); add_primitive("?dup", do_qdup, 0); add_primitive("2dup", do_2dup, 0); add_primitive("2drop", do_2drop, 0); add_primitive("2swap", do_2swap, 0); // Start outer interpreter outer_interpreter(); }