1 #include "interface/disassembler.hpp"
8 template<typename T
, bool be
> T
fetch_generic(std::function
<unsigned char()> fetchpc
)
12 for(size_t i
= 0; i
< b
; i
++) {
13 size_t bit
= 8 * (be
? (b
- i
- 1) : i
);
14 res
|= (static_cast<T
>(fetchpc()) << bit
);
20 disassembler::disassembler(const std::string
& _name
)
22 disasms()[name
= _name
] = this;
25 disassembler::~disassembler()
27 disasms().erase(name
);
30 disassembler
& disassembler::byname(const std::string
& name
)
32 if(disasms().count(name
))
33 return *disasms()[name
];
34 throw std::runtime_error("No such disassembler known");
37 std::set
<std::string
> disassembler::list()
39 std::set
<std::string
> r
;
40 for(auto& i
: disasms())
45 std::map
<std::string
, disassembler
*>& disassembler::disasms()
47 static std::map
<std::string
, disassembler
*> x
;
51 template<> int8_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
53 return fetch_generic
<int8_t, false>(fetchpc
);
56 template<> uint8_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
58 return fetch_generic
<uint8_t, false>(fetchpc
);
61 template<> int16_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
63 return fetch_generic
<int16_t, false>(fetchpc
);
66 template<> uint16_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
68 return fetch_generic
<uint16_t, false>(fetchpc
);
71 template<> int32_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
73 return fetch_generic
<int32_t, false>(fetchpc
);
76 template<> uint32_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
78 return fetch_generic
<uint32_t, false>(fetchpc
);
81 template<> int64_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
83 return fetch_generic
<int64_t, false>(fetchpc
);
86 template<> uint64_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
88 return fetch_generic
<uint64_t, false>(fetchpc
);
91 template<> int8_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
93 return fetch_generic
<int8_t, true>(fetchpc
);
96 template<> uint8_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
98 return fetch_generic
<uint8_t, true>(fetchpc
);
101 template<> int16_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
103 return fetch_generic
<int16_t, true>(fetchpc
);
106 template<> uint16_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
108 return fetch_generic
<uint16_t, true>(fetchpc
);
111 template<> int32_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
113 return fetch_generic
<int32_t, true>(fetchpc
);
116 template<> uint32_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
118 return fetch_generic
<uint32_t, true>(fetchpc
);
121 template<> int64_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
123 return fetch_generic
<int64_t, true>(fetchpc
);
126 template<> uint64_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
128 return fetch_generic
<uint64_t, true>(fetchpc
);