commands are read line by line ```[:] [ [[,]``` arguments can be either variables, labels or immediates, labels are replaced with immediates which have the line numbers of the labels as their values true/false: boolean (immediate) 12.6: number (immediate) $hello nwae: string (immediate) nodolla: either a label is called so (immediate) or it's a variable If you want to use : in a string, you need to put it at the beginning of the line to not treat the left part as label ``` Types: e anything v any variable ve any set variable s string vs string variable n number vn number variable ui unsigned integer number b bool vn bool variable Instructions: mov , Copies from into to. getvar [, ] Sets varname to the current variable called if it's set. If exists is passed, it's set to a bool indicating whether the variable was set. add , to += from add , to = to and from add , to = to .. from mul , to *= from mul , to = to or from mul , str = str:rep(from) neg num = -num neg var = not var neg str = str:rev() inv num = 1 / num mod , num = num % dv jmp [, ] If c is not false, the instruction pointer is set to p. To disallow infinite loops, the program is interrupted after changing the ip, the mod should then consider restarting it. call push the ip, then jmp p; used to execute subroutines ret pop something, then jmp there; used to exit subroutines push [, [, […]]] put values onto the stack; from left to right pop [, [, […]]] takes values from the stack and sets the passed variables to them; from left to right equal , a = a == b less , a = a < b; after executing, a is a bool less , a = a < b; less also works for strings usleep aborts the program for at least floor(max(0, t)) ms sleep executes usleep with t * 1000000 as argument get_us_time stores minetest.get_us_time() into to; can be used to measure time differences tostring var = tostring(var) print [, [, […]]] adds variables to the log, seperated by \t, \n is added at the end flush Output the log, this should vary for every mod. ``` How mods can use this mod: ``` local mylog = print local parsed_code = pdisc.parse(code_text) local function mystart(parsed_code) local thread = pdisc.create_thread(function(thread) thread.flush = function(self) mylog(self.log) self.log = "" return true end end, parsed_code) thread:suscitate() mykeepalive(thread) end mystart(parsed_code) local function mykeepalive(thread) if not thread.stopped then return end thread:try_rebirth() minetest.after(0.1, function() mykeepalive() end) end ``` TODO: * add string. instructions * metatable