From e63c2287afb1681fec0c1101e5aeaaf8f56b4310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Hru=C5=A1ka?= Date: Sat, 13 Nov 2021 18:33:51 +0100 Subject: [PATCH] more stack ops, fix ( in compile mode --- CMakeLists.txt | 1 + forth | Bin 27072 -> 31640 bytes include/fh_stack.h | 28 ++++++++++++ src/fh_builtins.c | 106 ++++++++++++++++++++++++++++++++++++++++++--- src/fh_error.c | 28 ++++++++++++ src/fh_mem.c | 3 +- src/fh_runtime.c | 31 +------------ src/fh_stack.c | 49 +++++++++++++++++++++ 8 files changed, 209 insertions(+), 37 deletions(-) create mode 100644 src/fh_error.c diff --git a/CMakeLists.txt b/CMakeLists.txt index c44851b..c850d4c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ add_executable(forth src/fh_runtime.c src/fh_stack.c src/fh_mem.c + src/fh_error.c ) target_include_directories(forth PRIVATE include) diff --git a/forth b/forth index b4f3a2d26b7c9951bbea6ceb38c2b41f7bbd92e7..ce9449ae009bc374fc735a315ace6cb417eb9026 100755 GIT binary patch literal 31640 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 i++) { + FHPRINT("%d ", fh->data_stack[i]); + } + return FH_OK; +} + static enum fh_error w_s_quote(struct fh_thread_s *fh) { fh_setsubstate(fh, FH_SUBSTATE_SQUOTE); @@ -134,7 +216,6 @@ static enum fh_error w_paren(struct fh_thread_s *fh) static enum fh_error w_bye(struct fh_thread_s *fh) { - LOG("state=SHUTDOWN"); fh_setstate(fh, FH_STATE_SHUTDOWN, 0); return FH_OK; } @@ -153,19 +234,30 @@ enum fh_error register_builtin_words(struct fh_thread_s *fh) {".\"", w_dot_quote, 1}, /* Compiler control words */ {"bye", w_bye, 0}, - /* Basic arithmetics */ + /* Arithmetics */ {"+", w_add, 0}, {"-", w_sub, 0}, {"*", w_mul, 0}, - /* Control words */ - {":", w_colon, 0}, - {";", w_semicolon, 1}, + /* Stack manip */ + {"dup", w_dup, 0}, + {"drop", w_drop, 0}, + {"swap", w_swap, 0}, + {"rot", w_rot, 0}, + {"over", w_over, 0}, + {"tuck", w_tuck, 0}, + {"pick", w_pick, 0}, + {"roll", w_roll, 0}, + /* Printing */ {".", w_dot, 0}, {"type", w_type, 0}, {"cr", w_cr, 0}, {"space", w_space, 0}, - {"\\", w_backslash, 0}, // line comment - {"(", w_paren, 0}, // enclosed comment + {"dump", w_dump, 0}, + /* Control words */ + {":", w_colon, 0}, + {";", w_semicolon, 1}, + {"\\", w_backslash, 1}, // line comment + {"(", w_paren, 1}, // enclosed comment { /* end marker */ } }; diff --git a/src/fh_error.c b/src/fh_error.c new file mode 100644 index 0000000..fddbf3b --- /dev/null +++ b/src/fh_error.c @@ -0,0 +1,28 @@ +#include "fh_error.h" + +/** Error names */ +static const char *errornames[] = { + [FH_OK] = "OK", + [FH_ERR_CS_OVERFLOW] = "CS_OVERFLOW", + [FH_ERR_DS_OVERFLOW] = "DS_OVERFLOW", + [FH_ERR_RS_OVERFLOW] = "RS_OVERFLOW", + [FH_ERR_CS_UNDERFLOW] = "CS_UNDERFLOW", + [FH_ERR_DS_UNDERFLOW] = "DS_UNDERFLOW", + [FH_ERR_RS_UNDERFLOW] = "RS_UNDERFLOW", + [FH_ERR_HEAP_FULL] = "HEAP_FULL", + [FH_ERR_DICT_FULL] = "DICT_FULL", + [FH_ERR_COMPILE_FULL] = "COMPILE_FULL", + [FH_ERR_NAME_TOO_LONG] = "NAME_TOO_LONG", + [FH_ERR_INVALID_STATE] = "INVALID_STATE", + [FH_ERR_INTERNAL] = "INTERNAL", + [FH_ERR_UNKNOWN_WORD] = "UNKNOWN_WORD", +}; + +/** Get error name from code, returns Unknown if not defined */ +const char *fherr_name(enum fh_error e) +{ + if (e >= FH_ERR_MAX) { + return "Unknown"; + } + return errornames[e]; +} diff --git a/src/fh_mem.c b/src/fh_mem.c index 706e193..bca4561 100644 --- a/src/fh_mem.c +++ b/src/fh_mem.c @@ -1,5 +1,6 @@ #include -#include "forth.h" + +#include "fh_error.h" #include "fh_runtime.h" #include "fh_mem.h" diff --git a/src/fh_runtime.c b/src/fh_runtime.c index 6c03b16..15465e3 100644 --- a/src/fh_runtime.c +++ b/src/fh_runtime.c @@ -2,7 +2,7 @@ #include #include -#include "forth.h" +#include "fh_error.h" #include "fh_runtime.h" #include "fh_builtins.h" #include "fh_stack.h" @@ -12,33 +12,6 @@ struct fh_global_s fh_globals = {}; -/** Error names */ -static const char *errornames[] = { - [FH_OK] = "OK", - [FH_ERR_CS_OVERFLOW] = "CS_OVERFLOW", - [FH_ERR_DS_OVERFLOW] = "DS_OVERFLOW", - [FH_ERR_RS_OVERFLOW] = "RS_OVERFLOW", - [FH_ERR_CS_UNDERFLOW] = "CS_UNDERFLOW", - [FH_ERR_DS_UNDERFLOW] = "DS_UNDERFLOW", - [FH_ERR_RS_UNDERFLOW] = "RS_UNDERFLOW", - [FH_ERR_HEAP_FULL] = "HEAP_FULL", - [FH_ERR_DICT_FULL] = "DICT_FULL", - [FH_ERR_COMPILE_FULL] = "COMPILE_FULL", - [FH_ERR_NAME_TOO_LONG] = "NAME_TOO_LONG", - [FH_ERR_INVALID_STATE] = "INVALID_STATE", - [FH_ERR_INTERNAL] = "INTERNAL", - [FH_ERR_UNKNOWN_WORD] = "UNKNOWN_WORD", -}; - -/** Get error name from code, returns Unknown if not defined */ -const char *fherr_name(enum fh_error e) -{ - if (e >= FH_ERR_MAX) { - return "Unknown"; - } - return errornames[e]; -} - /** State names */ static const char *statenames[] = { [FH_STATE_INTERPRET] = "INTERPRET", @@ -46,7 +19,6 @@ static const char *statenames[] = { [FH_STATE_SHUTDOWN] = "SHUTDOWN", }; - /** Sub-state names */ static const char *substatenames[] = { [FH_SUBSTATE_NONE] = "NONE", @@ -92,6 +64,7 @@ void fh_setsubstate(struct fh_thread_s *fh, enum fh_substate substate) showstate(fh); } +/** Execute a user word */ enum fh_error w_user_word(struct fh_thread_s *fh) { enum fh_error rv; diff --git a/src/fh_stack.c b/src/fh_stack.c index aa2de25..d8df4ce 100644 --- a/src/fh_stack.c +++ b/src/fh_stack.c @@ -4,6 +4,55 @@ #include "fh_stack.h" #include "fh_print.h" +enum fh_error ds_roll(struct fh_thread_s *fh, int n) +{ + if (fh->data_stack_top <= n) { + LOG("DS roll UNDERFLOW"); + return FH_ERR_DS_UNDERFLOW; + } + + uint32_t yn = fh->data_stack_top - 1 - n; + uint32_t yoinked = fh->data_stack[yn]; + for (uint32_t i = yn; i < fh->data_stack_top; i++) { + fh->data_stack[i] = fh->data_stack[i+1]; + } + fh->data_stack[fh->data_stack_top - 1] = yoinked; + return FH_OK; +} + +/** Peek top of data stack */ +enum fh_error ds_peek_n(struct fh_thread_s *fh, uint32_t *out, int n) +{ + if (fh->data_stack_top <= n) { + LOG("DS peek_n UNDERFLOW"); + return FH_ERR_DS_UNDERFLOW; + } + *out = fh->data_stack[fh->data_stack_top - 1 - n]; + return FH_OK; +} + +/** Peek top of return stack */ +enum fh_error rs_peek_n(struct fh_thread_s *fh, uint32_t *out, int n) +{ + if (fh->return_stack_top <= n) { + LOG("RS peek_n UNDERFLOW"); + return FH_ERR_RS_UNDERFLOW; + } + *out = fh->return_stack[fh->return_stack_top - 1 - n]; + return FH_OK; +} + +/** Peek top of control stack */ +enum fh_error cs_peek_n(struct fh_thread_s *fh, uint32_t *out, int n) +{ + if (fh->control_stack_top <= n) { + LOG("CS peek_n UNDERFLOW"); + return FH_ERR_CS_UNDERFLOW; + } + *out = fh->control_stack[fh->control_stack_top - 1 - n]; + return FH_OK; +} + /** Pop from data stack */ enum fh_error ds_pop(struct fh_thread_s *fh, uint32_t *out) {