1 #include "interface/disassembler.hpp"
7 template<typename T
, bool be
> T
fetch_generic(std::function
<unsigned char()> fetchpc
)
11 for(size_t i
= 0; i
< b
; i
++) {
12 size_t bit
= 8 * (be
? (b
- i
- 1) : i
);
13 res
|= (static_cast<T
>(fetchpc()) << bit
);
19 disassembler::disassembler(const std::string
& _name
)
21 disasms()[name
= _name
] = this;
24 disassembler::~disassembler()
26 disasms().erase(name
);
29 disassembler
& disassembler::byname(const std::string
& name
)
31 if(disasms().count(name
))
32 return *disasms()[name
];
33 throw std::runtime_error("No such disassembler known");
36 std::set
<std::string
> disassembler::list()
38 std::set
<std::string
> r
;
39 for(auto& i
: disasms())
44 std::map
<std::string
, disassembler
*>& disassembler::disasms()
46 static std::map
<std::string
, disassembler
*> x
;
50 template<> int8_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
52 return fetch_generic
<int8_t, false>(fetchpc
);
55 template<> uint8_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
57 return fetch_generic
<uint8_t, false>(fetchpc
);
60 template<> int16_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
62 return fetch_generic
<int16_t, false>(fetchpc
);
65 template<> uint16_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
67 return fetch_generic
<uint16_t, false>(fetchpc
);
70 template<> int32_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
72 return fetch_generic
<int32_t, false>(fetchpc
);
75 template<> uint32_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
77 return fetch_generic
<uint32_t, false>(fetchpc
);
80 template<> int64_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
82 return fetch_generic
<int64_t, false>(fetchpc
);
85 template<> uint64_t disassembler::fetch_le(std::function
<unsigned char()> fetchpc
)
87 return fetch_generic
<uint64_t, false>(fetchpc
);
90 template<> int8_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
92 return fetch_generic
<int8_t, true>(fetchpc
);
95 template<> uint8_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
97 return fetch_generic
<uint8_t, true>(fetchpc
);
100 template<> int16_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
102 return fetch_generic
<int16_t, true>(fetchpc
);
105 template<> uint16_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
107 return fetch_generic
<uint16_t, true>(fetchpc
);
110 template<> int32_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
112 return fetch_generic
<int32_t, true>(fetchpc
);
115 template<> uint32_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
117 return fetch_generic
<uint32_t, true>(fetchpc
);
120 template<> int64_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
122 return fetch_generic
<int64_t, true>(fetchpc
);
125 template<> uint64_t disassembler::fetch_be(std::function
<unsigned char()> fetchpc
)
127 return fetch_generic
<uint64_t, true>(fetchpc
);