lsnes rr2-β24
[lsnes.git] / src / lua / disassemble.cpp
blob74201d0ad5d1c6b03c0252ef4b1b12c139537a2b
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"
11 namespace
13 int disassemble(lua::state& L, lua::parameters& P)
15 std::string kind;
16 uint64_t addr, count;
18 P(kind, addr, P.optional(count, 1));
20 disassembler* d;
21 d = &disassembler::byname(kind);
22 L.newtable();
23 uint64_t laddr = addr;
24 for(uint64_t i = 1; i <= count; i++) {
25 uint64_t bytes = 0;
26 L.pushnumber(i);
27 L.newtable();
28 L.pushstring("addr");
29 L.pushnumber(laddr);
30 L.settable(-3);
32 L.pushstring("disasm");
33 L.pushlstring(d->disassemble(laddr, [&bytes, laddr]() -> unsigned char {
34 return CORE().memory->read<uint8_t>(laddr + bytes++);
35 }));
36 L.settable(-3);
38 std::vector<unsigned char> tmp;
39 tmp.resize(bytes);
40 CORE().memory->read_range(laddr, &tmp[0], bytes);
41 L.pushstring("bytes");
42 L.pushlstring(hex::b_to(&tmp[0], bytes));
43 L.settable(-3);
44 L.settable(-3);
45 laddr += bytes;
47 return 1;
50 int getregister(lua::state& L, lua::parameters& P)
52 auto& core = CORE();
53 std::string r;
55 P(r);
57 const interface_device_reg* regs = core.rom->get_registers();
58 if(!regs) {
59 L.pushnil();
60 return 1;
62 for(size_t i = 0; regs[i].name; i++) {
63 if(r != regs[i].name)
64 continue;
65 if(regs[i].boolean)
66 L.pushboolean(regs[i].read() != 0);
67 else
68 L.pushnumber(regs[i].read());
69 return 1;
71 L.pushnil();
72 return 1;
75 int getregisters(lua::state& L, lua::parameters& P)
77 auto& core = CORE();
78 const interface_device_reg* regs = core.rom->get_registers();
79 if(!regs) {
80 L.pushnil();
81 return 1;
83 L.newtable();
84 for(size_t i = 0; regs[i].name; i++) {
85 L.pushlstring(regs[i].name);
86 if(regs[i].boolean)
87 L.pushboolean(regs[i].read() != 0);
88 else
89 L.pushnumber(regs[i].read());
90 L.settable(-3);
92 return 1;
95 int setregister(lua::state& L, lua::parameters& P)
97 auto& core = CORE();
98 std::string r;
100 P(r);
102 const interface_device_reg* regs = core.rom->get_registers();
103 if(!regs) {
104 return 0;
106 for(size_t i = 0; regs[i].name; i++) {
107 if(r != regs[i].name)
108 continue;
109 if(!regs[i].write)
110 break;
111 if(regs[i].boolean)
112 regs[i].write(P.arg<bool>() ? 1 : 0);
113 else
114 regs[i].write(P.arg<uint64_t>());
115 return 0;
117 return 0;
120 lua::functions LUA_disasm_fns(lua_func_misc, "memory", {
121 {"disassemble", disassemble},
122 {"getregister", getregister},
123 {"getregisters", getregisters},
124 {"setregister", setregister},