#include "lua-int.hpp" #include "moviedata.hpp" namespace { template int do_read(lua_State* LS, const std::string& fname) { size_t address = get_numeric_argument(LS, 1, fname.c_str()); auto& h = get_host_memory(); if(address + sizeof(U) > h.size()) { lua_pushboolean(LS, 0); return 1; } U ret = 0; for(size_t i = 0; i < sizeof(U); i++) ret = 256 * ret + static_cast(h[address + i]); lua_pushnumber(LS, static_cast(ret)); return 1; } template int do_write(lua_State* LS, const std::string& fname) { size_t address = get_numeric_argument(LS, 1, fname.c_str()); U value = static_cast(get_numeric_argument(LS, 2, fname.c_str())); auto& h = get_host_memory(); if(address + sizeof(U) > h.size()) h.resize(address + sizeof(U)); for(size_t i = sizeof(U) - 1; i < sizeof(U); i--) { h[address + i] = value; value >>= 8; } return 0; } function_ptr_luafun hm_read("hostmemory.read", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_write("hostmemory.write", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readb("hostmemory.readbyte", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writeb("hostmemory.writebyte", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readsb("hostmemory.readsbyte", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writesb("hostmemory.writesbyte", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readw("hostmemory.readword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writew("hostmemory.writeword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readsw("hostmemory.readsword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writesw("hostmemory.writesword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readd("hostmemory.readdword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writed("hostmemory.writedword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readsd("hostmemory.readsdword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writesd("hostmemory.writesdword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readq("hostmemory.readqword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writeq("hostmemory.writeqword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); function_ptr_luafun hm_readsq("hostmemory.readsqword", [](lua_State* LS, const std::string& fname) -> int { return do_read(LS, fname); }); function_ptr_luafun hm_writesq("hostmemory.writesqword", [](lua_State* LS, const std::string& fname) -> int { return do_write(LS, fname); }); }