X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=e7faf97ef36cf434616eb26ad60e7f1d65349753;hb=3497073ce4fa8c523c05c4959b0c574c3c3bebcc;hp=0b4871f89c2674359f32259e35ede298614cba5f;hpb=5328ad90af9699b87b0beee70aa7a7ee6a98e8a9;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index 0b4871f..e7faf97 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -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