From 46e43961fd63b82acd9761e037e9e3ea3d880f21 Mon Sep 17 00:00:00 2001 From: Emin Arslan Date: Sun, 3 May 2026 19:40:33 +0300 Subject: [PATCH] feat: add depth, pick, roll, qdup, 2dup, 2drop, 2swap words Co-authored-by: aider (openrouter/deepseek/deepseek-v4-pro) --- forth_words.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/forth_words.c b/forth_words.c index 7f0f560..e3e878d 100644 --- a/forth_words.c +++ b/forth_words.c @@ -722,3 +722,70 @@ void do_repeat(Word* w) { compile_buf[while_offset_idx].num = compile_idx - while_offset_idx; } + +void do_depth(Word* w) { + (void)w; + data_push(data_sp + 1); +} + +void do_pick(Word* w) { + (void)w; + if (data_sp < 0) return; + int64_t idx = data_pop(); + if (idx < 0 || idx > data_sp) return; + int64_t value = data_stack[data_sp - (int32_t)idx]; + data_push(value); +} + +void do_roll(Word* w) { + (void)w; + if (data_sp < 0) return; + int64_t n = data_pop(); + if (n == 0) return; + if (n < 0 || n > data_sp) return; + int64_t i = data_stack[data_sp - (int32_t)n]; + int32_t pos = (int32_t)(data_sp - (int32_t)n); + while (pos < data_sp) { + data_stack[pos] = data_stack[pos + 1]; + pos++; + } + data_stack[data_sp] = i; +} + +void do_qdup(Word* w) { + (void)w; + if (data_sp < 0) return; + int64_t v = data_pop(); + if (v != 0) { + data_push(v); + data_push(v); + } +} + +void do_2dup(Word* w) { + (void)w; + if (data_sp < 1) return; + int64_t b = data_stack[data_sp]; + int64_t a = data_stack[data_sp - 1]; + data_push(a); + data_push(b); +} + +void do_2drop(Word* w) { + (void)w; + data_pop(); + data_pop(); +} + +void do_2swap(Word* w) { + (void)w; + if (data_sp < 3) return; + int64_t d = data_pop(); // x4 + int64_t c = data_pop(); // x3 + int64_t b = data_pop(); // x2 + int64_t a = data_pop(); // x1 + data_push(b); + data_push(a); + data_push(d); + data_push(c); +}