Cleanup lua code by introducing lua::functions
[lsnes.git] / src / lua / disassemble.cpp
blob4c7ca0d5b4823f5b8fed868dc7348a4f0265b6da
1 #include "lua/internal.hpp"
2 #include "interface/disassembler.hpp"
3 #include "interface/romtype.hpp"
4 #include "library/hex.hpp"
5 #include "core/memorymanip.hpp"
6 #include "core/moviedata.hpp"
8 namespace
10 int disassemble(lua::state& L, lua::parameters& P)
12 std::string kind;
13 uint64_t addr, count;
15 P(kind, addr, P.optional(count, 1));
17 disassembler* d;
18 d = &disassembler::byname(kind);
19 L.newtable();
20 uint64_t laddr = addr;
21 for(uint64_t i = 1; i <= count; i++) {
22 uint64_t bytes = 0;
23 L.pushnumber(i);
24 L.newtable();
25 L.pushstring("addr");
26 L.pushnumber(laddr);
27 L.settable(-3);
29 L.pushstring("disasm");
30 L.pushlstring(d->disassemble(laddr, [&bytes, laddr]() -> unsigned char {
31 return lsnes_memory.read<uint8_t>(laddr + bytes++);
32 }));
33 L.settable(-3);
35 std::vector<unsigned char> tmp;
36 tmp.resize(bytes);
37 lsnes_memory.read_range(laddr, &tmp[0], bytes);
38 L.pushstring("bytes");
39 L.pushlstring(hex::b_to(&tmp[0], bytes));
40 L.settable(-3);
41 L.settable(-3);
42 laddr += bytes;
44 return 1;
47 int getregister(lua::state& L, lua::parameters& P)
49 std::string r;
51 P(r);
53 const interface_device_reg* regs = our_rom.rtype->get_registers();
54 if(!regs) {
55 L.pushnil();
56 return 1;
58 for(size_t i = 0; regs[i].name; i++) {
59 if(r != regs[i].name)
60 continue;
61 if(regs[i].boolean)
62 L.pushboolean(regs[i].read() != 0);
63 else
64 L.pushnumber(regs[i].read());
65 return 1;
67 L.pushnil();
68 return 1;
71 int setregister(lua::state& L, lua::parameters& P)
73 std::string r;
75 P(r);
77 const interface_device_reg* regs = our_rom.rtype->get_registers();
78 if(!regs) {
79 return 0;
81 for(size_t i = 0; regs[i].name; i++) {
82 if(r != regs[i].name)
83 continue;
84 if(!regs[i].write)
85 break;
86 if(regs[i].boolean)
87 regs[i].write(P.arg<bool>() ? 1 : 0);
88 else
89 regs[i].write(P.arg<uint64_t>());
90 return 0;
92 return 0;
95 lua::functions disasm_fns(lua_func_misc, "memory", {
96 {"disassemble", disassemble},
97 {"getregister", getregister},
98 {"setregister", setregister},
99 });