local UID,fmt = function () if type(_uidcounter)~='number' then _uidcounter=math.random(0xfffff,0x1fffff)end _uidcounter = _uidcounter + 1 return _uidcounter end, string.format local function aa_aobScanEx(s,sc) local scanType,sym,param = 'Region',s:match"^%s*([_%a.][_%w.#:]*)%s*,%s*(.-)%s*$" if not sym then return nil, "No symbol in : "..s end if sym:find":" then local symbol,scantype = sym:match"^([_%a.][_%w.#]*)%s*:%s*([_%w.#]*)$" if not symbol then return nil,"Want to define a scan type, but not specified :"..s else sym,scanType = symbol,scantype end end local marker,result = fmt("%s_%X",sym,UID()) if not sc and readInteger(process) and autoAssemble(fmt([[ aobscan%s(%s,%s) registersymbol(%s) ]],scanType,marker,param,marker)) and readInteger(marker) then result = GetAddress(marker) unregisterSymbol(marker) elseif not sc and readInteger(process) then return nil,'no result :'..s end return fmt("define(%s,%X)",sym,result or 0x666) end local function aa_calc(s, sc) local fmt, sym, isLua, exp, ok, ret = string.format, s:match"^%s*([_%a][_%w.#]*)%s*,%s*($?)%s*(.-)%s*$" if not sym then return nil,'no symbol' end if sc then return fmt('define(%s,666)',sym)end if isLua=='' then -- not lua ret = GetAddressSafe(exp) else ok, ret = pcall(load,'return '..exp,'_',nil,_G) if ok then ok,ret = pcall(ret)end if not ok then return nil, tostring(ret)end end if type(ret)=='number' and math.tointeger(ret) and math.tointeger(-ret)then -- integer to be convert to hex form ret = ret<0 and fmt('-%X',-ret) or fmt('%X',ret) elseif type(ret)=='number'then -- may be float number? ret = tostring(ret) elseif type(ret)~='string' then -- not valid ret = nil end if ret then return fmt('define(%s,%s)',sym,ret) else return nil,'no result, expression: '..s end end function resetAobScanEx() unregisterAutoAssemblerCommand('aobScanEx') registerAutoAssemblerCommand('aobScanEx',aa_aobScanEx) unregisterAutoAssemblerCommand('calc') registerAutoAssemblerCommand('calc',aa_calc) end resetAobScanEx() local function hx(n) return type(n)=='number' and math.tointeger(n) and math.tointeger(-n) and string.format('%02X',n) or 'hx?'..tostring(n) end function s2aob(s) local r = {} for i=1,#s do r[i]=hx(s:byte(i,i))end return table.concat(r,' ') end function n2aob(n, fms, bigend) fms, bigend = fms or 4, bigend and '>' or '<' if type(fms)=='number' or tonumber(fms) then fms = 'I'..fms end if type(n)=='string' then n = tonumber(n,16) or GetAddressSafe(n)end if type(n)=='number' then return s2aob(string.pack(bigend..fms, n)) else return nil,'invalid n: '..tostring(n) end end