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"
9 #include "core/rom.hpp"
13 int disassemble(lua::state
& L
, lua::parameters
& P
)
18 P(kind
, addr
, P
.optional(count
, 1));
21 d
= &disassembler::byname(kind
);
23 uint64_t laddr
= addr
;
24 for(uint64_t i
= 1; i
<= count
; i
++) {
32 L
.pushstring("disasm");
33 L
.pushlstring(d
->disassemble(laddr
, [&bytes
, laddr
]() -> unsigned char {
34 return CORE().memory
->read
<uint8_t>(laddr
+ bytes
++);
38 std::vector
<unsigned char> tmp
;
40 CORE().memory
->read_range(laddr
, &tmp
[0], bytes
);
41 L
.pushstring("bytes");
42 L
.pushlstring(hex::b_to(&tmp
[0], bytes
));
50 int getregister(lua::state
& L
, lua::parameters
& P
)
57 const interface_device_reg
* regs
= core
.rom
->get_registers();
62 for(size_t i
= 0; regs
[i
].name
; i
++) {
66 L
.pushboolean(regs
[i
].read() != 0);
68 L
.pushnumber(regs
[i
].read());
75 int getregisters(lua::state
& L
, lua::parameters
& P
)
78 const interface_device_reg
* regs
= core
.rom
->get_registers();
84 for(size_t i
= 0; regs
[i
].name
; i
++) {
85 L
.pushlstring(regs
[i
].name
);
87 L
.pushboolean(regs
[i
].read() != 0);
89 L
.pushnumber(regs
[i
].read());
95 int setregister(lua::state
& L
, lua::parameters
& P
)
102 const interface_device_reg
* regs
= core
.rom
->get_registers();
106 for(size_t i
= 0; regs
[i
].name
; i
++) {
107 if(r
!= regs
[i
].name
)
112 regs
[i
].write(P
.arg
<bool>() ? 1 : 0);
114 regs
[i
].write(P
.arg
<uint64_t>());
120 lua::functions
LUA_disasm_fns(lua_func_misc
, "memory", {
121 {"disassemble", disassemble
},
122 {"getregister", getregister
},
123 {"getregisters", getregisters
},
124 {"setregister", setregister
},