1 #include "core/command.hpp"
2 #include "interface/disassembler.hpp"
3 #include "library/hex.hpp"
4 #include "library/minmax.hpp"
5 #include "core/memorymanip.hpp"
6 #include "core/window.hpp"
7 #include "library/string.hpp"
21 command::fnptr
<const std::string
&> disassemble(lsnes_cmd
, "disassemble", "Disassemble code",
22 "Syntax: disassemble <kind> <addr> [<count>] [to <filename>]\nDisassemble code\n",
23 [](const std::string
& t
) throw(std::bad_alloc
, std::runtime_error
) {
24 regex_results r
= regex("([^ \t]+)[ \t]+([0-9]+|0x[0-9A-Fa-f]+)([ \t]+([0-9]+))?"
25 "([ \t]+to[ \t]+(.+))?", t
);
27 messages
<< "Syntax: disassemble <kind> <addr> [<count>] [to <filename>]" << std::endl
;
30 std::string kind
= r
[1];
31 uint64_t addr
= parse_value
<uint64_t>(r
[2]);
34 count
= parse_value
<uint64_t>(r
[4]);
38 std::list
<dres
> result
;
41 d
= &disassembler::byname(kind
);
42 } catch(std::exception
& e
) {
43 messages
<< "Can't find such disassembler" << std::endl
;
46 uint64_t laddr
= addr
;
48 for(uint64_t i
= 1; i
<= count
; i
++) {
52 x
.disasm
= d
->disassemble(laddr
, [&bytes
, laddr
]() -> unsigned char {
53 return lsnes_memory
.read
<uint8_t>(laddr
+ bytes
++);
57 longest
= max(longest
, bytes
);
60 std::ostream
* strm
= &messages
.getstream();
62 strm
= new std::ofstream(file
);
64 messages
<< "Can't open output file" << std::endl
;
68 for(auto i
: result
) {
69 std::vector
<unsigned char> tmp
;
71 lsnes_memory
.read_range(i
.addr
, &tmp
[0], i
.len
);
72 std::string l
= hex::to(i
.addr
) + " " + hex::b_to(&tmp
[0], i
.len
) + " " + i
.disasm
;
73 (*strm
) << l
<< std::endl
;