X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=5978fb125b390f96ad21157068dea0234b0a8d83;hb=c862fa3309ee682e6f85d26367e87cf383cfa726;hp=8c5c3de153954ffcbedfbe49073d08952d776be1;hpb=ce55be3d16cf4ccb4284d323fc045b2afed20320;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index 8c5c3de..5978fb1 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -687,17 +687,17 @@ end) LBRAC = defPrim("[", () -> begin mem[STATE] = 0 return mem[NEXT] -end, flags=F_IMMEDIATE) +end, flags=F_IMMED) RBRAC = defPrim("]", () -> begin mem[STATE] = 1 return mem[NEXT] -end, flags=F_IMMEDIATE) +end, flags=F_IMMED) HIDDEN = defPrim("HIDDEN", () -> begin addr = popPS() + 1 mem[addr] = mem[addr] $ F_HIDDEN - reurn mem[NEXT] + return mem[NEXT] end) HIDE = defWord("HIDE", @@ -718,17 +718,38 @@ SEMICOLON = defWord(";", [LIT, EXIT, COMMA, LATEST, FETCH, HIDDEN, LBRAC, - EXIT], flags=F_IMMEDIATE) + EXIT], flags=F_IMMED) IMMEDIATE = defPrim("IMMEDIATE", () -> begin lenAndFlagsAddr = mem[LATEST] + 1 - mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMEDIATE + mem[lenAndFlagsAddr] = mem[lenAndFlagsAddr] $ F_IMMED return mem[NEXT] -end, flags=F_IMMEDIATE) +end, flags=F_IMMED) + +TICK = defWord("'", [WORD, FIND, TOCFA, EXIT]) + +# Branching + +BRANCH = defPrim("BRANCH", () -> begin + reg.IP += mem[reg.IP] + return mem[NEXT] +end) + +ZBRANCH = defPrim("0BRANCH", () -> begin + if (popPS() == 0) + reg.IP += mem[reg.IP] + else + reg.IP += 1 + end + + return mem[NEXT] +end) + +# Strings #### VM loop #### function runVM() - jmp = NEXT + jmp = mem[NEXT] while (jmp = callPrim(jmp)) != 0 end end @@ -745,7 +766,7 @@ function dump(startAddr::Int64; count::Int64 = 100, cellsPerLine::Int64 = 10) print("\t$(mem[addr]) ") - if (mem[addr]>=32 && mem[addr]<176) + if (mem[addr]>=32 && mem[addr]<128) chars[i%cellsPerLine + 1] = Char(mem[addr]) else chars[i%cellsPerLine + 1] = '.'