Add functions to read/write multibyte values from/to host memory
This commit is contained in:
parent
345daf2cc5
commit
21a51e87c4
2 changed files with 236 additions and 10 deletions
|
@ -3,24 +3,106 @@
|
|||
|
||||
namespace
|
||||
{
|
||||
function_ptr_luafun hm_read("hostmemory.read", [](lua_State* LS, const std::string& fname) -> int {
|
||||
template<typename U, typename S>
|
||||
int do_read(lua_State* LS, const std::string& fname)
|
||||
{
|
||||
size_t address = get_numeric_argument<size_t>(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<uint8_t>(h[address]));
|
||||
U ret = 0;
|
||||
for(size_t i = 0; i < sizeof(U); i++)
|
||||
ret = 256 * ret + static_cast<uint8_t>(h[address + i]);
|
||||
lua_pushnumber(LS, static_cast<S>(ret));
|
||||
return 1;
|
||||
}
|
||||
|
||||
template<typename U, typename S>
|
||||
int do_write(lua_State* LS, const std::string& fname)
|
||||
{
|
||||
size_t address = get_numeric_argument<size_t>(LS, 1, fname.c_str());
|
||||
U value = static_cast<U>(get_numeric_argument<S>(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<uint8_t, uint8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_write("hostmemory.write", [](lua_State* LS, const std::string& fname) -> int {
|
||||
size_t address = get_numeric_argument<size_t>(LS, 1, fname.c_str());
|
||||
uint8_t value = get_numeric_argument<uint8_t>(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<uint8_t, uint8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readb("hostmemory.readbyte", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint8_t, uint8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writeb("hostmemory.writebyte", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint8_t, uint8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readsb("hostmemory.readsbyte", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint8_t, int8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writesb("hostmemory.writesbyte", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint8_t, int8_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readw("hostmemory.readword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint16_t, uint16_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writew("hostmemory.writeword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint16_t, uint16_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readsw("hostmemory.readsword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint16_t, int16_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writesw("hostmemory.writesword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint16_t, int16_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readd("hostmemory.readdword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint32_t, uint32_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writed("hostmemory.writedword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint32_t, uint32_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readsd("hostmemory.readsdword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint32_t, int32_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writesd("hostmemory.writesdword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint32_t, int32_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readq("hostmemory.readqword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint64_t, uint64_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writeq("hostmemory.writeqword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint64_t, uint64_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_readsq("hostmemory.readsqword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_read<uint64_t, int64_t>(LS, fname);
|
||||
});
|
||||
|
||||
function_ptr_luafun hm_writesq("hostmemory.writesqword", [](lua_State* LS, const std::string& fname) -> int {
|
||||
return do_write<uint64_t, int64_t>(LS, fname);
|
||||
});
|
||||
}
|
||||
|
|
144
manual.lyx
144
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
|
||||
|
|
Loading…
Add table
Reference in a new issue