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:
#
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
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
# Compilation
+STATE, STATE_CFA = defNewVar("STATE", 0)
+
HEADER = defPrimWord("HEADER", () -> begin
wordLen = popPS()
return NEXT
end)
-STATE, STATE_CFA = defNewVar("STATE", 0)
-
LBRAC = defPrimWord("[", () -> begin
mem[STATE] = 0
return NEXT
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