feat: switch to 64-bit integers and dynamic memory
Co-authored-by: aider (openrouter/deepseek/deepseek-v4-pro) <aider@aider.chat>
This commit is contained in:
@@ -1,31 +1,39 @@
|
||||
#include "forth.h"
|
||||
|
||||
int main(void) {
|
||||
// Register primitive words
|
||||
// Allocate user memory
|
||||
user_mem_size = 1024 * 1024; // 1 Mega cells
|
||||
user_mem = calloc((size_t)user_mem_size, sizeof(Cell));
|
||||
if (!user_mem) {
|
||||
fprintf(stderr, "Failed to allocate user memory\n");
|
||||
return 1;
|
||||
}
|
||||
here = user_mem;
|
||||
|
||||
// Hidden words first
|
||||
add_primitive("exit", do_exit, 0);
|
||||
add_primitive("docolon", do_docolon, 1 << 6); // Hidden
|
||||
add_primitive("lit", do_lit, 1 << 6); // Hidden
|
||||
add_primitive("do_dot_quote_inner", do_dot_quote_inner, 1 << 6); // Hidden
|
||||
add_primitive("0branch", do_zero_branch, 1 << 6); // Hidden (for IF, UNTIL, WHILE)
|
||||
add_primitive("branch", do_branch, 1 << 6); // Hidden (for ELSE, REPEAT)
|
||||
add_primitive("exit", do_exit, 0);
|
||||
add_primitive("docolon", do_docolon, 1 << 6);
|
||||
add_primitive("lit", do_lit, 1 << 6);
|
||||
add_primitive("do_dot_quote_inner", do_dot_quote_inner, 1 << 6);
|
||||
add_primitive("0branch", do_zero_branch, 1 << 6);
|
||||
add_primitive("branch", do_branch, 1 << 6);
|
||||
|
||||
// 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("minus-rot", do_minus_rot, 0);
|
||||
add_primitive("nip", do_nip, 0);
|
||||
add_primitive("tuck", do_tuck, 0);
|
||||
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("+", 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);
|
||||
@@ -33,23 +41,23 @@ int main(void) {
|
||||
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);
|
||||
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("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_eq, 0);
|
||||
add_primitive("<>", do_neq, 0);
|
||||
add_primitive("<", do_lt, 0);
|
||||
add_primitive(">", do_gt, 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);
|
||||
@@ -57,22 +65,22 @@ int main(void) {
|
||||
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, 1 << 7); // Immediate
|
||||
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, 1 << 7); // immediate
|
||||
add_primitive("words", do_words, 0);
|
||||
|
||||
// Memory
|
||||
add_primitive("@", do_fetch, 0);
|
||||
add_primitive("!", do_store, 0);
|
||||
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("here", do_here, 0);
|
||||
add_primitive("allot", do_allot, 0);
|
||||
|
||||
// Return stack
|
||||
@@ -81,15 +89,15 @@ int main(void) {
|
||||
add_primitive("r@", do_r_fetch, 0);
|
||||
|
||||
// Compilation / control flow
|
||||
add_primitive(":", do_colon, 0);
|
||||
add_primitive(";", do_semicolon, 1 << 7); // Immediate
|
||||
add_primitive("if", do_if, 1 << 7); // Immediate
|
||||
add_primitive("else", do_else, 1 << 7); // Immediate
|
||||
add_primitive("then", do_then, 1 << 7); // Immediate
|
||||
add_primitive("begin", do_begin, 1 << 7); // Immediate
|
||||
add_primitive("until", do_until, 1 << 7); // Immediate
|
||||
add_primitive("while", do_while, 1 << 7); // Immediate
|
||||
add_primitive("repeat", do_repeat, 1 << 7); // Immediate
|
||||
add_primitive(":", do_colon, 0);
|
||||
add_primitive(";", do_semicolon, 1 << 7);
|
||||
add_primitive("if", do_if, 1 << 7);
|
||||
add_primitive("else", do_else, 1 << 7);
|
||||
add_primitive("then", do_then, 1 << 7);
|
||||
add_primitive("begin", do_begin, 1 << 7);
|
||||
add_primitive("until", do_until, 1 << 7);
|
||||
add_primitive("while", do_while, 1 << 7);
|
||||
add_primitive("repeat", do_repeat, 1 << 7);
|
||||
|
||||
// Start outer interpreter
|
||||
outer_interpreter();
|
||||
|
||||
Reference in New Issue
Block a user