1 #include "cmdhelp/disassemble.hpp"
2 #include "core/command.hpp"
3 #include "core/instance.hpp"
4 #include "core/memorymanip.hpp"
5 #include "core/messages.hpp"
6 #include "interface/disassembler.hpp"
7 #include "library/hex.hpp"
8 #include "library/memoryspace.hpp"
9 #include "library/minmax.hpp"
10 #include "library/string.hpp"
25 command::fnptr
<const std::string
&> CMD_disassemble(lsnes_cmds
, CDISASM::d
,
26 [](const std::string
& t
) throw(std::bad_alloc
, std::runtime_error
) {
28 regex_results r
= regex("([^ \t]+)[ \t]+([0-9]+|0x[0-9A-Fa-f]+)([ \t]+([0-9]+))?"
29 "([ \t]+to[ \t]+(.+))?", t
);
31 messages
<< "Syntax: disassemble <kind> <addr> [<count>] [to <filename>]" << std::endl
;
34 std::string kind
= r
[1];
35 uint64_t addr
= parse_value
<uint64_t>(r
[2]);
38 count
= parse_value
<uint64_t>(r
[4]);
42 std::list
<dres
> result
;
45 d
= &disassembler::byname(kind
);
46 } catch(std::exception
& e
) {
47 messages
<< "Can't find such disassembler" << std::endl
;
50 uint64_t laddr
= addr
;
52 for(uint64_t i
= 1; i
<= count
; i
++) {
56 x
.disasm
= d
->disassemble(laddr
, [&core
, &bytes
, laddr
]() -> unsigned char {
57 return core
.memory
->read
<uint8_t>(laddr
+ bytes
++);
61 longest
= max(longest
, bytes
);
64 std::ostream
* strm
= &messages
.getstream();
66 strm
= new std::ofstream(file
);
68 messages
<< "Can't open output file" << std::endl
;
72 for(auto i
: result
) {
73 std::vector
<unsigned char> tmp
;
75 core
.memory
->read_range(i
.addr
, &tmp
[0], i
.len
);
76 std::string l
= hex::to(i
.addr
) + " " + hex::b_to(&tmp
[0], i
.len
) + " " + i
.disasm
;
77 (*strm
) << l
<< std::endl
;