lsnes rr2-β24
[lsnes.git] / src / interface / disassembler.cpp
blob53883f1d999a9976ae9a78eb8c0291bbbe6b4cf1
1 #include "interface/disassembler.hpp"
2 #include <functional>
3 #include <stdexcept>
4 #include <iostream>
6 namespace
8 template<typename T, bool be> T fetch_generic(std::function<unsigned char()> fetchpc)
10 size_t b = sizeof(T);
11 T res = 0;
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);
16 return res;
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())
41 r.insert(i.first);
42 return r;
45 std::map<std::string, disassembler*>& disassembler::disasms()
47 static std::map<std::string, disassembler*> x;
48 return 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);