many fixes and add some missing words
This commit is contained in:
@@ -19,4 +19,17 @@
|
||||
|
||||
#define CELL 4
|
||||
|
||||
#define HEAP_END (HEAP_SIZE - WORDBUF_SIZE - INPUT_BUFFER_SIZE)
|
||||
#define WORDBUF_ADDR HEAP_END
|
||||
#define INPUTBUF_ADDR (HEAP_END + WORDBUF_SIZE)
|
||||
|
||||
// SFR and magic addresses are "negative"
|
||||
#define MAGICADDR_EXEC_INTERACTIVE 0xFFFFFFFFULL
|
||||
#define MAGICADDR_DICTFIRST 0xFFFFd1c7ULL
|
||||
#define MAGICADDR_BASE 0xFFFFBA5EULL
|
||||
#define MAGICADDR_HERE 0xFFFF4E7EULL
|
||||
#define MAGICADDR_STATE 0xFFFF57a7ULL
|
||||
#define MAGICADDR_INPTR 0xFFFFF175ULL
|
||||
#define MAGICADDR_UNRESOLVED 0xFFFFFBADULL
|
||||
|
||||
#endif //FORTH_FH_CONFIG_H
|
||||
|
||||
+1
-1
@@ -25,7 +25,7 @@ enum fh_error {
|
||||
FH_ERR_UNKNOWN_WORD,
|
||||
FH_ERR_ILLEGAL_FETCH,
|
||||
FH_ERR_ILLEGAL_STORE,
|
||||
FH_ERR_DIV_BY_ZERO,
|
||||
FH_ERR_ARITH,
|
||||
FH_ERR_SYNTAX,
|
||||
FH_ERR_NOT_APPLICABLE,
|
||||
FH_ERR_MAX,
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
/**
|
||||
* Helper macros
|
||||
*
|
||||
* Created on 2021/11/17.
|
||||
*/
|
||||
|
||||
#ifndef FORTH_FH_MACROS_H
|
||||
#define FORTH_FH_MACROS_H
|
||||
|
||||
/**
|
||||
* strncasecmp with guard against prefix match
|
||||
*
|
||||
* a - input string
|
||||
* b - example string with terminator
|
||||
* n - len of input string
|
||||
*/
|
||||
#define EQ(a, b, n) (0 == strncasecmp((a), (b), (n)) && (b)[(n)]==0)
|
||||
|
||||
/** Get a value rounded up to multiple of word size */
|
||||
#define WORDALIGNED(var) (((var) + 3) & ~3)
|
||||
|
||||
_Static_assert(WORDALIGNED(0) == 0, "word align");
|
||||
_Static_assert(WORDALIGNED(1) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(2) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(3) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(4) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(5) == 8, "word align");
|
||||
_Static_assert(WORDALIGNED(1023) == 1024, "word align");
|
||||
_Static_assert(WORDALIGNED(1024) == 1024, "word align");
|
||||
|
||||
#define TRY(x) \
|
||||
do { \
|
||||
if (FH_OK != (rv = (x))) return rv; \
|
||||
} while (0)
|
||||
|
||||
#endif //FORTH_FH_MACROS_H
|
||||
+6
-3
@@ -7,15 +7,18 @@
|
||||
#ifndef FORTH_FH_PARSE_H
|
||||
#define FORTH_FH_PARSE_H
|
||||
|
||||
typedef bool (*chartest_t)(char c, void* param);
|
||||
typedef bool (*chartest_t)(char c, void *param);
|
||||
|
||||
void fh_input_consume_matching(struct fh_thread_s *fh, chartest_t test, void* param);
|
||||
void fh_input_consume_matching(struct fh_thread_s *fh, chartest_t test, void *param);
|
||||
|
||||
void fh_input_consume_spaces(struct fh_thread_s *fh);
|
||||
|
||||
enum fh_error fh_input_read_delimited(struct fh_thread_s *fh, char **out, size_t *len, chartest_t test, void* param);
|
||||
enum fh_error fh_input_read_delimited(struct fh_thread_s *fh, char **out, size_t *len, chartest_t test, void *param);
|
||||
|
||||
enum fh_error fh_input_read_word(struct fh_thread_s *fh, char **out, size_t *len);
|
||||
|
||||
enum fh_error fh_input_read_quotedstring(struct fh_thread_s *fh, bool escaped, char *outbuf, size_t capacity, size_t *out_len);
|
||||
|
||||
enum fh_error fh_handle_ascii_word(struct fh_thread_s *fh, const char *name, size_t wordlen);
|
||||
|
||||
#endif //FORTH_FH_PARSE_H
|
||||
|
||||
@@ -7,11 +7,6 @@
|
||||
#ifndef FORTH_FH_PRINT_H
|
||||
#define FORTH_FH_PRINT_H
|
||||
|
||||
/* for printing */
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "fh_globals.h"
|
||||
|
||||
/* logging */
|
||||
#define LOG(format, ...) do { if(fh_globals.verbose) { fprintf(stderr, format "\n", ##__VA_ARGS__); } } while (0)
|
||||
#define LOGI(format, ...) fprintf(stderr, "\x1b[32m" format "\x1b[m\n", ##__VA_ARGS__)
|
||||
|
||||
+10
-40
@@ -78,12 +78,6 @@ struct fh_instruction_s {
|
||||
uint32_t data;
|
||||
};
|
||||
|
||||
static inline void instr_init(struct fh_instruction_s *instr, enum fh_instruction_kind kind, uint32_t data)
|
||||
{
|
||||
instr->kind = kind;
|
||||
instr->data = data;
|
||||
}
|
||||
|
||||
#define INSTR_SIZE (sizeof(struct fh_instruction_s))
|
||||
|
||||
_Static_assert(sizeof(struct fh_instruction_s) % 4 == 0, "Instruction struct is aligned");
|
||||
@@ -107,9 +101,12 @@ enum fh_substate {
|
||||
FH_SUBSTATE_PAREN_COMMENT,
|
||||
FH_SUBSTATE_LINE_COMMENT,
|
||||
FH_SUBSTATE_EXIT,
|
||||
FH_SUBSTATE_SKIP_IF,
|
||||
FH_SUBSTATE_MAX,
|
||||
};
|
||||
|
||||
extern const char *substatenames[FH_SUBSTATE_MAX];
|
||||
|
||||
/** Marks a dictionary entry that is a word */
|
||||
#define WORDFLAG_WORD 0x01
|
||||
/** Indicates that this is a built-in instruction and not a word call */
|
||||
@@ -147,11 +144,8 @@ struct fh_word_s {
|
||||
|
||||
/** Word name */
|
||||
char name[MAX_NAME_LEN]; // XXX this wastes RAM!
|
||||
|
||||
|
||||
};
|
||||
|
||||
#define MAGICADDR_DICTFIRST 0xFFFFFFFFULL
|
||||
#define DICTWORD_SIZE sizeof(struct fh_word_s)
|
||||
|
||||
/**
|
||||
@@ -201,11 +195,10 @@ struct fh_thread_s {
|
||||
|
||||
/** Loop variable J */
|
||||
uint32_t loop_j;
|
||||
};
|
||||
|
||||
#define HEAP_END (HEAP_SIZE - WORDBUF_SIZE - INPUT_BUFFER_SIZE)
|
||||
#define WORDBUF_ADDR HEAP_END
|
||||
#define INPUTBUF_ADDR (HEAP_END + WORDBUF_SIZE)
|
||||
/** Nesting level of [if] */
|
||||
uint32_t parse_if_level;
|
||||
};
|
||||
|
||||
enum fh_error fh_loop_nest(struct fh_thread_s *fh, uint32_t indexvalue);
|
||||
|
||||
@@ -232,33 +225,6 @@ enum fh_error fh_see_word(
|
||||
size_t wordlen
|
||||
);
|
||||
|
||||
/* if the return address is this, we should drop back to interactive mode */
|
||||
|
||||
// SFR and magic addresses are "negative"
|
||||
#define MAGICADDR_EXEC_INTERACTIVE 0xFFFFFFFFULL
|
||||
|
||||
#define MAGICADDR_BASE 0xFFFFBA5EULL
|
||||
#define MAGICADDR_HERE 0xFFFF4E7EULL
|
||||
#define MAGICADDR_INPTR 0xFFFFF111ULL
|
||||
#define MAGICADDR_UNRESOLVED 0xFFFFFBADULL
|
||||
|
||||
/** Get a value rounded up to multiple of word size */
|
||||
#define WORDALIGNED(var) (((var) + 3) & ~3)
|
||||
|
||||
_Static_assert(WORDALIGNED(0) == 0, "word align");
|
||||
_Static_assert(WORDALIGNED(1) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(2) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(3) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(4) == 4, "word align");
|
||||
_Static_assert(WORDALIGNED(5) == 8, "word align");
|
||||
_Static_assert(WORDALIGNED(1023) == 1024, "word align");
|
||||
_Static_assert(WORDALIGNED(1024) == 1024, "word align");
|
||||
|
||||
#define TRY(x) \
|
||||
do { \
|
||||
if (FH_OK != (rv = (x))) return rv; \
|
||||
} while (0)
|
||||
|
||||
/**
|
||||
* Execute a dictionary word from a definition stored at the given address
|
||||
* @param fh
|
||||
@@ -278,4 +244,8 @@ enum fh_error fh_handle_word(struct fh_thread_s *fh, uint32_t addr);
|
||||
*/
|
||||
enum fh_error fh_find_word(struct fh_thread_s *fh, const char *name, size_t wordlen, uint32_t *addr_out);
|
||||
|
||||
enum fh_error fh_init(struct fh_thread_s *fh);
|
||||
|
||||
enum fh_error fh_process_line(struct fh_thread_s *fh, const char *linebuf, size_t len);
|
||||
|
||||
#endif //FORTH_FH_RUNTIME_H
|
||||
|
||||
@@ -18,6 +18,9 @@ static inline enum fh_error cs_peek_n(struct fh_thread_s *fh, uint32_t *out, int
|
||||
return ds_peek_n(fh, out, n);
|
||||
}
|
||||
|
||||
enum fh_error ds_push_dw(struct fh_thread_s *fh, uint64_t in);
|
||||
enum fh_error ds_pop_dw(struct fh_thread_s *fh, uint64_t *out);
|
||||
|
||||
enum fh_error rs_poke_n(struct fh_thread_s *fh, uint32_t value, int n);
|
||||
|
||||
/** Peek top of data stack */
|
||||
|
||||
+3
-5
@@ -13,10 +13,8 @@
|
||||
|
||||
#include "fh_config.h"
|
||||
#include "fh_error.h"
|
||||
|
||||
struct fh_thread_s;
|
||||
|
||||
enum fh_error fh_init(struct fh_thread_s *fh);
|
||||
enum fh_error fh_process_line(struct fh_thread_s *fh, const char *linebuf, size_t len);
|
||||
#include "fh_globals.h"
|
||||
#include "fh_runtime.h"
|
||||
#include "fh_print.h"
|
||||
|
||||
#endif //FORTH_H
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/**
|
||||
* TODO file description
|
||||
*
|
||||
* Created on 2021/11/17.
|
||||
*/
|
||||
|
||||
#ifndef FORTH_FORTH_INTERNAL_H
|
||||
#define FORTH_FORTH_INTERNAL_H
|
||||
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "fh_config.h"
|
||||
#include "fh_error.h"
|
||||
#include "fh_helpers.h"
|
||||
#include "fh_globals.h"
|
||||
#include "fh_print.h"
|
||||
#include "fh_runtime.h"
|
||||
#include "fh_mem.h"
|
||||
#include "fh_stack.h"
|
||||
#include "fh_parse.h"
|
||||
#include "fh_builtins.h"
|
||||
|
||||
#endif //FORTH_FORTH_INTERNAL_H
|
||||
Reference in New Issue
Block a user