local bit = require('bit') local function opcode(id, name, a, b, c, metamethod) return { id=id, name=name, a=a, b=b, c=c, methametod=metamethod, } end local function gen_opcodes(tbl) res = {} for i = 1, #tbl do res[tbl[i].id] = { name = tbl[i].name, a = tbl[i].a, b = tbl[i].b, c = tbl[i].c, metamethod = tbl[i].metamethod, } end return res end local Mode = { none = 0, dst = 1, base = 2, var = 3, rbase = 4, uv = 5, lit = 6, lits = 7, pri = 8, num = 9, str = 10, tab = 11, func = 12, jump = 13, cdata = 14, max = 15, none = 15, -- same as max } local Metamethod = { index = 0, newindex = 1, gc = 2, mode = 3, eq = 4, len = 5, lt = 6, le = 7, concat = 8, call = 9, add = 10, sub = 11, mul = 12, div = 13, mod = 14, pow = 15, unm = 16, metatable = 17, tostring = 18, } local Opcodes_defs = gen_opcodes { opcode(37, 'POW', Mode.dst, Mode.none, Mode.lits, Metamethod.none), opcode(41, 'KSHORT', Mode.dst, Mode.var, Mode.var, Metamethod.pow), opcode(75, 'RET0', Mode.rbase, Mode.none, Mode.lit, Mode.none), } local function decode(ins) -- TODO: endianess local id = bit.band(ins, 0xff) local a = bit.band(ins, 0xff00) / 0x100 local b = bit.band(ins, 0xff0000) / 0x10000 local c = bit.band(ins, 0xff000000) / 0x1000000 local d = bit.band(ins, 0xffff0000) / 0x10000 return { id = id, a = a, b = b, c = c, d = d, } end return { defs = Opcodes_defs, decode = decode, }