Evdev joystick plugin
[lsnes.git] / lua / hostmemory.cpp
blob6827c922865bacc5337efaae9170afdf8881acad
1 #include "lua-int.hpp"
2 #include "moviedata.hpp"
4 namespace
6 template<typename U, typename S>
7 int do_read(lua_State* LS, const std::string& fname)
9 size_t address = get_numeric_argument<size_t>(LS, 1, fname.c_str());
10 auto& h = get_host_memory();
11 if(address + sizeof(U) > h.size()) {
12 lua_pushboolean(LS, 0);
13 return 1;
15 U ret = 0;
16 for(size_t i = 0; i < sizeof(U); i++)
17 ret = 256 * ret + static_cast<uint8_t>(h[address + i]);
18 lua_pushnumber(LS, static_cast<S>(ret));
19 return 1;
22 template<typename U, typename S>
23 int do_write(lua_State* LS, const std::string& fname)
25 size_t address = get_numeric_argument<size_t>(LS, 1, fname.c_str());
26 U value = static_cast<U>(get_numeric_argument<S>(LS, 2, fname.c_str()));
27 auto& h = get_host_memory();
28 if(address + sizeof(U) > h.size())
29 h.resize(address + sizeof(U));
30 for(size_t i = sizeof(U) - 1; i < sizeof(U); i--) {
31 h[address + i] = value;
32 value >>= 8;
34 return 0;
37 function_ptr_luafun hm_read("hostmemory.read", [](lua_State* LS, const std::string& fname) -> int {
38 return do_read<uint8_t, uint8_t>(LS, fname);
39 });
41 function_ptr_luafun hm_write("hostmemory.write", [](lua_State* LS, const std::string& fname) -> int {
42 return do_write<uint8_t, uint8_t>(LS, fname);
43 });
45 function_ptr_luafun hm_readb("hostmemory.readbyte", [](lua_State* LS, const std::string& fname) -> int {
46 return do_read<uint8_t, uint8_t>(LS, fname);
47 });
49 function_ptr_luafun hm_writeb("hostmemory.writebyte", [](lua_State* LS, const std::string& fname) -> int {
50 return do_write<uint8_t, uint8_t>(LS, fname);
51 });
53 function_ptr_luafun hm_readsb("hostmemory.readsbyte", [](lua_State* LS, const std::string& fname) -> int {
54 return do_read<uint8_t, int8_t>(LS, fname);
55 });
57 function_ptr_luafun hm_writesb("hostmemory.writesbyte", [](lua_State* LS, const std::string& fname) -> int {
58 return do_write<uint8_t, int8_t>(LS, fname);
59 });
61 function_ptr_luafun hm_readw("hostmemory.readword", [](lua_State* LS, const std::string& fname) -> int {
62 return do_read<uint16_t, uint16_t>(LS, fname);
63 });
65 function_ptr_luafun hm_writew("hostmemory.writeword", [](lua_State* LS, const std::string& fname) -> int {
66 return do_write<uint16_t, uint16_t>(LS, fname);
67 });
69 function_ptr_luafun hm_readsw("hostmemory.readsword", [](lua_State* LS, const std::string& fname) -> int {
70 return do_read<uint16_t, int16_t>(LS, fname);
71 });
73 function_ptr_luafun hm_writesw("hostmemory.writesword", [](lua_State* LS, const std::string& fname) -> int {
74 return do_write<uint16_t, int16_t>(LS, fname);
75 });
77 function_ptr_luafun hm_readd("hostmemory.readdword", [](lua_State* LS, const std::string& fname) -> int {
78 return do_read<uint32_t, uint32_t>(LS, fname);
79 });
81 function_ptr_luafun hm_writed("hostmemory.writedword", [](lua_State* LS, const std::string& fname) -> int {
82 return do_write<uint32_t, uint32_t>(LS, fname);
83 });
85 function_ptr_luafun hm_readsd("hostmemory.readsdword", [](lua_State* LS, const std::string& fname) -> int {
86 return do_read<uint32_t, int32_t>(LS, fname);
87 });
89 function_ptr_luafun hm_writesd("hostmemory.writesdword", [](lua_State* LS, const std::string& fname) -> int {
90 return do_write<uint32_t, int32_t>(LS, fname);
91 });
93 function_ptr_luafun hm_readq("hostmemory.readqword", [](lua_State* LS, const std::string& fname) -> int {
94 return do_read<uint64_t, uint64_t>(LS, fname);
95 });
97 function_ptr_luafun hm_writeq("hostmemory.writeqword", [](lua_State* LS, const std::string& fname) -> int {
98 return do_write<uint64_t, uint64_t>(LS, fname);
99 });
101 function_ptr_luafun hm_readsq("hostmemory.readsqword", [](lua_State* LS, const std::string& fname) -> int {
102 return do_read<uint64_t, int64_t>(LS, fname);
105 function_ptr_luafun hm_writesq("hostmemory.writesqword", [](lua_State* LS, const std::string& fname) -> int {
106 return do_write<uint64_t, int64_t>(LS, fname);