X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=b1d782ce1d11a0e6d291083315532922ea43c51c;hb=d2b2b3e5b33f882c18c9e7cf8c6623f4e863c2dd;hp=a52b67534031c76d2105cca5d38abb6b1160f8c6;hpb=9131cbd1d39efc223c1c6307e7bcbdda500ffa8e;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index a52b675..b1d782c 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -1,12 +1,12 @@ module forth # VM mem size -size_mem = 640*1024 +size_mem = 1000000 # 1 mega-int # Buffer sizes -size_RS = 1024 # Return stack size -size_PS = 1024 # Parameter stack size -size_TIB = 1096 # Terminal input buffer size +size_RS = 1000 # Return stack size +size_PS = 1000 # Parameter stack size +size_TIB = 1000 # Terminal input buffer size # The mem array constitutes the memory of the VM. It has the following geography: # @@ -231,13 +231,12 @@ defConst("DOCON", DOCON) defConst("DOVAR", DOVAR) defConst("DICT", DICT) +defConst("MEMSIZE", size_mem) F_IMMED = defConst("F_IMMED", 128) F_HIDDEN = defConst("F_HIDDEN", 256) F_LENMASK = defConst("F_LENMASK", 127) - - # Basic forth primitives DROP = defPrimWord("DROP", () -> begin @@ -627,24 +626,10 @@ WORD = defPrimWord("WORD", () -> begin eof_char = Char(EOF) c = eof_char - skip_to_end = false while true - callPrim(mem[KEY]) c = Char(popPS()) - if c == '\\' - skip_to_end = true - continue - end - - if skip_to_end - if c == '\n' || c == eof_char - skip_to_end = false - end - continue - end - if c == ' ' || c == '\t' continue end @@ -769,6 +754,8 @@ end) # Compilation +STATE, STATE_CFA = defNewVar("STATE", 0) + HEADER = defPrimWord("HEADER", () -> begin wordLen = popPS() @@ -787,8 +774,6 @@ COMMA = defPrimWord(",", () -> begin return NEXT end) -STATE, STATE_CFA = defNewVar("STATE", 0) - LBRAC = defPrimWord("[", () -> begin mem[STATE] = 0 return NEXT @@ -837,6 +822,28 @@ TICK = defWord("'", BTICK = defWord("[']", [FROMR, DUP, INCR, TOR, FETCH, EXIT]) +# CREATE and DOES> + +CREATE = defWord("CREATE", + [WORD, + HEADER, + LIT, DOVAR, COMMA, EXIT]); + +DODOES = defPrim(() -> begin + pushRS(reg.IP) + reg.IP = reg.W + 1 + return NEXT +end, name="DOCOL") + +defConst("DODOES", DODOES) + +FROMDOES_PAREN = defWord("(DOES>)", + [DODOES, LATEST, FETCH, TOCFA, STORE, EXIT]) + +FROMDOES = defWord("DOES>", + [BTICK, FROMDOES_PAREN, COMMA, BTICK, EXIT, COMMA, + BTICK, LIT, COMMA, LATEST, FETCH, TODFA, COMMA], flags=F_IMMED) + # Strings