#include "core/lua-int.hpp" #include "core/memorymanip.hpp" #include "core/rom.hpp" namespace { template class lua_read_memory : public lua_function { public: lua_read_memory(const std::string& name) : lua_function(name) {} int invoke(lua_State* LS) { uint32_t addr = get_numeric_argument(LS, 1, fname.c_str()); lua_pushnumber(LS, static_cast(rfun(addr))); return 1; } }; template class lua_write_memory : public lua_function { public: lua_write_memory(const std::string& name) : lua_function(name) {} int invoke(lua_State* LS) { uint32_t addr = get_numeric_argument(LS, 1, fname.c_str()); T value = get_numeric_argument(LS, 2, fname.c_str()); wfun(addr, value); return 0; } }; function_ptr_luafun vmacount("memory.vma_count", [](lua_State* LS, const std::string& fname) -> int { lua_pushnumber(LS, get_regions().size()); return 1; }); int handle_push_vma(lua_State* LS, std::vector& regions, size_t idx) { if(idx >= regions.size()) { lua_pushnil(LS); return 1; } memory_region& r = regions[idx]; lua_newtable(LS); lua_pushstring(LS, "region_name"); lua_pushlstring(LS, r.region_name.c_str(), r.region_name.size()); lua_settable(LS, -3); lua_pushstring(LS, "baseaddr"); lua_pushnumber(LS, r.baseaddr); lua_settable(LS, -3); lua_pushstring(LS, "size"); lua_pushnumber(LS, r.size); lua_settable(LS, -3); lua_pushstring(LS, "lastaddr"); lua_pushnumber(LS, r.lastaddr); lua_settable(LS, -3); lua_pushstring(LS, "readonly"); lua_pushboolean(LS, r.readonly); lua_settable(LS, -3); lua_pushstring(LS, "native_endian"); lua_pushboolean(LS, r.native_endian); lua_settable(LS, -3); return 1; } function_ptr_luafun readvma("memory.read_vma", [](lua_State* LS, const std::string& fname) -> int { std::vector regions = get_regions(); uint32_t num = get_numeric_argument(LS, 1, fname.c_str()); return handle_push_vma(LS, regions, num); }); function_ptr_luafun findvma("memory.find_vma", [](lua_State* LS, const std::string& fname) -> int { std::vector regions = get_regions(); uint32_t addr = get_numeric_argument(LS, 1, fname.c_str()); size_t i; for(i = 0; i < regions.size(); i++) if(addr >= regions[i].baseaddr && addr <= regions[i].lastaddr) break; return handle_push_vma(LS, regions, i); }); const char* hexes = "0123456789ABCDEF"; function_ptr_luafun hashstate("memory.hash_state", [](lua_State* LS, const std::string& fname) -> int { char hash[64]; auto x = save_core_state(); size_t offset = x.size() - 32; for(unsigned i = 0; i < 32; i++) { hash[2 * i + 0] = hexes[static_cast(x[offset + i]) >> 4]; hash[2 * i + 1] = hexes[static_cast(x[offset + i]) & 0xF]; } lua_pushlstring(LS, hash, 64); return 1; }); lua_read_memory rub("memory.readbyte"); lua_read_memory rsb("memory.readsbyte"); lua_read_memory ruw("memory.readword"); lua_read_memory rsw("memory.readsword"); lua_read_memory rud("memory.readdword"); lua_read_memory rsd("memory.readsdword"); lua_read_memory ruq("memory.readqword"); lua_read_memory rsq("memory.readsqword"); lua_write_memory wb("memory.writebyte"); lua_write_memory ww("memory.writeword"); lua_write_memory wd("memory.writedword"); lua_write_memory wq("memory.writeqword"); }