From 7a3b0d2e42bc2b84993c3d9ae5993e6225c889a6 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Fri, 4 Apr 2014 17:01:58 -0400 Subject: [PATCH] checkpoint --- source/slvm/main.c | 502 +++++++++++++++++++++++++-------------------- 1 file changed, 279 insertions(+), 223 deletions(-) diff --git a/source/slvm/main.c b/source/slvm/main.c index 08271aa..5e3f309 100644 --- a/source/slvm/main.c +++ b/source/slvm/main.c @@ -103,6 +103,8 @@ defcode("getw", get_word, 0, &is_ws){ EXEC(is_ws); wschar = *(ArgStackPtr); ArgStackPtr--; + if(wschar == '\n') + printf((state_val) ? "=> " : ".. "); } while(wschar); /* Read the rest of the word */ @@ -125,7 +127,6 @@ defcode("getw", get_word, 0, &is_ws){ } defcode("findw", findw, 0, &get_word){ - puts("finding word"); word_t const* curr = (word_t const*)latest_val; char* name = (char*)*(ArgStackPtr); while(curr) @@ -145,13 +146,12 @@ defcode("execute", execute, 0, &findw){ } defcode("parsenum", parse_num, 0, &execute){ - puts("Parsing Number"); *(ArgStackPtr) = atoi((const char *)*(ArgStackPtr)); } defcode("interpret", interpret, 0, &parse_num){ char* curr_word; - printf("=> "); + //printf((0 == state_val) ? "=> " : ".. "); /* Parse a word */ EXEC(get_word); curr_word = (char*)*(ArgStackPtr); @@ -167,7 +167,6 @@ defcode("interpret", interpret, 0, &parse_num){ { *(ArgStackPtr) = (long)curr_word; EXEC(parse_num); - //number.codeword(number.code); } } @@ -200,228 +199,11 @@ defcode("create", create, 0, &quit){ *(ArgStackPtr) = (long)word; } -/* Built-in Primitive Words - *****************************************************************************/ -defcode("drop", drop, 0, &create){ - 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; -} - -defcode("2drop", twodrop, 0, &nrot){ - ArgStackPtr -= 2; -} - -defcode("2dup", twodup, 0, &twodrop){ - ArgStackPtr += 2; - *(ArgStackPtr-1) = *(ArgStackPtr-3); - *(ArgStackPtr) = *(ArgStackPtr-2); -} - -defcode("2swap", twoswap, 0, &twodup){ -} - -defcode("?dup", qdup, 0, &twoswap){ -} - -defcode("1+", incr, 0, &qdup){ - *(ArgStackPtr) += 1; -} - -defcode("1-", decr, 0, &incr){ - *(ArgStackPtr) -= 1; -} - -defcode("4+", incr4, 0, &decr){ - *(ArgStackPtr) += 1; -} - -defcode("4-", decr4, 0, &incr4){ - *(ArgStackPtr) -= 1; -} - -defcode("+", add, 0, &decr4){ - *(ArgStackPtr-1) += *(ArgStackPtr); - ArgStackPtr--; -} -defcode("-", sub, 0, &add){ - *(ArgStackPtr-1) -= *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("*", mul, 0, &sub){ - *(ArgStackPtr-1) *= *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("/", divide, 0, &mul){ - *(ArgStackPtr-1) /= *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("%", mod, 0, ÷){ - *(ArgStackPtr-1) %= *(ArgStackPtr); - ArgStackPtr--; -} -defcode("/%", divmod, 0, &mod){ -} -defcode("=", equal, 0, &divmod){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) == *(ArgStackPtr); - ArgStackPtr--; -} -defcode("!=", notequal, 0, &equal){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) != *(ArgStackPtr); - ArgStackPtr--; -} -defcode("<", lessthan, 0, ¬equal){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) < *(ArgStackPtr); - ArgStackPtr--; -} - -defcode(">", greaterthan, 0, &lessthan){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) > *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("<=", lessthaneq, 0, &greaterthan){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) <= *(ArgStackPtr); - ArgStackPtr--; -} - -defcode(">=", greaterthaneq, 0, &lessthaneq){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) >= *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("0=", zeroeq, 0, &greaterthaneq){ - *(ArgStackPtr) = *(ArgStackPtr) == 0; -} - -defcode("0!=", zeroneq, 0, &zeroeq){ - *(ArgStackPtr) = *(ArgStackPtr) != 0; -} - -defcode("0<", zerolt, 0, &zeroneq){ - *(ArgStackPtr) = *(ArgStackPtr) < 0; -} - -defcode("0>", zerogt, 0, &zerolt){ - *(ArgStackPtr) = *(ArgStackPtr) > 0; -} - -defcode("0<=", zerolte, 0, &zerogt){ - *(ArgStackPtr) = *(ArgStackPtr) <= 0; -} - -defcode("0>=", zerogte, 0, &zerolte){ - *(ArgStackPtr) = *(ArgStackPtr) >= 0; -} - -defcode("and", and, 0, &zerogte){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) && *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("or", or, 0, &and){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) || *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("not", not, 0, &or){ - *(ArgStackPtr) = !(*(ArgStackPtr)); -} - -defcode("band", band, 0, ¬){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) & *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("bor", bor, 0, &band){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) | *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("bxor", bxor, 0, &bor){ - *(ArgStackPtr-1) = *(ArgStackPtr-1) ^ *(ArgStackPtr); - ArgStackPtr--; -} - -defcode("bnot", bnot, 0, &bxor){ - *(ArgStackPtr) = ~(*(ArgStackPtr)); -} - -defcode("lit", lit, 0, &bnot){ - ArgStackPtr++; - *(ArgStackPtr) = *(inst_ptr); -} - -defcode("!", store, 0, &lit){ -} - -defcode("@", fetch, 0, &store){ - puts("@ Executed"); -} - -defcode("+!", addstore, 0, &fetch){ -} - -defcode("-!", substore, 0, &addstore){ -} - -defcode("b!", bytestore, 0, &substore){ -} - -defcode("b@", bytefetch, 0, &bytestore){ -} - -defcode("b@b!", bytecopy, 0, &bytefetch){ -} - -defcode("bmove", bytemove, 0, &bytecopy){ -} - -/* Input/Output Words - *****************************************************************************/ -defcode("putc", put_io_c, 0, &bytemove){ - putc((char)*(ArgStackPtr), stdout); - ArgStackPtr--; -} - -/* Compiler Words - *****************************************************************************/ defcode("wcwa", code_word_addr, 0, &put_io_c){ word_t const* word = (word_t const*)*(ArgStackPtr); *(ArgStackPtr) = (long)word->codeword; @@ -456,11 +238,11 @@ defcode(",", comma, 0, &hidden){ } defcode("[", lbrack, 0, &comma){ - state_val = 0; + state_val = 1; } defcode("]", rbrack, 0, &lbrack){ - state_val = 1; + state_val = 0; } defcode(":", colon, 0, &rbrack){ @@ -482,6 +264,280 @@ defcode("branch", branch, 0, &semicolon){ defcode("0branch", branch_if_0, 0, &branch){ } +/* Built-in Primitive Words + *****************************************************************************/ +//defcode("drop", drop, 0, &create){ +// 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; +//} +// +//defcode("2drop", twodrop, 0, &nrot){ +// ArgStackPtr -= 2; +//} +// +//defcode("2dup", twodup, 0, &twodrop){ +// ArgStackPtr += 2; +// *(ArgStackPtr-1) = *(ArgStackPtr-3); +// *(ArgStackPtr) = *(ArgStackPtr-2); +//} +// +//defcode("2swap", twoswap, 0, &twodup){ +//} +// +//defcode("?dup", qdup, 0, &twoswap){ +//} +// +//defcode("1+", incr, 0, &qdup){ +// *(ArgStackPtr) += 1; +//} +// +//defcode("1-", decr, 0, &incr){ +// *(ArgStackPtr) -= 1; +//} +// +//defcode("4+", incr4, 0, &decr){ +// *(ArgStackPtr) += 1; +//} +// +//defcode("4-", decr4, 0, &incr4){ +// *(ArgStackPtr) -= 1; +//} +// +//defcode("+", add, 0, &decr4){ +// *(ArgStackPtr-1) += *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("-", sub, 0, &add){ +// *(ArgStackPtr-1) -= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("*", mul, 0, &sub){ +// *(ArgStackPtr-1) *= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("/", divide, 0, &mul){ +// *(ArgStackPtr-1) /= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("%", mod, 0, ÷){ +// *(ArgStackPtr-1) %= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("/%", divmod, 0, &mod){ +//} +// +//defcode("=", equal, 0, &divmod){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) == *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("!=", notequal, 0, &equal){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) != *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("<", lessthan, 0, ¬equal){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) < *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode(">", greaterthan, 0, &lessthan){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) > *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("<=", lessthaneq, 0, &greaterthan){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) <= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode(">=", greaterthaneq, 0, &lessthaneq){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) >= *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("0=", zeroeq, 0, &greaterthaneq){ +// *(ArgStackPtr) = *(ArgStackPtr) == 0; +//} +// +//defcode("0!=", zeroneq, 0, &zeroeq){ +// *(ArgStackPtr) = *(ArgStackPtr) != 0; +//} +// +//defcode("0<", zerolt, 0, &zeroneq){ +// *(ArgStackPtr) = *(ArgStackPtr) < 0; +//} +// +//defcode("0>", zerogt, 0, &zerolt){ +// *(ArgStackPtr) = *(ArgStackPtr) > 0; +//} +// +//defcode("0<=", zerolte, 0, &zerogt){ +// *(ArgStackPtr) = *(ArgStackPtr) <= 0; +//} +// +//defcode("0>=", zerogte, 0, &zerolte){ +// *(ArgStackPtr) = *(ArgStackPtr) >= 0; +//} +// +//defcode("and", and, 0, &zerogte){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) && *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("or", or, 0, &and){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) || *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("not", not, 0, &or){ +// *(ArgStackPtr) = !(*(ArgStackPtr)); +//} +// +//defcode("band", band, 0, ¬){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) & *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("bor", bor, 0, &band){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) | *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("bxor", bxor, 0, &bor){ +// *(ArgStackPtr-1) = *(ArgStackPtr-1) ^ *(ArgStackPtr); +// ArgStackPtr--; +//} +// +//defcode("bnot", bnot, 0, &bxor){ +// *(ArgStackPtr) = ~(*(ArgStackPtr)); +//} +// +//defcode("lit", lit, 0, &bnot){ +// ArgStackPtr++; +// *(ArgStackPtr) = *(inst_ptr); +//} +// +//defcode("!", store, 0, &lit){ +//} +// +//defcode("@", fetch, 0, &store){ +// puts("@ Executed"); +//} +// +//defcode("+!", addstore, 0, &fetch){ +//} +// +//defcode("-!", substore, 0, &addstore){ +//} +// +//defcode("b!", bytestore, 0, &substore){ +//} +// +//defcode("b@", bytefetch, 0, &bytestore){ +//} +// +//defcode("b@b!", bytecopy, 0, &bytefetch){ +//} +// +//defcode("bmove", bytemove, 0, &bytecopy){ +//} + +/* Input/Output Words + *****************************************************************************/ +defcode("putc", put_io_c, 0, &bytemove){ + putc((char)*(ArgStackPtr), stdout); + ArgStackPtr--; +} + +/* Compiler Words + *****************************************************************************/ +//defcode("wcwa", code_word_addr, 0, &put_io_c){ +// word_t const* word = (word_t const*)*(ArgStackPtr); +// *(ArgStackPtr) = (long)word->codeword; +//} +// +//defcode("wcda", code_data_addr, 0, &code_word_addr){ +// word_t const* word = (word_t const*)*(ArgStackPtr); +// *(ArgStackPtr) = (long)word->code; +//} +// +//defcode("immediate", immediate, 0, &code_data_addr){ +// ((word_t*)latest_val)->flags ^= f_immed_val; +//} +// +//defcode("hidden", hidden, 0, &immediate){ +// ((word_t*)latest_val)->flags ^= f_hidden_val; +//} +// +//defcode(",", comma, 0, &hidden){ +// /* Get the word we are currently compiling */ +// word_t* word = (word_t*)latest_val; +// /* Put the next instruction in place of the terminating NULL that "here" +// * points too */ +// *((long*)here_val) = *(ArgStackPtr); +// ArgStackPtr--; +// /* Resize the code section and relocate if necessary */ +// long currsize = sizeof(long) + (here_val - (long)word->code); +// word->code = (long*)realloc(word->code, currsize + sizeof(long)); +// /* Update "here" and null terminate the code section */ +// here_val = (long)&(word->code[ (currsize / sizeof(long)) ]); +// *((long*)here_val) = 0; +//} +// +//defcode("[", lbrack, 0, &comma){ +// state_val = 1; +//} +// +//defcode("]", rbrack, 0, &lbrack){ +// state_val = 0; +//} +// +//defcode(":", colon, 0, &rbrack){ +// EXEC(get_word); +// EXEC(create); +// EXEC(rbrack); +//} +// +//defcode(";", semicolon, 0, &colon){ +// ((word_t*)latest_val)->flags ^= f_hidden_val; +// state_val = 0; +//} + /* Main *****************************************************************************/ int main(int argc, char** argv) -- 2.55.0