1 #include "lua/internal.hpp"
2 #include "interface/disassembler.hpp"
3 #include "interface/romtype.hpp"
4 #include "library/hex.hpp"
5 #include "library/memoryspace.hpp"
6 #include "core/instance.hpp"
7 #include "core/memorymanip.hpp"
8 #include "core/moviedata.hpp"
12 int disassemble(lua::state
& L
, lua::parameters
& P
)
17 P(kind
, addr
, P
.optional(count
, 1));
20 d
= &disassembler::byname(kind
);
22 uint64_t laddr
= addr
;
23 for(uint64_t i
= 1; i
<= count
; i
++) {
31 L
.pushstring("disasm");
32 L
.pushlstring(d
->disassemble(laddr
, [&bytes
, laddr
]() -> unsigned char {
33 return CORE().memory
->read
<uint8_t>(laddr
+ bytes
++);
37 std::vector
<unsigned char> tmp
;
39 CORE().memory
->read_range(laddr
, &tmp
[0], bytes
);
40 L
.pushstring("bytes");
41 L
.pushlstring(hex::b_to(&tmp
[0], bytes
));
49 int getregister(lua::state
& L
, lua::parameters
& P
)
56 const interface_device_reg
* regs
= core
.rom
->rtype
->get_registers();
61 for(size_t i
= 0; regs
[i
].name
; i
++) {
65 L
.pushboolean(regs
[i
].read() != 0);
67 L
.pushnumber(regs
[i
].read());
74 int getregisters(lua::state
& L
, lua::parameters
& P
)
77 const interface_device_reg
* regs
= core
.rom
->rtype
->get_registers();
83 for(size_t i
= 0; regs
[i
].name
; i
++) {
84 L
.pushlstring(regs
[i
].name
);
86 L
.pushboolean(regs
[i
].read() != 0);
88 L
.pushnumber(regs
[i
].read());
94 int setregister(lua::state
& L
, lua::parameters
& P
)
101 const interface_device_reg
* regs
= core
.rom
->rtype
->get_registers();
105 for(size_t i
= 0; regs
[i
].name
; i
++) {
106 if(r
!= regs
[i
].name
)
111 regs
[i
].write(P
.arg
<bool>() ? 1 : 0);
113 regs
[i
].write(P
.arg
<uint64_t>());
119 lua::functions
LUA_disasm_fns(lua_func_misc
, "memory", {
120 {"disassemble", disassemble
},
121 {"getregister", getregister
},
122 {"getregisters", getregisters
},
123 {"setregister", setregister
},