X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=blobdiff_plain;f=src%2Fforth.jl;h=5956a0df822a191dc49645d8e64f86a4e680cb52;hp=80f6b76b9fc07eaa7e87f6591303e65b3842e68b;hb=5da35bb425354054043fef285a44d488f713e572;hpb=b593ff258f6b62e7bd7c00b566d8f4f812b0f95a diff --git a/src/forth.jl b/src/forth.jl index 80f6b76..5956a0d 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -649,6 +649,19 @@ end) # Dictionary searches +TOCFA = defPrimWord(">CFA", () -> begin + + addr = popPS() + lenAndFlags = mem[addr+1] + len = lenAndFlags & F_LENMASK + + pushPS(addr + 2 + len) + + return NEXT +end) + +TOBODY = defWord(">BODY", [INCR, EXIT]) + FIND = defPrimWord("FIND", () -> begin countedAddr = popPS() @@ -676,23 +689,23 @@ FIND = defPrimWord("FIND", () -> begin end end - pushPS(latest) - - return NEXT -end) - -TOCFA = defPrimWord(">CFA", () -> begin - - addr = popPS() - lenAndFlags = mem[addr+1] - len = lenAndFlags & F_LENMASK + if latest > 0 + pushPS(latest) + callPrim(mem[TOCFA]) + if (lenAndFlags & F_IMMED) == F_IMMED + pushPS(1) + else + pushPS(-1) + end + else + pushPS(countedAddr) + pushPS(0) + end - pushPS(addr + 2 + len) return NEXT end) -TOPFA = defWord(">PFA", [TOCFA, INCR, EXIT]) # Branching