ID. sensible handles control characters in word names.
[forth.jl.git] / src / forth.jl
index 0b4871f..6578d75 100644 (file)
@@ -241,7 +241,7 @@ OVER = defPrimWord("OVER", () -> begin
     return NEXT
 end)
 
-NROT = defPrimWord("-ROT", () -> begin
+ROT = defPrimWord("ROT", () -> begin
     a = popPS()
     b = popPS()
     c = popPS()
@@ -251,7 +251,7 @@ NROT = defPrimWord("-ROT", () -> begin
     return NEXT
 end)
 
-ROT = defPrimWord("ROT", () -> begin
+NROT = defPrimWord("-ROT", () -> begin
     a = popPS()
     b = popPS()
     c = popPS()
@@ -284,8 +284,17 @@ TWOSWAP = defPrimWord("2SWAP", () -> begin
     d = popPS()
     pushPS(b)
     pushPS(a)
-    pushPS(c)
     pushPS(d)
+    pushPS(c)
+    return NEXT
+end)
+
+TWOOVER = defPrimWord("2OVER", () -> begin
+    ensurePSDepth(4)
+    a = mem[reg.PSP-3]
+    b = mem[reg.PSP-2]
+    pushPS(a)
+    pushPS(b)
     return NEXT
 end)
 
@@ -814,9 +823,11 @@ IMMEDIATE = defPrimWord("IMMEDIATE", () -> begin
 end, flags=F_IMMED)
 
 TICK = defWord("'",
-    [STATE_CFA, FETCH, ZBRANCH, 7,
-    FROMR, DUP, INCR, TOR, FETCH, EXIT,
-    WORD, FIND, TOCFA, EXIT])
+    [WORD, FIND, TOCFA, EXIT])
+
+BTICK = defWord("[']",
+    [FROMR, DUP, INCR, TOR, FETCH, EXIT])
+
 
 # Strings
 
@@ -872,7 +883,7 @@ INTERPRET = defPrimWord("INTERPRET", () -> begin
         isImmediate = (mem[wordAddr+1] & F_IMMED) != 0
         callPrim(mem[TOCFA])
 
-        callPrim(mem[ROT]) # get rid of extra copy of word string details
+        callPrim(mem[NROT]) # get rid of extra copy of word string details
         popPS()
         popPS()
 
@@ -1020,6 +1031,8 @@ function run(;initialize=true)
 
             mem[STATE] = 0
             mem[NUMTIB] = 0
+            reg.PSP = mem[PSP0]
+            reg.RSP = mem[RSP0]
             reg.IP = QUIT + 1
             jmp = NEXT
         end