Fixed 2swap bug, added ?do, fixed +loop.
[forth.jl.git] / src / forth.jl
index 0b4871f..e7faf97 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)
 
@@ -872,7 +881,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 +1029,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