1 #include "core/lua-int.hpp"
2 #include "core/moviedata.hpp"
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);
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
));
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
;
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);