From 21a51e87c4d0850c77fb7c5e4decef91ced7adbd Mon Sep 17 00:00:00 2001 From: Ilari Liusvaara Date: Sat, 24 Sep 2011 19:25:02 +0300 Subject: [PATCH] Add functions to read/write multibyte values from/to host memory --- lua/hostmemory.cpp | 102 ++++++++++++++++++++++++++++---- manual.lyx | 144 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 236 insertions(+), 10 deletions(-) diff --git a/lua/hostmemory.cpp b/lua/hostmemory.cpp index d814ba0b..6827c922 100644 --- a/lua/hostmemory.cpp +++ b/lua/hostmemory.cpp @@ -3,24 +3,106 @@ namespace { - function_ptr_luafun hm_read("hostmemory.read", [](lua_State* LS, const std::string& fname) -> int { + 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 >= h.size()) { + if(address + sizeof(U) > h.size()) { lua_pushboolean(LS, 0); return 1; } - lua_pushnumber(LS, static_cast(h[address])); + 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 { - size_t address = get_numeric_argument(LS, 1, fname.c_str()); - uint8_t value = get_numeric_argument(LS, 2, fname.c_str()); - auto& h = get_host_memory(); - if(address >= h.size()) - h.resize(address + 1); - h[address] = value; - return 0; + 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); }); } diff --git a/manual.lyx b/manual.lyx index e134cadc..c08a7151 100644 --- a/manual.lyx +++ b/manual.lyx @@ -1881,6 +1881,150 @@ Writes hostmemory slot with 0-255. Slot numbers out of range cause extension of host memory slot space. \end_layout +\begin_layout Subsubsection +readbyte(number address) +\end_layout + +\begin_layout Standard +Read unsigned byte (1 element) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writebyte(number address, number value) +\end_layout + +\begin_layout Standard +Write unsigned byte (1 element) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readsbyte(number address) +\end_layout + +\begin_layout Standard +Read signed byte (1 element) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writesbyte(number address, number value) +\end_layout + +\begin_layout Standard +Write signed byte (1 element) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readword(number address) +\end_layout + +\begin_layout Standard +Read unsigned word (2 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writeword(number address, number value) +\end_layout + +\begin_layout Standard +Write unsigned word (2 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readsword(number address) +\end_layout + +\begin_layout Standard +Read signed word (2 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writesword(number address, number value) +\end_layout + +\begin_layout Standard +Write signed word (2 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readdword(number address) +\end_layout + +\begin_layout Standard +Read unsigned doubleword (4 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writedword(number address, number value) +\end_layout + +\begin_layout Standard +Write unsigned doubleword (4 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readsdword(number address) +\end_layout + +\begin_layout Standard +Read signed doubleword (4 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writesdword(number address, number value) +\end_layout + +\begin_layout Standard +Write signed doubleword (4 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readqword(number address) +\end_layout + +\begin_layout Standard +Read unsigned quadword (8 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writeqword(number address, number value) +\end_layout + +\begin_layout Standard +Write unsigned quadword (4 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + +\begin_layout Subsubsection +readsqword(number address) +\end_layout + +\begin_layout Standard +Read signed quadword (8 elements) from given address. + Slots out of range return false. +\end_layout + +\begin_layout Subsubsection +writesqword(number address, number value) +\end_layout + +\begin_layout Standard +Write signed quadword (8 elements) to given slot. + Slot numbers out of range cause extension. +\end_layout + \begin_layout Subsection Table movie \end_layout