From 6aa34253209b40d07727aa256c282a1fb06d28f0 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 31 Mar 2014 16:56:21 -0400 Subject: [PATCH] Add default wordlist for forth-style interpeter --- source/slvm/main.c | 4 +++ source/slvm/wordlist.c | 72 ++++++++++++++++++++++++++++++++++++++++++ source/slvm/wordlist.h | 22 +++++++++++++ 3 files changed, 98 insertions(+) create mode 100644 source/slvm/wordlist.c create mode 100644 source/slvm/wordlist.h diff --git a/source/slvm/main.c b/source/slvm/main.c index 5a883f1..d56b5af 100644 --- a/source/slvm/main.c +++ b/source/slvm/main.c @@ -1,4 +1,8 @@ #include +#include +#include "wordlist.h" + +long* ArgStackPtr; int main(int argc, char** argv) { diff --git a/source/slvm/wordlist.c b/source/slvm/wordlist.c new file mode 100644 index 0000000..12404ea --- /dev/null +++ b/source/slvm/wordlist.c @@ -0,0 +1,72 @@ +#include "wordlist.h" + +extern long* ArgStackPtr; + +/** + * Define a built-in word that executes native code */ +#define defcode(name_str,c_name,flags,prev) \ + extern void c_name##_code(void); \ + extern char c_name##_str[]; \ + word_t c_name = { \ + prev, \ + flags, \ + c_name##_str, \ + &c_name##_code, \ + 0 \ + }; \ + char c_name##_str[] = name_str; \ + void c_name##_code(void) \ + +/** + * Define a built-in word that is defined by references to other words. */ +#define defword(name_str,c_name,flags,prev) \ + extern long c_name##_code[]; \ + extern char c_name##_str[]; \ + word_t c_name = { \ + prev, \ + flags, \ + c_name##_str, \ + &do_colon, \ + c_name##_code \ + }; \ + char c_name##_str[] = name_str; \ + long c_name##_code[] = + +/*****************************************************************************/ +defcode("drop", drop, 0, 0){ + ArgStackPtr--; +} + +defcode("swap", swap, 0, &drop){ + long temp = *(ArgStackPtr); + *(ArgStackPtr) = *(ArgStackPtr-1); + *(ArgStackPtr-1) = temp; +} + +defcode("dup", dup, 0, &swap){ + ArgStackPtr++; + *(ArgStackPtr) = *(ArgStackPtr-1); +} + +defcode("over", over, 0, &dup){ + ArgStackPtr++; + *(ArgStackPtr) = *(ArgStackPtr-2); +} + +defcode("rot", rot, 0, &over){ + long temp = *(ArgStackPtr); + *(ArgStackPtr) = *(ArgStackPtr-1); + *(ArgStackPtr-1) = *(ArgStackPtr-2); + *(ArgStackPtr-2) = temp; +} + +defcode("-rot", nrot, 0, &rot){ + long temp = *(ArgStackPtr-2); + *(ArgStackPtr-2) = *(ArgStackPtr-1); + *(ArgStackPtr-1) = *(ArgStackPtr); + *(ArgStackPtr) = temp; +} + +/*****************************************************************************/ +word_t* LatestWord = &nrot; + diff --git a/source/slvm/wordlist.h b/source/slvm/wordlist.h new file mode 100644 index 0000000..49fa6f9 --- /dev/null +++ b/source/slvm/wordlist.h @@ -0,0 +1,22 @@ +/** + @file wordlist.h + @brief This module defines the list of built-in words for the interpreter. + $Revision$ + $HeadURL$ + */ +#ifndef WORDLIST_H +#define WORDLIST_H + +typedef void (*codeword_t)(void); + +typedef struct word_t { + struct word_t* link; + long flags; + char* name; + codeword_t codeword; + long* code; +} word_t; + +extern word_t* LatestWord; + +#endif /* WORDLIST_H */ -- 2.55.0